// 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 CombinatorBuilder;
import 'fasta_codes.dart';

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

  /// The library being exported.
  LibraryBuilder exported;

  final List<CombinatorBuilder>? 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 (CombinatorBuilder 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;
  }
}
