* debug: Fix UI freezing on "continue" with high number of threads
This fixes a performance regression accidentally introduced in #265755.
Before that change, if the `continued` event had `allThreadsContinued` set,
then we'd call `this.model.clearThreads()` passing `undefined` as `threadId`,
which would update all threads in one pass. After that change, a call to
`this.model.clearThreads()` would be done for each thread.
Because each call to `this.model.clearThreads()` ends up calling
`this._onDidChangeCallStack.fire()`, we end up with quadratic overhead
as some of the handlers traverse all threads in the call-stack box.
This would lead to minute long freezes when using the Erlang debugger,
to debug a system with ~20K Erlang processes.
We now debounce the calls to `_onDidChangeCallStack.fire()` to avoid
the issue.
* debug: Avoid cancelling too many scheduled actions when clearing threads
When calling `clearThreads()` on the model, we'd cancel every scheduled
action, for every session, instead of those relevant only for the
given session and, optionally, thread.
* fixup! debug: Fix UI freezing on "continue" with high number of threads
* Initial plan
* Add source filter syntax for Problems panel
Co-authored-by: sandy081 <10746682+sandy081@users.noreply.github.com>
* Add @ext:extensionId filter syntax
Support filtering markers by extension ID using @ext:extensionId syntax.
This filters by the marker.owner field which contains the extension ID.
Examples:
- @ext:vscode.typescript - Filter TypeScript extension markers
- @ext:dbaeumer.vscode-eslint - Filter ESLint extension markers
- @ext:pub.ext, error - Combine with text filter
The extension filter works alongside the existing source filter:
- @ext:pub.ext - Filters by extension ID (marker.owner)
- source:ts or @ts - Filters by source name (marker.source)
Co-authored-by: sandy081 <10746682+sandy081@users.noreply.github.com>
* Simplify filter to only support source: format
Per feedback, removed support for:
- @name shorthand (e.g., @ts, @eslint)
- @ext:extensionId format for extension filtering
Now only supports:
- source:name format (e.g., source:eslint, source:ts)
This simplifies the implementation and focuses on the core
source filtering functionality.
Co-authored-by: sandy081 <10746682+sandy081@users.noreply.github.com>
* Change filter format to @source: with negation support
Updated filter syntax per feedback:
- Changed from source:name to @source:name format
- Added negation support with -@source:name
- sourceFilter is now an object with text and negate properties
- Updated filter logic in tree and table views to handle negation
- Updated placeholder text to show examples: @source:eslint, -@source:ts
- Updated all tests to use new format and test negation
Examples:
- @source:eslint - Show only eslint markers
- -@source:ts - Exclude TypeScript markers
- @source:ts, error - TypeScript markers with "error" text
Co-authored-by: sandy081 <10746682+sandy081@users.noreply.github.com>
* Add OR and AND logic for source filters
Support comma-separated sources for OR logic within a filter and multiple @source: filters for AND logic between filters.
Examples:
- @source:eslint,ts - Match eslint OR ts (OR logic)
- @source:eslint @source:error - Match markers where source contains both "eslint" AND "error" substrings (AND logic)
- @source:eslint,ts @source:warn - Match (eslint OR ts) AND warn
- -@source:ts @source:error - Exclude ts AND must contain error
The sourceFilter property is now sourceFilters (array) to support multiple filters.
Each filter has a sources array (for OR logic) and a negate flag.
Co-authored-by: sandy081 <10746682+sandy081@users.noreply.github.com>
* Extract source filtering logic into common method
Refactored duplicated source filter checking logic from markersTreeViewer and markersTable into a common matchesSourceFilters() method in FilterOptions class.
Benefits:
- Reduces code duplication (~68 lines removed)
- Single source of truth for source filtering logic
- Easier to maintain and test
- Consistent behavior between tree and table views
The matchesSourceFilters() method:
- Takes markerSource as parameter
- Returns true if marker passes all source filters
- Implements AND logic between filters
- Implements OR logic within filter sources
- Handles negation correctly
Co-authored-by: sandy081 <10746682+sandy081@users.noreply.github.com>
* simplify filter
* update placeholder
* change syntx
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sandy081 <10746682+sandy081@users.noreply.github.com>
Co-authored-by: Sandeep Somavarapu <sasomava@microsoft.com>
* chat: fix ChatCheckpointFileChangesSummaryContentPart showing 0/0
The diff for changed files was getting recreated for each compututation
and immediately read(), so it never actually loaded diffs in.
Fixed this and simplified the rendering.
Closes#279868
* cleanup lint