blob: deb612b26cec4469d5f70ca8489cf5165304ff26 [file] [log] [blame]
// 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 '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/js_model/js_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;
}
}
}
}
return cls!;
}
MemberEntity findClassMember(
JClosedWorld closedWorld, String className, String memberName) {
return findClassMemberOrNull(closedWorld, className, memberName)!;
}
MemberEntity? findClassMemberOrNull(
JClosedWorld closedWorld, String className, String memberName) {
bool isSetter = false;
if (memberName.endsWith('=')) {
memberName = memberName.substring(0, memberName.length - 1);
isSetter = true;
}
JElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
ClassEntity cls = findClass(closedWorld, className);
MemberEntity? member = elementEnvironment.lookupClassMember(
cls, Name(memberName, cls.library.canonicalUri, isSetter: isSetter));
if (member == null && !isSetter) {
member = elementEnvironment.lookupConstructor(cls, memberName);
}
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;
}
}
}
}
return member!;
}
FunctionType findFunctionType(JClosedWorld closedWorld, String name) {
final function = findMember(closedWorld, name) as FunctionEntity;
return closedWorld.elementEnvironment.getFunctionType(function);
}
DartType findFieldType(JClosedWorld closedWorld, String name) {
final field = findMember(closedWorld, name) as FieldEntity;
return closedWorld.elementEnvironment.getFieldType(field);
}