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

import 'dart:async';

import 'package:analyzer/dart/ast/ast.dart';
import 'package:path/path.dart' as p;
import 'package:stack_trace/stack_trace.dart';

import '../dart.dart';
import '../language_version.dart';
import '../log.dart' as log;
import '../utils.dart';
import '../validator.dart';

/// Validates that libraries do not opt into newer language versions than what
/// they declare in their pubspec.
class LanguageVersionValidator extends Validator {
  @override
  Future validate() async {
    var packagePath = p.normalize(p.absolute(entrypoint.root.dir));
    final analysisContextManager = AnalysisContextManager(packagePath);

    final declaredLanguageVersion = entrypoint.root.pubspec.languageVersion;

    for (final path in ['lib', 'bin'].expand((path) {
      return filesBeneath(path, recursive: true)
          .where((file) => p.extension(file) == '.dart');
    })) {
      CompilationUnit unit;
      try {
        unit = analysisContextManager.parse(path);
      } on AnalyzerErrorGroup catch (e, s) {
        // Ignore files that do not parse.
        log.fine(getErrorMessage(e));
        log.fine(Chain.forTrace(s).terse);
        continue;
      }

      final unitLanguageVersionToken = unit.languageVersionToken;
      if (unitLanguageVersionToken != null) {
        final unitLanguageVersion =
            LanguageVersion.fromLanguageVersionToken(unitLanguageVersionToken);
        if (unitLanguageVersion > declaredLanguageVersion) {
          final relativePath = p.relative(path);
          errors.add('$relativePath is declaring language version '
              '$unitLanguageVersion that is newer than the SDK '
              'constraint $declaredLanguageVersion declared in '
              '`pubspec.yaml`.');
        }
      }
    }
  }
}
