blob: be096260096592813d554c49f22cddbc52628c89 [file]
.. _module-pw_ide-contributing-development:
===========
Development
===========
.. pigweed-module-subpage::
:name: pw_ide
This guide covers how to set up a development environment to build, run, and
debug the Pigweed Visual Studio Code extension.
The extension is written in TypeScript and bundled using webpack. It uses
standard Node.js tooling (``npm``) for development, not the main Pigweed build
systems (Bazel, GN). While there are Bazel build files for integration purposes,
you will not use them for active development.
-------------
Prerequisites
-------------
- `Node.js <https://nodejs.org/>`_ (which includes ``npm``)
- `Visual Studio Code <https://code.visualstudio.com/>`_
-----
Setup
-----
The development workflow for the Pigweed VSCode extension is self-contained
within its source directory.
1. **Open the Extension Directory in VSCode**
For the best experience, you should open the extension's specific directory
in VSCode, not the root of the Pigweed repository. This ensures that VSCode
loads the correct settings and launch configurations for the extension.
Open the following directory in VSCode:
.. code-block:: shell
<pigweed-repo-root>/pw_ide/ts/pigweed_vscode
2. **Install Recommended Extensions**
When you open the directory, VSCode may prompt you to install recommended
extensions. Please do so, as they provide essential tooling for TypeScript
development and for matching the project's code style.
One of the key recommended extensions is the
`TypeScript + Webpack Problem Matchers
<https://marketplace.visualstudio.com/items?itemName=amodio.tsl-problem-matcher>`_.
**This is required for the build and debug process to work correctly.**
3. **Install Dependencies**
Open a terminal within VSCode (**View > Terminal**) and install the required
``npm`` packages (if using external terminal, ``cd pw_ide/ts/pigweed_vscode``
first):
.. code-block:: shell
npm install
----------------------------------
Building and Running the Extension
----------------------------------
The most effective way to work on the extension is to use the provided launch
configuration, which handles building, bundling, and launching a new VSCode
instance for testing.
1. **Open the Run and Debug View**
In the Activity Bar on the left side of the VSCode window, click the "Run and
Debug" icon (it looks like a play button with a bug).
2. **Start the "Run Extension" Configuration**
At the top of the "Run and Debug" panel, you will see a dropdown menu.
Select **Run Extension** from the list and press the green play button (or
press **F5**).
This command will:
- Compile the TypeScript code.
- Start a webpack watcher that will automatically rebuild the extension
whenever you save a file.
- Launch a new VSCode window called the **Extension Development Host**. This
window has your development version of the Pigweed extension installed.
3. **Verify the Extension is Running**
In the **Extension Development Host** window, you can verify that your
extension is running by opening the Command Palette (``Cmd+Shift+P`` or
``Ctrl+Shift+P``) and typing "Pigweed". You should see the commands
contributed by the extension, like "Pigweed: Open Output Panel".
---------
Debugging
---------
You can set breakpoints directly in your TypeScript source code in your main
VSCode window. When you perform an action in the **Extension Development Host**
window that triggers that code, the debugger will pause, and you can inspect
variables and step through the code.
---------------
Troubleshooting
---------------
"Command is already registered" errors on reload
================================================
When using the **Developer: Reload Window** command in the Extension
Development Host, you may encounter errors in the debug console like:
.. code-block:: text
Error: command 'pigweed.file-bug' already exists
This happens because VSCode's reload functionality does not always fully clean
up the state from the previous activation, especially for commands and
configuration properties defined in ``package.json``. When the extension
activates again, it tries to re-register these, causing a conflict.
The most reliable way to test changes is to completely restart the Extension
Development Host session:
1. Stop the "Run Extension" task in your main VSCode window (the red square).
2. Relaunch it by pressing **F5**.
This ensures a clean environment for each run. While **Reload Window** can be
faster, it's prone to these state-related issues.
"The task 'npm: watch:bundle' has not exited and doesn't have a 'problemMatcher' defined."
==========================================================================================
This error occurs if the **TypeScript + Webpack Problem Matchers** extension is
not installed or enabled. The project's ``.vscode/tasks.json`` file is
configured to use a problem matcher from this extension (``$ts-webpack-watch``)
to correctly parse build output.
To fix this:
1. Go to the **Extensions** view in VSCode.
2. Search for ``@recommended`` to see workspace recommendations.
3. Find **TypeScript + Webpack Problem Matchers** and ensure it is installed
and enabled.
4. Restart VSCode and try launching the extension again.
-------
Testing
-------
The extension has both unit and end-to-end tests. You can run these from the
command line in the ``pw_ide/ts/pigweed_vscode`` directory after bootstrapping
(``. ./bootstrap.sh`` in the Pigweed root):
Unit Tests
==========
.. code-block:: shell
npm run test:unit
End-to-End Tests
================
.. code-block:: shell
npm run test:e2e
All Tests
=========
.. code-block:: shell
npm run test:all
-----------------------
Packaging the Extension
-----------------------
To create a ``.vsix`` package file for distribution, run the following command:
.. code-block:: shell
npm run package
This will generate a file like ``pigweed-1.3.3.vsix`` in the current directory.