// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library fasta.export;

import 'builder/builder.dart';
import 'builder/library_builder.dart';

import 'combinator.dart' show Combinator;
import 'fasta_codes.dart';

class Export {
  /// The library that is exporting [exported];
  final LibraryBuilder exporter;

  /// The library being exported.
  LibraryBuilder exported;

  final List<Combinator>? combinators;

  final int charOffset;

  Export(this.exporter, this.exported, this.combinators, this.charOffset);

  Uri get fileUri => exporter.fileUri;

  bool addToExportScope(String name, Builder member) {
    if (combinators != null) {
      for (Combinator combinator in combinators!) {
        if (combinator.isShow && !combinator.names.contains(name)) return false;
        if (combinator.isHide && combinator.names.contains(name)) return false;
      }
    }
    bool changed = exporter.addToExportScope(name, member, charOffset);
    if (changed) {
      if (exporter.isNonNullableByDefault) {
        // TODO(johnniwinther): Add a common interface for exportable builders.
        Builder? memberLibrary = member.parent;
        if (memberLibrary is LibraryBuilder &&
            !memberLibrary.isNonNullableByDefault) {
          exporter.addProblem(
              messageExportOptOutFromOptIn, charOffset, noLength, fileUri);
        }
      }
    }
    return changed;
  }
}
