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

// @dart = 2.7

import 'package:compiler/src/common/elements.dart' show JElementEnvironment;
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/elements/names.dart';
import 'package:compiler/src/elements/types.dart';
import 'package:compiler/src/world.dart' show JClosedWorld;

ClassEntity findClass(JClosedWorld closedWorld, String name) {
  JElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
  ClassEntity cls =
      elementEnvironment.lookupClass(elementEnvironment.mainLibrary, name);
  cls ??= elementEnvironment.lookupClass(
      closedWorld.commonElements.coreLibrary, name);
  cls ??= elementEnvironment.lookupClass(
      closedWorld.commonElements.interceptorsLibrary, name);
  cls ??= elementEnvironment.lookupClass(
      closedWorld.commonElements.jsHelperLibrary, name);
  if (cls == null) {
    for (LibraryEntity library in elementEnvironment.libraries) {
      if (!library.canonicalUri.isScheme('dart') &&
          !library.canonicalUri.isScheme('package')) {
        cls = elementEnvironment.lookupClass(library, name);
        if (cls != null) {
          break;
        }
      }
    }
  }
  assert(cls != null, "Class '$name' not found.");
  return cls;
}

MemberEntity findClassMember(
    JClosedWorld closedWorld, String className, String memberName,
    {bool required: true}) {
  bool isSetter = false;
  if (memberName.endsWith('=')) {
    memberName = memberName.substring(0, memberName.length - 1);
    isSetter = true;
  }
  JElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
  ClassEntity cls = findClass(closedWorld, className);
  assert(cls != null, "Class '$className' not found.");
  MemberEntity member = elementEnvironment.lookupClassMember(
      cls, Name(memberName, cls.library.canonicalUri, isSetter: isSetter));
  if (member == null && !isSetter) {
    member = elementEnvironment.lookupConstructor(cls, memberName);
  }
  assert(
      !required || member != null, "Member '$memberName' not found in $cls.");
  return member;
}

MemberEntity findMember(JClosedWorld closedWorld, String name) {
  bool isSetter = false;
  if (name.endsWith('=')) {
    name = name.substring(0, name.length - 1);
    isSetter = true;
  }
  JElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
  MemberEntity member = elementEnvironment.lookupLibraryMember(
      elementEnvironment.mainLibrary, name,
      setter: isSetter);
  member ??= elementEnvironment.lookupLibraryMember(
      closedWorld.commonElements.coreLibrary, name,
      setter: isSetter);
  if (member == null) {
    for (LibraryEntity library in elementEnvironment.libraries) {
      if (!library.canonicalUri.isScheme('dart') &&
          !library.canonicalUri.isScheme('package')) {
        member = elementEnvironment.lookupLibraryMember(library, name,
            setter: isSetter);
        if (member != null) {
          break;
        }
      }
    }
  }
  assert(member != null, "Member '$name' not found.");
  return member;
}

FunctionType findFunctionType(JClosedWorld closedWorld, String name) {
  FunctionEntity function = findMember(closedWorld, name);
  return closedWorld.elementEnvironment.getFunctionType(function);
}

DartType findFieldType(JClosedWorld closedWorld, String name) {
  FieldEntity field = findMember(closedWorld, name);
  return closedWorld.elementEnvironment.getFieldType(field);
}
