generateAccessorMethods method

void generateAccessorMethods(
  1. List<Method> extMethods
)

Implementation

void generateAccessorMethods(List<Method> extMethods) {
  if (!generateAccessors) return;
  final usedTypes = <ImportableType>{};
  for (final dep in dependencies) {
    if (dep.isFromModule || !usedTypes.add(dep.typeImpl)) {
      continue;
    }
    final passesArgs = dep.dependencies.any((d) => d.isFactoryParam) || dep.instanceName != null;
    final isAsyncOrHasAsyncDep = dep.isAsync || dep.dependencies.any(dependencies.isAsyncOrHasAsyncDependency);
    final returns = isAsyncOrHasAsyncDep
        ? TypeReference(
            (b) => b
              ..symbol = 'Future'
              ..types.add(typeRefer(dep.typeImpl, targetFile)),
          )
        : typeRefer(dep.typeImpl, targetFile);
    extMethods.add(
      Method(
        (b) {
          b
            ..name = toCamelCase(dep.typeImpl.name)
            ..returns = returns
            ..type = passesArgs ? null : MethodType.getter
            ..lambda = true;
          // add parameters for factory params
          if (dep.instanceName != null) {
            b.optionalParameters.add(
              Parameter(
                (pb) => pb
                  ..named = true
                  ..name = 'instanceName'
                  ..type = nullableRefer('String', nullable: true),
              ),
            );
          }
          for (final iDep in dep.dependencies.where((d) => d.isFactoryParam)) {
            b.optionalParameters.add(
              Parameter(
                (pb) => pb
                  ..required = iDep.isRequired && !iDep.type.isNullable
                  ..named = true
                  ..name = iDep.paramName
                  ..type = typeRefer(iDep.type, targetFile),
              ),
            );
          }

          int paramIndex = 0;
          b.body =
              refer(
                    isAsyncOrHasAsyncDep ? 'getAsync' : 'get',
                  )
                  .call(
                    [],
                    {
                      if (dep.instanceName != null) 'instanceName': refer('instanceName'),
                      for (final iDep in dep.dependencies.where((d) => d.isFactoryParam))
                        'param${++paramIndex}': refer(iDep.paramName),
                    },
                    [typeRefer(dep.typeImpl, targetFile)],
                  )
                  .code;
        },
      ),
    );
  }
}