AspClassic — Classic ASP language support for Visual Studio 2026
Visual Studio 2026 does not recognize .asp as a language. The file opens, but it comes up practically dead: no block folding, no pair highlighting, no completion, no go-to-definition. AspClassic gives classic ASP an editor that understands what it is reading, without asking you to rewrite a line of legacy code.
Before — VS 2026 on an unedited .asp file, with only what the IDE ships:

After — the same file, unchanged, with AspClassicSyntaxHighlight loaded:

The problem
What Visual Studio offers .asp files today is the legacy WebForms colorizer, which paints <% %> and nothing else. The real pain sits in the two thirds of the file that is VBScript. Measured across 30 real files, the composition looks like this:
| Content |
Share of lines |
VBScript inside <% %> |
66.9% |
| Client-side JavaScript |
20.9% |
| HTML |
10.4% |
| CSS |
1.8% |
Rewriting the legacy is not on the table. This extension exists to make the editor usable over code that is already in
production.
What it does
| Feature |
How |
Where |
| TextMate coloring |
Grammar + language-configuration |
AspClassic.Vsix/Grammars/ |
| Native semantic coloring |
Projection classifier + color formats anchored to the legacy type |
AspClassic.Vsix/Coloring/ |
| Block folding |
If/Sub/Function/Class/Property/For/Do/While/Select Case/With, crossing <% %>; JavaScript by braces |
AspClassic.Vsix/Outlining/, AspClassic.Core/Structure/ |
| Pair highlighting |
Innermost VBScript block under the cursor, plus <% %> and " |
AspClassic.Vsix/PairHighlight/, AspClassic.Core/PairFinding/ |
| Structure guides |
Vertical block lines in the editor |
AspClassic.Vsix/Structure/ |
| IntelliSense |
Completion, QuickInfo (hover) and signature help |
AspClassic.Vsix/IntelliSense/ |
| Ctrl+Click / Go To Definition |
Navigates to symbol definitions with Ctrl+Click or the Go To Definition command |
AspClassic.Vsix/IntelliSense/AspCtrlClickMouseProcessor.cs, Commands/GoToDefinition.vsct |
<!--#include file="..."--> |
Recursive resolution (depth cap 8, cycle guard, file= only), consumed by definition and hover |
AspClassic.Core/Declarations/ |
| Unresolved-include notice |
Hovering the directive tells you whether it resolved and, if not, why: not found, rooted, over 1 MB, unreadable or invalid path |
AspClassic.Vsix/IntelliSense/AspQuickInfoSource.cs |
Design goals
- Work with the editor, not against it. The extension adds to what Visual Studio already does rather than replacing it. Where the host already delivers (HTML color, folding of HTML elements), the extension stays out, so
behavior follows your theme and does not brees.
- One analysis, several views. The lexer runs once per buffer and feeds color, folding, pairs, structure and IntelliSense. There is no scanner per feature.
- **Logic that does not need the IDE lives oer, classifier, pairs, folding and includeresolution live in
AspClassic.Core, which does not reference the Visual Studio SDK. That is why they are testable
with dotnet test, without opening Visual S208 tests live.
- Fail by omission, never by excess. A malformed file must not produce an exception or an absurd region. When in doubt, the extension stays quiet.
- Measure before deciding. Every scope decision carries the number that supported it (corpus composition, cost in ms, priority in the format map), recorded in the plan.
What is deliberately out, and why
- HTML and JavaScript color, and HTML folding. The Visual Studio editor already does both. Implementing them would mean replacing the host's color and paying tst class by class, only to swap theme-awarecolors for fixed ones. JavaScript folding by braces stays, because that is what the host does not do.
- An LSP server. IntelliSense is native ops Node, the process handshake and a serverto maintain. The only real asset in the reference extensions was the data, which came in as an embedded C# table.
- Debugging, refactoring and error validation. Out of scope. In particular, there is no squiggle for unresolved includes: in the real code measured, 185 of 193 directives point at files that do not exist on disk, and marking them all would paint the screen red over data only the IIS server has.
Feedback
Found a classic ASP file that confuses the editor? Open an issue with a minimal sample. The extension is built to stay quiet when unsure, so a missing feature on ad of case worth reporting.
| |