src/vs/editor/common/languages/autoIndent.ts/getGoodIndentForLine
export function getGoodIndentForLine(
	autoIndent: EditorAutoIndentStrategy,
	virtualModel: IVirtualModel,
	languageId: string,
	lineNumber: number,
	indentConverter: IIndentConverter,
	languageConfigurationService: ILanguageConfigurationService
): string | null {
	if (autoIndent < EditorAutoIndentStrategy.Full) {
		return null;
	}

	const richEditSupport = languageConfigurationService.getLanguageConfiguration(languageId);
	if (!richEditSupport) {
		return null;
	}

	const indentRulesSupport = languageConfigurationService.getLanguageConfiguration(languageId).indentRulesSupport;
	if (!indentRulesSupport) {
		return null;
	}

	const indent = getInheritIndentForLine(autoIndent, virtualModel, lineNumber, undefined, languageConfigurationService);
	const lineContent = virtualModel.getLineContent(lineNumber);

	if (indent) {
		const inheritLine = indent.line;
		if (inheritLine !== undefined) {
			const enterResult = richEditSupport.onEnter(autoIndent, '', virtualModel.getLineContent(inheritLine), '');

			if (enterResult) {
				let indentation = strings.getLeadingWhitespace(virtualModel.getLineContent(inheritLine));

				if (enterResult.removeText) {
					indentation = indentation.substring(0, indentation.length - enterResult.removeText);
				}

				if (
					(enterResult.indentAction === IndentAction.Indent) ||
					(enterResult.indentAction === IndentAction.IndentOutdent)
				) {
					indentation = indentConverter.shiftIndent(indentation);
				} else if (enterResult.indentAction === IndentAction.Outdent) {
					indentation = indentConverter.unshiftIndent(indentation);
				}

				if (indentRulesSupport.shouldDecrease(lineContent)) {
					indentation = indentConverter.unshiftIndent(indentation);
				}

				if (enterResult.appendText) {
					indentation += enterResult.appendText;
				}

				return strings.getLeadingWhitespace(indentation);
			}
		}

		if (indentRulesSupport.shouldDecrease(lineContent)) {
			if (indent.action === IndentAction.Indent) {
				return indent.indentation;
			} else {
				return indentConverter.unshiftIndent(indent.indentation);
			}
		} else {
			if (indent.action === IndentAction.Indent) {
				return indentConverter.shiftIndent(indent.indentation);
			} else {
				return indent.indentation;
			}
		}
	}
	return null;
}