// Copyright (c) 2018, 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/analysis/session.dart';
import 'package:analyzer/dart/element/element.dart';

/// A wrapper around [AnalysisSession] that provides additional utilities.
///
/// The methods in this class that return analysis results will throw an
/// [InconsistentAnalysisException] if the result to be returned might be
/// inconsistent with any previously returned results.
class AnalysisSessionHelper {
  final AnalysisSession session;

  AnalysisSessionHelper(this.session);

  /// Return the [ClassElement] with the given [className] that is exported
  /// from the library with the given [libraryUri], or `null` if the library
  /// does not export a class with such name.
  Future<ClassElement> getClass(String libraryUri, String className) async {
    // TODO(brianwilkerson) Determine whether this await is necessary.
    await null;
    var libraryElement = await session.getLibraryByUri(libraryUri);
    var element = libraryElement.exportNamespace.get(className);
    if (element is ClassElement) {
      return element;
    } else {
      return null;
    }
  }

  /// Return the [PropertyAccessorElement] with the given [name] that is
  /// exported from the library with the given [uri], or `null` if the
  /// library does not export a top-level accessor with such name.
  Future<PropertyAccessorElement> getTopLevelPropertyAccessor(
      String uri, String name) async {
    // TODO(brianwilkerson) Determine whether this await is necessary.
    await null;
    var libraryElement = await session.getLibraryByUri(uri);
    var element = libraryElement.exportNamespace.get(name);
    if (element is PropertyAccessorElement) {
      return element;
    } else {
      return null;
    }
  }
}
