Overview
The vscode.languages namespace provides functions to register language features like code completion, hover information, diagnostics, and more. These are the APIs that power IntelliSense.
Language Feature Providers
registerCompletionItemProvider
Register a completion provider for IntelliSense suggestions.
function registerCompletionItemProvider (
selector : DocumentSelector ,
provider : CompletionItemProvider ,
... triggerCharacters : string []
) : Disposable
Document selector to identify which documents the provider applies to
provider
CompletionItemProvider
required
The completion provider object
Characters that trigger completion automatically (e.g., ’.’, ’>’)
Example:
import * as vscode from 'vscode' ;
const provider : vscode . CompletionItemProvider = {
provideCompletionItems (
document : vscode . TextDocument ,
position : vscode . Position
) {
const linePrefix = document
. lineAt ( position )
. text . substr ( 0 , position . character );
if ( ! linePrefix . endsWith ( 'console.' )) {
return undefined ;
}
return [
new vscode . CompletionItem ( 'log' , vscode . CompletionItemKind . Method ),
new vscode . CompletionItem ( 'warn' , vscode . CompletionItemKind . Method ),
new vscode . CompletionItem ( 'error' , vscode . CompletionItemKind . Method ),
];
}
};
vscode . languages . registerCompletionItemProvider (
'javascript' ,
provider ,
'.' // Trigger character
);
registerHoverProvider
Register a hover provider to show information when hovering over code.
function registerHoverProvider (
selector : DocumentSelector ,
provider : HoverProvider
) : Disposable
Example:
const hoverProvider : vscode . HoverProvider = {
provideHover ( document , position , token ) {
const range = document . getWordRangeAtPosition ( position );
const word = document . getText ( range );
return new vscode . Hover ([
`** ${ word } **` ,
'Documentation for this symbol'
]);
}
};
vscode . languages . registerHoverProvider ( 'javascript' , hoverProvider );
registerDefinitionProvider
Register a definition provider for “Go to Definition” functionality.
function registerDefinitionProvider (
selector : DocumentSelector ,
provider : DefinitionProvider
) : Disposable
Example:
const definitionProvider : vscode . DefinitionProvider = {
provideDefinition ( document , position , token ) {
const range = document . getWordRangeAtPosition ( position );
const word = document . getText ( range );
// Find definition location
const definitionUri = vscode . Uri . file ( '/path/to/definition.ts' );
const definitionPosition = new vscode . Position ( 10 , 5 );
return new vscode . Location ( definitionUri , definitionPosition );
}
};
vscode . languages . registerDefinitionProvider ( 'typescript' , definitionProvider );
registerCodeActionsProvider
Register a code actions provider for quick fixes and refactorings.
function registerCodeActionsProvider (
selector : DocumentSelector ,
provider : CodeActionProvider ,
metadata ?: CodeActionProviderMetadata
) : Disposable
Example:
const codeActionProvider : vscode . CodeActionProvider = {
provideCodeActions ( document , range , context , token ) {
const quickFix = new vscode . CodeAction (
'Convert to const' ,
vscode . CodeActionKind . QuickFix
);
quickFix . edit = new vscode . WorkspaceEdit ();
quickFix . edit . replace (
document . uri ,
range ,
'const'
);
return [ quickFix ];
}
};
vscode . languages . registerCodeActionsProvider (
'javascript' ,
codeActionProvider ,
{
providedCodeActionKinds: [ vscode . CodeActionKind . QuickFix ]
}
);
Diagnostics
createDiagnosticCollection
Create a diagnostic collection to report problems.
function createDiagnosticCollection (
name ?: string
) : DiagnosticCollection
Example:
const diagnostics = vscode . languages . createDiagnosticCollection ( 'myLinter' );
function updateDiagnostics ( document : vscode . TextDocument ) {
const diagnosticsList : vscode . Diagnostic [] = [];
for ( let i = 0 ; i < document . lineCount ; i ++ ) {
const line = document . lineAt ( i );
if ( line . text . includes ( 'TODO' )) {
const diagnostic = new vscode . Diagnostic (
line . range ,
'TODO found' ,
vscode . DiagnosticSeverity . Information
);
diagnosticsList . push ( diagnostic );
}
}
diagnostics . set ( document . uri , diagnosticsList );
}
vscode . workspace . onDidChangeTextDocument ( e => {
updateDiagnostics ( e . document );
});
Document Symbols
registerDocumentSymbolProvider
Register a document symbol provider for outline view.
function registerDocumentSymbolProvider (
selector : DocumentSelector ,
provider : DocumentSymbolProvider ,
metaData ?: DocumentSymbolProviderMetadata
) : Disposable
Example:
const symbolProvider : vscode . DocumentSymbolProvider = {
provideDocumentSymbols ( document , token ) {
const symbols : vscode . DocumentSymbol [] = [];
for ( let i = 0 ; i < document . lineCount ; i ++ ) {
const line = document . lineAt ( i );
const match = line . text . match ( /function \s + ( \w + ) / );
if ( match ) {
const symbol = new vscode . DocumentSymbol (
match [ 1 ],
'Function' ,
vscode . SymbolKind . Function ,
line . range ,
line . range
);
symbols . push ( symbol );
}
}
return symbols ;
}
};
vscode . languages . registerDocumentSymbolProvider (
'javascript' ,
symbolProvider
);
Register a document formatter.
function registerDocumentFormattingEditProvider (
selector : DocumentSelector ,
provider : DocumentFormattingEditProvider
) : Disposable
Example:
const formattingProvider : vscode . DocumentFormattingEditProvider = {
provideDocumentFormattingEdits ( document , options , token ) {
const edits : vscode . TextEdit [] = [];
// Format entire document
const firstLine = document . lineAt ( 0 );
const lastLine = document . lineAt ( document . lineCount - 1 );
const range = new vscode . Range ( firstLine . range . start , lastLine . range . end );
const formatted = formatCode ( document . getText ());
edits . push ( vscode . TextEdit . replace ( range , formatted ));
return edits ;
}
};
vscode . languages . registerDocumentFormattingEditProvider (
'javascript' ,
formattingProvider
);
Language Configuration
setLanguageConfiguration
Set language-specific configuration.
function setLanguageConfiguration (
language : string ,
configuration : LanguageConfiguration
) : Disposable
Example:
vscode . languages . setLanguageConfiguration ( 'myLanguage' , {
comments: {
lineComment: '//' ,
blockComment: [ '/*' , '*/' ]
},
brackets: [
[ '{' , '}' ],
[ '[' , ']' ],
[ '(' , ')' ]
],
autoClosingPairs: [
{ open: '{' , close: '}' },
{ open: '[' , close: ']' },
{ open: '(' , close: ')' },
{ open: '"' , close: '"' },
],
wordPattern: / ( - ? \d * \. \d\w * ) | ( [ ^ \`\~\!\@\#\%\^\&\*\(\) \- \=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\? \s ] + ) / g
});
Other Providers
registerReferenceProvider - Find all references to a symbol
registerRenameProvider - Rename symbols across files
Document Highlight Provider
registerDocumentHighlightProvider - Highlight occurrences of a symbol
registerSignatureHelpProvider - Show function signature help
registerCodeLensProvider - Show actionable contextual information
Best Practices
Return Quickly Language providers should return results quickly to avoid blocking the UI
Use Cancellation Tokens Check cancellation tokens to abort long-running operations
Dispose Resources Always dispose diagnostic collections and provider registrations
Cache Results Cache expensive computations and invalidate on document changes
Language Providers Guide Learn more about implementing language features