Description
(edit: see here for a more recent proposal. Original proposal below)
Problem
ES Lint, TS Lint, and other extensions have the concept of auto fix on save. On save, this goes through the errors file and fixes all simple ones, such as removing tailing whitespace or converting { x: string } to Array<{ x: string }>. This functionality is quite useful but is currently implemented per extension. It would be nice if we could:
- Control auto fix on save with a single setting.
- Indicate auto fixes in the code action context menu (since these are usually the preferred fixes)
- Bind auto fix to a keyboard shortcut
Related
Many extensions implement a fix all of this type code action / quick fix. This can be viewed as a special case of auto fix on save where the candidate fixes are only of a single type.
Sketches
(Note that the sketch below record some of the options being considered for this API. They are not yet concrete proposals)
Do nothing
Keep things as is. Let extensions handle this all individually
Benefits
- No work! (unless we maybe try to establish some sort of convention for extensions to follow)
Drawbacks
- Many different ways of implementing the same thing
- Cannot bring auto fix or fix all into UI in a consistent way
- Cannot support things that require standardization, such as keybindings or commands
CodeAction.autoFixable
Add an autoFixable flag to CodeAction
class CodeAction {
...
autoFixable?: boolean;
}Use this flag to determine which code actions should be applied on save.
Introduce a editor.autoFixOnSave setting to enable or disable auto fix on save
Implementing auto fix on save
- For every diagnostic in a file
- Request all code actions for that diagnostic.
- If there are is only one code action marked
autoFixablein the set, then apply that code action
Implementing auto fix all errors of type X
- Assuming we have UI that shows a
auto fix all errors of type Xsuggestion . - For each diagnostic of type
Xin the file, request code actions. - Filter to only those that
CodeAction.diagnosticsset to include the diagnostic of typeX. - Then, if we only have one code action left for that diagnostic, apply it.
Maybe autoFixable here should actually be an array of diagnostics? Would that help with filtering.
Benefits
- Theoretically this lets us address all requirements (perhaps with a few api tweaks)
Drawbacks / Open questions
- Supper chatty api
- Not easy to handle recursive or overlapping fixes
CodeActionKind.SourceAutoFix
Add a new code action kind called source.autoFix. Update extensions to return a source code action that fixes all auto fixable errors in the file.
Use "editor.sourceActionsOnSave": ["source.autoFix"] to apply code actions on save
Implementing auto fix on save
Basically no work on VS Code side. Get extensions to adopt this new API.
Implementing auto fix all errors of type X
We could do something like have multiple source code actions for autofix, such as:
source.autoFix.123source.autoFix.456
This may gets confusing though since requesting the code actions for source.autoFix would end up including the source code actions of source.autoFix.123 and source.autoFix.456 unless the extension is smart. Maybe we'd have to have a source.autoFix.all to prevent this for the autofix on save case? Or perhaps it doesn't matter? If editor.sourceActionsOnSave applies all actions of source.autoFix, presumably applying source.autoFix.123 and source.autoFix.456 should work?
Benefits
- Easy to implement
- Allows extensions to compute a batch of edits
"editor.sourceActionsOnSave": ["source.autoFix"]
Drawbacks / Open questions
- What happens if multiple extensions contribute
fix allactions? With current proposal, the source code menu would just show anfix allaction for each extension. Would be nice if we just have one entry (autofix on save may still work though, at least as long as the fixes don't overlap) - Can we actually implement
auto fix all errors of type X? - Is there any standard way to surface
autofixin the UI with this proposal?

Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.

Activity