visitFunctionType method
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;
}