protected async docTypeFormat()

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);
  }