Monaco supports registering an own completion provider. This is a per-language registration, but applies to all editor instances. Call languages.registerCompletionItemProvider with an instance of your provider.
The provider class itself is pretty simply. Something like:
export class CodeCompletionProvider implements languages.CompletionItemProvider {
public readonly triggerCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.\\@(".split("");
public provideCompletionItems(model: ITextModel, position: Position, context: CompletionContext,
token: CancellationToken): ProviderResult<CompletionList> {
return {
incomplete: false,
suggestions: this.createInternalCompletionItems(replaceRange, model.editorMode),
};
}
return services.getCodeCompletionItems(sourceContext, position);
}
public resolveCompletionItem(item: CompletionItem, token: CancellationToken): ProviderResult<CompletionItem> {
return item;
}
}
The real work is to generate the completion items. One way is to use my antlr4-c3 code completion core and amend that with logic to create and use a symbol table to provide symbol information.