// 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 _fe_analyzer_shared.parser.main;

import 'dart:convert' show LineSplitter, utf8;

import 'dart:io' show File;

import 'package:_fe_analyzer_shared/src/parser/experimental_features.dart';

import '../scanner/token.dart' show Token;

import '../scanner/io.dart' show readBytesFromFileSync;

import '../scanner/scanner.dart' show scan;

import 'listener.dart' show Listener;

import 'top_level_parser.dart' show TopLevelParser;

import 'identifier_context.dart' show IdentifierContext;

class DebugListener extends Listener {
  @override
  void handleIdentifier(Token token, IdentifierContext context) {
    logEvent("Identifier: ${token.lexeme}");
  }

  @override
  void logEvent(String name) {
    print(name);
  }
}

mainEntryPoint(List<String> arguments) async {
  for (String argument in arguments) {
    if (argument.startsWith("@")) {
      Uri uri = Uri.base.resolve(argument.substring(/* start = */ 1));
      await for (String file
          in new File.fromUri(uri)
              .openRead()
              .cast<List<int>>()
              .transform(utf8.decoder)
              .transform(const LineSplitter())) {
        outLine(uri.resolve(file));
      }
    } else {
      outLine(Uri.base.resolve(argument));
    }
  }
}

void outLine(Uri uri) {
  new TopLevelParser(
    new DebugListener(),
    experimentalFeatures: const DefaultExperimentalFeatures(),
  ).parseUnit(scan(readBytesFromFileSync(uri)).tokens);
}
