visitFunctionType method

  1. @override
StringSink visitFunctionType(
  1. FunctionType spec, [
  2. StringSink? output
])

Implementation

@override
StringSink visitFunctionType(FunctionType spec, [StringSink? output]) {
  final out = output ??= StringBuffer();
  if (spec.returnType != null) {
    spec.returnType!.accept(this, out);
    out.write(' ');
  }
  out.write('Function');
  if (spec.types.isNotEmpty) {
    out.write('<');
    visitAll<Reference>(spec.types, out, (spec) {
      spec.accept(this, out);
    });
    out.write('>');
  }
  out.write('(');
  final needsTrailingComma = spec.requiredParameters.length +
          spec.optionalParameters.length +
          spec.namedRequiredParameters.length +
          spec.namedParameters.length >
      1;
  visitAll<Reference>(spec.requiredParameters, out, (spec) {
    spec.accept(this, out);
  });
  final hasNamedParameters = spec.namedRequiredParameters.isNotEmpty ||
      spec.namedParameters.isNotEmpty;
  if (spec.requiredParameters.isNotEmpty &&
      (needsTrailingComma ||
          spec.optionalParameters.isNotEmpty ||
          hasNamedParameters)) {
    out.write(', ');
  }
  if (spec.optionalParameters.isNotEmpty) {
    out.write('[');
    visitAll<Reference>(spec.optionalParameters, out, (spec) {
      spec.accept(this, out);
    });
    if (needsTrailingComma) {
      out.write(', ');
    }
    out.write(']');
  } else if (hasNamedParameters) {
    out.write('{');
    visitAll<String>(spec.namedRequiredParameters.keys, out, (name) {
      out.write('required ');
      spec.namedRequiredParameters[name]!.accept(this, out);
      out
        ..write(' ')
        ..write(name);
    });
    if (spec.namedRequiredParameters.isNotEmpty &&
        spec.namedParameters.isNotEmpty) {
      out.write(', ');
    }
    visitAll<String>(spec.namedParameters.keys, out, (name) {
      spec.namedParameters[name]!.accept(this, out);
      out
        ..write(' ')
        ..write(name);
    });
    if (needsTrailingComma) {
      out.write(', ');
    }
    out.write('}');
  }
  out.write(')');
  if (_useNullSafetySyntax && (spec.isNullable ?? false)) {
    out.write('?');
  }
  return out;
}