// Copyright (c) 2017, 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.

part of analyzer.parser;

class _Builder implements Builder {
  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}

class _KernelLibraryBuilder implements KernelLibraryBuilder {
  @override
  final uri;

  _KernelLibraryBuilder(this.uri);

  @override
  Uri get fileUri => uri;

  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}

/**
 * Replacement parser based on Fasta.
 */
class _Parser2 implements Parser {
  @override
  Token currentToken;

  /**
   * The builder which creates the analyzer AST data structures
   * based on the Fasta parser.
   */
  final AstBuilder _astBuilder;

  /**
   * The fasta parser being wrapped.
   */
  final fasta.Parser _fastaParser;

  /**
   * The source being parsed.
   */
  final Source _source;

  factory _Parser2(Source source, AnalysisErrorListener errorListener) {
    var errorReporter = new ErrorReporter(errorListener, source);
    var library = new _KernelLibraryBuilder(source.uri);
    var member = new _Builder();
    var scope = new Scope.top(isModifiable: true);

    AstBuilder astBuilder =
        new AstBuilder(errorReporter, library, member, scope, true);
    fasta.Parser fastaParser = new fasta.Parser(astBuilder);
    astBuilder.parser = fastaParser;
    return new _Parser2._(source, fastaParser, astBuilder);
  }

  _Parser2._(this._source, this._fastaParser, this._astBuilder);

  @override
  bool get parseGenericMethodComments => _astBuilder.parseGenericMethodComments;

  @override
  set parseGenericMethodComments(bool value) {
    _astBuilder.parseGenericMethodComments = value;
  }

  @override
  bool enableAssertInitializer = true;

  @override
  bool enableUriInPartOf = true;

  @override
  bool enableNnbd = false;

  @override
  CompilationUnit parseCompilationUnit(Token token) {
    currentToken = token;
    return parseCompilationUnit2();
  }

  @override
  CompilationUnit parseCompilationUnit2() {
    currentToken = _fastaParser.parseUnit(currentToken);
    return _astBuilder.pop();
  }

  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
