blob: beba683319ffa79f71defdb02530e206e08b2d48 [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);
}