visitLibrary method Null safety

  1. @override
StringSink visitLibrary(
  1. Library spec,
  2. [StringSink? output]
)

Implementation

@override
StringSink visitLibrary(Library spec, [StringSink? output]) {
  output ??= StringBuffer();
  // Process the body first in order to prime the allocators.
  final body = StringBuffer();
  for (final spec in spec.body) {
    spec.accept(this, body);
    if (spec is Method && _isLambdaMethod(spec)) {
      body.write(';');
    }
  }

  if (spec.name != null) {
    spec.annotations.forEach((a) => visitAnnotation(a, output));
    output.write('library ${spec.name!};');
  } else if (spec.annotations.isNotEmpty) {
    throw StateError('a library name is required for annotations');
  }

  final directives = <Directive>[...allocator.imports, ...spec.directives];

  if (orderDirectives) {
    directives.sort();
  }

  Directive? previous;
  for (final directive in directives) {
    if (_newLineBetween(orderDirectives, previous, directive)) {
      // Note: dartfmt handles creating new lines between directives.
      // 2 lines are written here. The first one comes after the previous
      // directive `;`, the second is the empty line.
      output
        ..writeln()
        ..writeln();
    }
    directive.accept(this, output);
    previous = directive;
  }
  output.write(body);
  return output;
}