import 'package:source_span/source_span.dart';

import '../token.dart';
import 'definition.dart';
import 'directive.dart';
import 'selection_set.dart';
import 'variable_definitions.dart';

class OperationDefinitionContext extends DefinitionContext {
  final Token TYPE, NAME;
  final VariableDefinitionsContext variableDefinitions;
  final List<DirectiveContext> directives = [];
  final SelectionSetContext selectionSet;

  bool get isMutation => TYPE?.text == 'mutation';

  bool get isQuery => TYPE?.text == 'query' || TYPE == null;

  String get name => NAME?.text;

  OperationDefinitionContext(
      this.TYPE, this.NAME, this.variableDefinitions, this.selectionSet) {
    assert(TYPE == null || TYPE.text == 'query' || TYPE.text == 'mutation');
  }

  @override
  FileSpan get span {
    if (TYPE == null) return selectionSet.span;
    var out = TYPE.span.expand(NAME.span);
    out = directives.fold<FileSpan>(out, (o, d) => o.expand(d.span));
    return out.expand(selectionSet.span);
  }
}