// Copyright (c) 2019, 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 'package:analyzer/dart/ast/ast.dart';

/// An indication of the kind of context in which a super expression was found.
class SuperContext {
  /// An indication that the super expression is in a context in which it is
  /// invalid because it is in an annotation.
  static const SuperContext annotation = SuperContext._('annotation');

  /// An indication that the super expression is in a context in which it is
  /// invalid because it is in an instance member of an extension.
  static const SuperContext extension = SuperContext._('extension');

  /// An indication that the super expression is in a context in which it is
  /// invalid because it is not in an instance member.
  static const SuperContext static = SuperContext._('static');

  /// An indication that the super expression is in a context in which it is
  /// valid.
  static const SuperContext valid = SuperContext._('valid');

  /// The name of the context.
  final String name;

  /// Return an indication of the context in which the super [expression] is
  /// being used.
  factory SuperContext.of(SuperExpression expression) {
    for (AstNode? node = expression; node != null; node = node.parent) {
      if (node is Annotation) {
        return SuperContext.annotation;
      } else if (node is CompilationUnit) {
        return SuperContext.static;
      } else if (node is ConstructorDeclaration) {
        return node.factoryKeyword == null
            ? SuperContext.valid
            : SuperContext.static;
      } else if (node is ConstructorFieldInitializer) {
        return SuperContext.static;
      } else if (node is MethodDeclaration) {
        if (node.isStatic) {
          return SuperContext.static;
        } else if (node.parent is ExtensionDeclaration) {
          return SuperContext.extension;
        }
        return SuperContext.valid;
      }
    }
    return SuperContext.static;
  }

  const SuperContext._(this.name);
}
