// 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.

part of models;

enum FunctionKind {
  regular,
  closure,
  implicitClosure,
  getter,
  setter,
  constructor,
  implicitGetter,
  implicitSetter,
  implicitStaticGetter,
  fieldInitializer,
  irregexpFunction,
  methodExtractor,
  noSuchMethodDispatcher,
  invokeFieldDispatcher,
  collected,
  native,
  ffiTrampoline,
  stub,
  tag,
  dynamicInvocationForwarder
}

bool isSyntheticFunction(FunctionKind? kind) {
  switch (kind) {
    case FunctionKind.collected:
    case FunctionKind.native:
    case FunctionKind.stub:
    case FunctionKind.tag:
      return true;
    default:
      return false;
  }
}

bool isDartFunction(FunctionKind? kind) => !isSyntheticFunction(kind);
bool isStubFunction(FunctionKind? kind) => kind == FunctionKind.stub;
bool hasDartCode(FunctionKind? kind) =>
    isDartFunction(kind) || isStubFunction(kind);

String getFunctionFullName(FunctionRef function) {
  String content = function.name!;
  ObjectRef? owner = function.dartOwner;
  while (owner is FunctionRef) {
    FunctionRef function = (owner as FunctionRef);
    content = "${function.name!}.${content}";
    owner = function.dartOwner!;
  }
  if (owner is ClassRef) {
    content = "${owner.name!}.${content}";
  }
  return content;
}

abstract class FunctionRef extends ObjectRef {
  /// The name of this class.
  String? get name;

  /// The owner of this function, which can be a LibraryRef, ClassRef,
  /// or a FunctionRef.
  ObjectRef? get dartOwner; // owner

  /// Is this function static?
  bool? get isStatic;

  /// Is this function const?
  bool? get isConst;

  /// The kind of the function.
  FunctionKind? get kind;
}

abstract class ServiceFunction extends Object implements FunctionRef {
  /// The location of this function in the source code. [optional]
  SourceLocation? get location;

  /// The compiled code associated with this function. [optional]
  CodeRef? get code;

  /// [optional]
  CodeRef? get unoptimizedCode;

  /// [optional]
  FieldRef? get field;
  int? get usageCounter;
  InstanceRef? get icDataArray;
  int? get deoptimizations;
  bool? get isOptimizable;
  bool? get isInlinable;
  bool? get hasIntrinsic;
  bool? get isRecognized;
  bool? get isNative;
}
