function onEnterKey()

in experimental/adaptive-tool/server/lu/src/providers/keyBinding.ts [31:154]


function onEnterKey(args: any[], documents: TextDocuments<TextDocument>, connection: Connection) {
	
	const document = documents.get(args[0]);
	const cursorPos: Position = args[1];
	
	const textBeforeCursor = document?.getText({
		start: {
			line: cursorPos.line,
			character: 0
		},
		end: cursorPos
	});

    const lineBreakPos = cursorPos;

	let matches: RegExpExecArray | { replace: (arg0: string, arg1: string) => void; }[];

	const match = textBeforeCursor?.match(/^\s*@\s*(\w+)\s*=\s*$/);
	if (match !== null) {
		const fullContent = document?.getText();
		const luContent = extractLUISContent(fullContent!);
		luContent.then(luisJson => {
			if (luisJson != null) {
				const entities : string[] = [];
				console.log(luisJson["entities"]);
				luisJson['entities'].forEach((entity : any) => {
					entities.push(entity.name);
				});
				if (entities.includes(match![1])) {
					// it's a ml entity, add \n\t- @
					const replacedStr = `\n\t- @ `;
					connection.workspace.applyEdit({
						documentChanges: [
							TextDocumentEdit.create({ uri: document!.uri, version: document!.version }, [
								TextEdit.insert(lineBreakPos, replacedStr)
							])
						]
					});
				} else {
					// it's not a ml entity, the parser will fail, just add \n
					connection.workspace.applyEdit({
						documentChanges: [
							TextDocumentEdit.create({ uri: document!.uri, version: document!.version }, [
								TextEdit.insert(lineBreakPos, '\n')
							])
						]
					});
				}
			} else {
				// it's not a ml entity, the parser will fail, just add \n
				connection.workspace.applyEdit({
					documentChanges: [
						TextDocumentEdit.create({ uri: document!.uri, version: document!.version }, [
							TextEdit.insert(lineBreakPos, '\n')
						])
					]
				});
			}
		});
	} else if ((matches = /^(\s*)@\s*list\s*\S+\s*=\s*/.exec(textBeforeCursor!)!) !== null) {
		// in '@ list' line
		const replacedStr = `\n${matches[1]}\t- `;
		connection.workspace.applyEdit({
			documentChanges: [
				TextDocumentEdit.create({ uri: document!.uri, version: document!.version }, [
					TextEdit.insert(lineBreakPos, replacedStr)
				])
			]
		});
	} else if ((matches = /^(\s*-\s*@).*\S+.*/.exec(textBeforeCursor!)!) !== null) {
		// in '- @' line
		const replacedStr = `\n${matches[1]} `;
		connection.workspace.applyEdit({
			documentChanges: [
				TextDocumentEdit.create({ uri: document!.uri, version: document!.version }, [
					TextEdit.insert(lineBreakPos, replacedStr)
				])
			]
		});
	} else if ((matches = /^(\s*-\s*@)\s*$/.exec(textBeforeCursor!)!) !== null) {
        // in '- @' empty line, enter would delete the head dash
		const range = {start: {line: lineBreakPos.line, character: 0}, end: {line: lineBreakPos.line, character: lineBreakPos.character}};
		connection.workspace.applyEdit({
			documentChanges: [
				TextDocumentEdit.create({ uri: document!.uri, version: document!.version }, [
					TextEdit.del(range)
				])
			]
		});
	} else if ((matches = /^(\s*[-#]).*\S+.*/.exec(textBeforeCursor!)!) !== null && /^\s*-\s*@\s*$/.exec(textBeforeCursor!) == null) {
		// in '- ' line
		let replacedStr;
		if (/:\s*$/.exec(textBeforeCursor!) !== null) {
			replacedStr = `\n\t${matches[1].replace('#', '-')} `;
		} else {
			replacedStr = `\n${matches[1].replace('#', '-')} `;
		}
		connection.workspace.applyEdit({
			documentChanges: [
				TextDocumentEdit.create({ uri: document!.uri, version: document!.version }, [
					TextEdit.insert(lineBreakPos, replacedStr)
				])
			]
		});
	} else if ((matches = /^(\s*-)\s*$/.exec(textBeforeCursor!)!) !== null) {
        // in '-' empty line, enter would delete the head dash
		const range = {start: {line: lineBreakPos.line, character: 0}, end: {line: lineBreakPos.line, character: lineBreakPos.character}};
		connection.workspace.applyEdit({
			documentChanges: [
				TextDocumentEdit.create({ uri: document!.uri, version: document!.version }, [
					TextEdit.del(range)
				])
			]
		});
    } else {
		connection.workspace.applyEdit({
			documentChanges: [
				TextDocumentEdit.create({ uri: document!.uri, version: document!.version }, [
					TextEdit.insert(lineBreakPos, '\n')
				])
			]
		});
    }
}