in Composer/packages/tools/language-servers/language-understanding/src/LUServer.ts [323:393]
protected async docTypeFormat(params: DocumentOnTypeFormattingParams): Promise<TextEdit[] | null> {
const document = this.documents.get(params.textDocument.uri);
if (!document) {
return Promise.resolve(null);
}
const lastLineContent = this.getLastLineContent(params);
const edits: TextEdit[] = [];
const curLineNumber = params.position.line;
const luDoc = this.getLUDocument(document);
const text = (await (luDoc?.index()).content) || document.getText();
const lines = text.split('\n');
const position = params.position;
const textBeforeCurLine = lines.slice(0, curLineNumber).join('\n');
const range = Range.create(position.line, 0, position.line, position.character);
const curLineContent = document.getText(range);
const key = params.ch;
const inputState = this.getInputLineState(params);
const pos = params.position;
if (key === '\n' && inputState === 'utterance' && lastLineContent.trim() !== '-') {
const newPos = Position.create(pos.line, 0);
const item: TextEdit = TextEdit.insert(newPos, '- ');
edits.push(item);
}
if (key === '\n' && inputState === 'mlEntity' && lastLineContent.trim().endsWith('=')) {
const mlEntities = util.getMLEntities(textBeforeCurLine);
const entityNameRegExp = /^\s*@\s*([0-9a-zA-Z_.-]+)\s*.*/;
let entityName = '';
if (entityNameRegExp.test(lastLineContent)) {
const entityGroup = lastLineContent.match(entityNameRegExp);
if (entityGroup && entityGroup.length >= 2) {
entityName = entityGroup[1];
}
if (mlEntities.includes(entityName)) {
const newPos = Position.create(pos.line, 0);
const item: TextEdit = TextEdit.insert(newPos, '\t-@');
edits.push(item);
}
}
}
if (key === '\n' && inputState === 'listEntity' && lastLineContent.trim() !== '-') {
const newPos = Position.create(pos.line, 0);
let insertStr = '';
const indentLevel = this.getIndentLevel(lastLineContent);
if (lastLineContent.trim().endsWith(':') || lastLineContent.trim().endsWith('=')) {
insertStr = '\t'.repeat(indentLevel + 1) + '-';
} else {
insertStr = '\t'.repeat(indentLevel) + '-';
}
const item: TextEdit = TextEdit.insert(newPos, insertStr);
edits.push(item);
//delete redundent \t from autoIndent
const deleteRange = Range.create(pos.line, pos.character - indentLevel, pos.line, pos.character);
const deleteItem: TextEdit = TextEdit.del(deleteRange);
edits.push(deleteItem);
}
if (lastLineContent.trim() === '-') {
const range = Range.create(pos.line - 1, 0, pos.line, curLineContent.length + 1);
const item: TextEdit = TextEdit.del(range);
edits.push(item);
}
return Promise.resolve(edits);
}