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

import 'builder.dart' show Builder, TypeBuilder;

import 'constructor_reference_builder.dart' show ConstructorReferenceBuilder;

abstract class MetadataBuilder<T extends TypeBuilder> extends Builder {
  MetadataBuilder(Builder parent, int charOffset)
      : super(parent, -1, parent.fileUri);

  factory MetadataBuilder.fromConstructor(
      ConstructorReferenceBuilder constructorReference,
      List arguments,
      Builder parent,
      int charOffset) {
    return new ConstructorMetadataBuilder(
        constructorReference, arguments, parent, charOffset);
  }

  factory MetadataBuilder.fromExpression(
      Object expression, String postfix, Builder parent, int charOffset) {
    return new ExpressionMetadataBuilder(
        expression, postfix, parent, charOffset);
  }
}

class ConstructorMetadataBuilder<T extends TypeBuilder>
    extends MetadataBuilder<T> {
  final ConstructorReferenceBuilder constructorReference;

  final List arguments;

  ConstructorMetadataBuilder(
      this.constructorReference, this.arguments, Builder parent, int charOffset)
      : super(parent, charOffset);

  @override
  String get fullNameForErrors => constructorReference.fullNameForErrors;
}

/// Expression metadata (without arguments).
///
/// Matches this grammar rule:
///
///    '@' qualified (‘.’ identifier)?
class ExpressionMetadataBuilder<T extends TypeBuilder>
    extends MetadataBuilder<T> {
  final Object qualified;

  final String identifier;

  ExpressionMetadataBuilder(
      this.qualified, this.identifier, Builder parent, int charOffset)
      : super(parent, charOffset);

  @override
  String get fullNameForErrors {
    return identifier == null ? qualified : "$qualified.$identifier";
  }
}
