@Override
	public List<CompletionItem> getCompletionItems(EventCompletionContext context) {
        Optional<SchemaNode> matched = match(context);
        if (matched.isEmpty()) return List.of();

        List<String> suggestions = new ArrayList<>();

        TokenType nodeType = matched.get().getDirtyType();
        SymbolType equivalentSymbolType;

        switch (nodeType) {
            case DOCUMENT:
                equivalentSymbolType = SymbolType.DOCUMENT;
                break;
            case SCHEMA:
                equivalentSymbolType = SymbolType.SCHEMA;
                break;
            case RANK_PROFILE:
                equivalentSymbolType = SymbolType.RANK_PROFILE;
                break;
            case STRUCT:
                equivalentSymbolType = SymbolType.STRUCT;
                break;
            case ANNOTATION:
                equivalentSymbolType = SymbolType.ANNOTATION;
                break;
            default:
                return List.of();
        }

        String myIdentifierString = (matched.get().getNextSibling() != null 
                && (
                    matched.get().getNextSibling().isASTInstance(identifierStr.class)
                    ||  matched.get().getNextSibling().isASTInstance(identifierWithDashStr.class)
                )) ? matched.get().getNextSibling().getText() : "";

        if (nodeType == TokenType.DOCUMENT || nodeType == TokenType.RANK_PROFILE || nodeType == TokenType.SCHEMA) {
            suggestions = context.schemaIndex.listSymbolsInScope(null, equivalentSymbolType)
                .stream()
                .map(symbol -> symbol.getShortIdentifier())
                .filter(str -> !str.equals(myIdentifierString))
                .collect(Collectors.toCollection(ArrayList::new)); // to make it modifiable
        } else if (nodeType == TokenType.STRUCT || nodeType == TokenType.ANNOTATION) {
            Optional<Symbol> scope = context.schemaIndex.findSymbol(null, SymbolType.DOCUMENT, ((SchemaDocument)context.document).getSchemaIdentifier());

            if (scope.isPresent()) {
                suggestions = context.schemaIndex.listSymbolsInScope(scope.get(), equivalentSymbolType)
                    .stream()
                    .map(symbol -> symbol.getShortIdentifier())
                    .filter(str -> !str.equals(myIdentifierString))
                    .collect(Collectors.toCollection(ArrayList::new)); // to make it modifiable
            }
        }

        if (nodeType == TokenType.RANK_PROFILE && !suggestions.contains("default")) {
            suggestions.add("default");
        }

        if (suggestions.isEmpty()) {
            return List.of(CompletionUtils.constructSnippet("inherits", "inherits $0 "));
        }

        String choiceString = "${1|" + String.join(",", suggestions) + "|}";
        return List.of(CompletionUtils.constructSnippet("inherits", "inherits " + choiceString));
	}
InheritsCompletionProvider 
Completion of the text " inherits " with <b>choice</b> on what to inherit. Note that choice is different from 
completion, choices are embedded in a snippet, while {@link InheritanceCompletion} takes care of standalone 
completion of these same items.
integration/schema-language-server/language-server/src/main/java/ai/vespa/schemals/lsp/schema/completion/provider/InheritsCompletion.java