// 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.

// @dart = 2.9

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