refactor code

This commit is contained in:
Sergey Penkovsky
2025-05-21 15:59:11 +03:00
parent e6d944c5f9
commit 7490a8e66b

View File

@@ -64,75 +64,71 @@ class BindSpec {
/// Параметр [indent] задаёт отступ для красивого форматирования кода. /// Параметр [indent] задаёт отступ для красивого форматирования кода.
String generateBind(int indent) { String generateBind(int indent) {
final indentStr = ' ' * indent; final indentStr = ' ' * indent;
final provide = _generateProvideClause(indent);
// Если есть @params() final postfix = _generatePostfix();
const paramVar = 'args'; // <= новое имя для безопасности
if (hasParams) {
final fnArgs = parameters
.map((p) => p.isParams ? paramVar : p.generateArg(paramVar))
.join(', ');
String provide;
if (bindingType == 'instance') {
provide = isAsyncInstance
? '.toInstanceAsync(($fnArgs) => $methodName($fnArgs))'
: '.toInstance(($fnArgs) => $methodName($fnArgs))';
} else if (isAsyncProvide) {
provide = (fnArgs.length > 60 || fnArgs.contains('\n'))
? '.toProvideAsyncWithParams(\n${' ' * (indent + 2)}($paramVar) => $methodName($fnArgs))'
: '.toProvideAsyncWithParams(($paramVar) => $methodName($fnArgs))';
} else {
provide = (fnArgs.length > 60 || fnArgs.contains('\n'))
? '.toProvideWithParams(\n${' ' * (indent + 2)}($paramVar) => $methodName($fnArgs))'
: '.toProvideWithParams(($paramVar) => $methodName($fnArgs))';
}
final namePart = named != null ? ".withName('$named')" : '';
final singletonPart = isSingleton ? '.singleton()' : '';
return '$indentStr' return '$indentStr'
'bind<$returnType>()' 'bind<$returnType>()'
'$provide' '$provide'
'$namePart' '$postfix;';
'$singletonPart;';
} }
// Собираем строку аргументов для вызова метода String _generateProvideClause(int indent) {
final argsStr = parameters.map((p) => p.generateArg()).join(', '); if (hasParams) return _generateWithParamsProvideClause(indent);
return _generatePlainProvideClause(indent);
// Если аргументов много или они длинные — разбиваем вызов на несколько строк
//final needMultiline = argsStr.length > 60 || argsStr.contains('\n');
String provide;
if (bindingType == 'instance') {
// Добавляем async вариант для Future<T>
if (isAsyncInstance) {
provide = '.toInstanceAsync($methodName($argsStr))';
} else {
provide = '.toInstance($methodName($argsStr))';
} }
} else {
// provide String _generateWithParamsProvideClause(int indent) {
// Безопасное имя для параметра
const paramVar = 'args';
final fnArgs = parameters
.map((p) => p.isParams ? paramVar : p.generateArg(paramVar))
.join(', ');
final multiLine = fnArgs.length > 60 || fnArgs.contains('\n');
switch (bindingType) {
case 'instance':
return isAsyncInstance
? '.toInstanceAsync(($fnArgs) => $methodName($fnArgs))'
: '.toInstance(($fnArgs) => $methodName($fnArgs))';
case 'provide':
default:
if (isAsyncProvide) { if (isAsyncProvide) {
// Асинхронная фабрика return multiLine
provide = (argsStr.length > 60 || argsStr.contains('\n')) ? '.toProvideAsyncWithParams(\n${' ' * (indent + 2)}($paramVar) => $methodName($fnArgs))'
: '.toProvideAsyncWithParams(($paramVar) => $methodName($fnArgs))';
} else {
return multiLine
? '.toProvideWithParams(\n${' ' * (indent + 2)}($paramVar) => $methodName($fnArgs))'
: '.toProvideWithParams(($paramVar) => $methodName($fnArgs))';
}
}
}
String _generatePlainProvideClause(int indent) {
final argsStr = parameters.map((p) => p.generateArg()).join(', ');
final multiLine = argsStr.length > 60 || argsStr.contains('\n');
switch (bindingType) {
case 'instance':
return isAsyncInstance
? '.toInstanceAsync($methodName($argsStr))'
: '.toInstance($methodName($argsStr))';
case 'provide':
default:
if (isAsyncProvide) {
return multiLine
? '.toProvideAsync(\n${' ' * (indent + 2)}() => $methodName($argsStr))' ? '.toProvideAsync(\n${' ' * (indent + 2)}() => $methodName($argsStr))'
: '.toProvideAsync(() => $methodName($argsStr))'; : '.toProvideAsync(() => $methodName($argsStr))';
} else { } else {
provide = (argsStr.length > 60 || argsStr.contains('\n')) return multiLine
? '.toProvide(\n${' ' * (indent + 2)}() => $methodName($argsStr))' ? '.toProvide(\n${' ' * (indent + 2)}() => $methodName($argsStr))'
: '.toProvide(() => $methodName($argsStr))'; : '.toProvide(() => $methodName($argsStr))';
} }
} }
}
String _generatePostfix() {
final namePart = named != null ? ".withName('$named')" : ''; final namePart = named != null ? ".withName('$named')" : '';
final singletonPart = isSingleton ? '.singleton()' : ''; final singletonPart = isSingleton ? '.singleton()' : '';
return '$namePart$singletonPart';
// Итоговый bind: bind<Type>().toProvide(...).withName(...).singleton();
return '$indentStr'
'bind<$returnType>()'
'$provide'
'$namePart'
'$singletonPart;';
// Всегда заканчиваем точкой с запятой!
} }
/// Создаёт спецификацию биндинга (BindSpec) из метода класса-модуля /// Создаёт спецификацию биндинга (BindSpec) из метода класса-модуля
@@ -171,15 +167,12 @@ class BindSpec {
// --- Новый участок: извлекаем внутренний тип из Future<> и выставляем флаги // --- Новый участок: извлекаем внутренний тип из Future<> и выставляем флаги
bool isAsyncInstance = false; bool isAsyncInstance = false;
bool isAsyncProvide = false; bool isAsyncProvide = false;
final futureInnerType = _extractFutureInnerType(returnType);
if (returnType.startsWith('Future<')) { if (futureInnerType != null) {
final futureMatch = RegExp(r'^Future<(.+)>$').firstMatch(returnType); returnType = futureInnerType;
if (futureMatch != null) {
returnType = futureMatch.group(1)!.trim();
if (bindingType == 'instance') isAsyncInstance = true; if (bindingType == 'instance') isAsyncInstance = true;
if (bindingType == 'provide') isAsyncProvide = true; if (bindingType == 'provide') isAsyncProvide = true;
} }
}
return BindSpec( return BindSpec(
returnType: returnType, returnType: returnType,
@@ -193,4 +186,9 @@ class BindSpec {
hasParams: hasParams, hasParams: hasParams,
); );
} }
static String? _extractFutureInnerType(String typeName) {
final match = RegExp(r'^Future<(.+)>$').firstMatch(typeName);
return match?.group(1)?.trim();
}
} }