mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 15:21:54 +00:00
[dart2js] Handle private names correctly in K/J-model
The library wasn't taken into account when handling computing class members in the K/J-model and not handled correctly when computing applicable selectors. This made dart2js unable to handle members with a name private to a different library than the enclosing library. Fixes #33732 Fixes #49226 Change-Id: I5ba143d87662bbd42e0ff02355054e4a937be8f8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/252665 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Stephen Adams <sra@google.com>
This commit is contained in:
parent
94d797ebee
commit
50ac2500a1
|
@ -6,6 +6,7 @@ import '../common.dart';
|
|||
import '../constants/constant_system.dart' as constant_system;
|
||||
import '../constants/values.dart';
|
||||
import '../elements/entities.dart';
|
||||
import '../elements/names.dart';
|
||||
import '../elements/types.dart';
|
||||
import '../inferrer/abstract_value_domain.dart';
|
||||
import '../js_backend/native_data.dart' show NativeBasicData;
|
||||
|
@ -325,8 +326,9 @@ abstract class CommonElements {
|
|||
|
||||
T _findClassMember<T extends MemberEntity>(ClassEntity cls, String name,
|
||||
{bool setter = false, bool required = true}) {
|
||||
return _env.lookupLocalClassMember(cls, name,
|
||||
setter: setter, required: required) as T;
|
||||
return _env.lookupLocalClassMember(
|
||||
cls, Name(name, cls.library.canonicalUri, isSetter: setter),
|
||||
required: required) as T;
|
||||
}
|
||||
|
||||
ConstructorEntity _findConstructor(ClassEntity cls, String name,
|
||||
|
@ -371,8 +373,10 @@ abstract class CommonElements {
|
|||
/// Returns the field that holds the internal name in the implementation class
|
||||
/// for `Symbol`.
|
||||
|
||||
FieldEntity get symbolField => _symbolImplementationField ??=
|
||||
_env.lookupLocalClassMember(symbolImplementationClass, '_name',
|
||||
FieldEntity get symbolField =>
|
||||
_symbolImplementationField ??= _env.lookupLocalClassMember(
|
||||
symbolImplementationClass,
|
||||
PrivateName('_name', symbolImplementationClass.library.canonicalUri),
|
||||
required: true) as FieldEntity;
|
||||
|
||||
InterfaceType get symbolImplementationType =>
|
||||
|
@ -395,10 +399,13 @@ abstract class CommonElements {
|
|||
late final ConstructorEntity mapLiteralConstructorEmpty =
|
||||
_env.lookupConstructor(mapLiteralClass, '_empty');
|
||||
late final FunctionEntity mapLiteralUntypedMaker =
|
||||
_env.lookupLocalClassMember(mapLiteralClass, '_makeLiteral')
|
||||
_env.lookupLocalClassMember(mapLiteralClass,
|
||||
PrivateName('_makeLiteral', mapLiteralClass.library.canonicalUri))
|
||||
as FunctionEntity;
|
||||
late final FunctionEntity mapLiteralUntypedEmptyMaker =
|
||||
_env.lookupLocalClassMember(mapLiteralClass,
|
||||
PrivateName('_makeEmpty', mapLiteralClass.library.canonicalUri))
|
||||
as FunctionEntity;
|
||||
late final FunctionEntity mapLiteralUntypedEmptyMaker = _env
|
||||
.lookupLocalClassMember(mapLiteralClass, '_makeEmpty') as FunctionEntity;
|
||||
|
||||
late final ClassEntity setLiteralClass =
|
||||
_findClass(_env.lookupLibrary(Uris.dart_collection), 'LinkedHashSet')!;
|
||||
|
@ -408,13 +415,17 @@ abstract class CommonElements {
|
|||
late final ConstructorEntity setLiteralConstructorEmpty =
|
||||
_env.lookupConstructor(setLiteralClass, '_empty');
|
||||
late final FunctionEntity setLiteralUntypedMaker =
|
||||
_env.lookupLocalClassMember(setLiteralClass, '_makeLiteral')
|
||||
_env.lookupLocalClassMember(setLiteralClass,
|
||||
PrivateName('_makeLiteral', setLiteralClass.library.canonicalUri))
|
||||
as FunctionEntity;
|
||||
late final FunctionEntity setLiteralUntypedEmptyMaker =
|
||||
_env.lookupLocalClassMember(setLiteralClass,
|
||||
PrivateName('_makeEmpty', setLiteralClass.library.canonicalUri))
|
||||
as FunctionEntity;
|
||||
late final FunctionEntity setLiteralUntypedEmptyMaker = _env
|
||||
.lookupLocalClassMember(setLiteralClass, '_makeEmpty') as FunctionEntity;
|
||||
|
||||
late final FunctionEntity objectNoSuchMethod = _env.lookupLocalClassMember(
|
||||
objectClass, Identifiers.noSuchMethod_) as FunctionEntity;
|
||||
objectClass, const PublicName(Identifiers.noSuchMethod_))
|
||||
as FunctionEntity;
|
||||
|
||||
bool isDefaultNoSuchMethodImplementation(FunctionEntity element) {
|
||||
ClassEntity? classElement = element.enclosingClass;
|
||||
|
@ -446,15 +457,16 @@ abstract class CommonElements {
|
|||
_findAsyncHelperFunction("_wrapJsFunctionForAsync");
|
||||
|
||||
FunctionEntity get yieldStar => _env.lookupLocalClassMember(
|
||||
_findAsyncHelperClass("_IterationMarker"), "yieldStar") as FunctionEntity;
|
||||
_findAsyncHelperClass("_IterationMarker"),
|
||||
const PublicName("yieldStar")) as FunctionEntity;
|
||||
|
||||
FunctionEntity get yieldSingle => _env.lookupLocalClassMember(
|
||||
_findAsyncHelperClass("_IterationMarker"), "yieldSingle")
|
||||
as FunctionEntity;
|
||||
_findAsyncHelperClass("_IterationMarker"),
|
||||
const PublicName("yieldSingle")) as FunctionEntity;
|
||||
|
||||
FunctionEntity get syncStarUncaughtError => _env.lookupLocalClassMember(
|
||||
_findAsyncHelperClass("_IterationMarker"), "uncaughtError")
|
||||
as FunctionEntity;
|
||||
_findAsyncHelperClass("_IterationMarker"),
|
||||
const PublicName("uncaughtError")) as FunctionEntity;
|
||||
|
||||
FunctionEntity get asyncStarHelper =>
|
||||
_findAsyncHelperFunction("_asyncStarHelper");
|
||||
|
@ -463,8 +475,8 @@ abstract class CommonElements {
|
|||
_findAsyncHelperFunction("_streamOfController");
|
||||
|
||||
FunctionEntity get endOfIteration => _env.lookupLocalClassMember(
|
||||
_findAsyncHelperClass("_IterationMarker"), "endOfIteration")
|
||||
as FunctionEntity;
|
||||
_findAsyncHelperClass("_IterationMarker"),
|
||||
const PublicName("endOfIteration")) as FunctionEntity;
|
||||
|
||||
ClassEntity get syncStarIterable =>
|
||||
_findAsyncHelperClass("_SyncStarIterable");
|
||||
|
@ -1247,17 +1259,16 @@ abstract class ElementEnvironment {
|
|||
|
||||
/// Lookup the member [name] in [cls], fail if the class is missing and
|
||||
/// [required].
|
||||
MemberEntity? lookupLocalClassMember(ClassEntity cls, String name,
|
||||
{bool setter = false, bool required = false});
|
||||
MemberEntity? lookupLocalClassMember(ClassEntity cls, Name name,
|
||||
{bool required = false});
|
||||
|
||||
/// Lookup the member [name] in [cls] and its superclasses.
|
||||
///
|
||||
/// Return `null` if the member is not found in the class or any superclass.
|
||||
MemberEntity? lookupClassMember(ClassEntity cls, String name,
|
||||
{bool setter = false}) {
|
||||
MemberEntity? lookupClassMember(ClassEntity cls, Name name) {
|
||||
ClassEntity? clsLocal = cls;
|
||||
while (clsLocal != null) {
|
||||
final entity = lookupLocalClassMember(clsLocal, name, setter: setter);
|
||||
final entity = lookupLocalClassMember(clsLocal, name);
|
||||
if (entity != null) return entity;
|
||||
|
||||
clsLocal = getSuperClass(clsLocal);
|
||||
|
|
|
@ -78,6 +78,8 @@ class Names {
|
|||
/// The name of the dynamic type.
|
||||
static const Name dynamic_ = PublicName('dynamic');
|
||||
|
||||
static const Name EQUALS_NAME = PublicName("==");
|
||||
|
||||
/// The name of the iterator property used in for-each loops.
|
||||
static const Name iterator = PublicName(Identifiers.iterator);
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@ import 'deferred_load/output_unit.dart' show OutputUnit, deferredPartFileName;
|
|||
import 'dump_info_javascript_monitor.dart';
|
||||
import 'elements/entities.dart';
|
||||
import 'elements/entity_utils.dart' as entity_utils;
|
||||
import 'elements/names.dart';
|
||||
import 'inferrer/abstract_value_domain.dart';
|
||||
import 'inferrer/types.dart'
|
||||
show GlobalTypeInferenceMemberResult, GlobalTypeInferenceResults;
|
||||
|
@ -281,8 +282,8 @@ class ElementInfoCollector {
|
|||
size: dumpInfoTask.sizeOf(element));
|
||||
state.entityToInfo[element] = closureInfo;
|
||||
|
||||
FunctionEntity callMethod = closedWorld.elementEnvironment
|
||||
.lookupClassMember(element, Identifiers.call);
|
||||
FunctionEntity callMethod =
|
||||
closedWorld.elementEnvironment.lookupClassMember(element, Names.call);
|
||||
|
||||
FunctionInfo functionInfo = visitFunction(callMethod);
|
||||
if (functionInfo == null) return null;
|
||||
|
@ -570,9 +571,11 @@ class KernelInfoCollector {
|
|||
clazz.members.forEach((ir.Member member) {
|
||||
final isSetter = member is ir.Procedure && member.isSetter;
|
||||
// clazz.members includes constructors
|
||||
MemberEntity memberEntity = environment.lookupLocalClassMember(
|
||||
classEntity, member.name.text,
|
||||
setter: isSetter) ??
|
||||
final name = Name(member.name.text,
|
||||
member.name.isPrivate ? member.name.library.importUri : null,
|
||||
isSetter: isSetter);
|
||||
MemberEntity memberEntity =
|
||||
environment.lookupLocalClassMember(classEntity, name) ??
|
||||
environment.lookupConstructor(classEntity, member.name.text);
|
||||
if (memberEntity == null) return;
|
||||
|
||||
|
@ -701,7 +704,7 @@ class KernelInfoCollector {
|
|||
final closureInfo = ClosureInfo.fromKernel(name: value.disambiguatedName);
|
||||
|
||||
FunctionEntity callMethod = closedWorld.elementEnvironment
|
||||
.lookupClassMember(closureClassEntity, Identifiers.call);
|
||||
.lookupClassMember(closureClassEntity, Names.call);
|
||||
final functionInfo = visitFunction(key.function,
|
||||
functionEntity: callMethod, localFunctionInfo: value);
|
||||
|
||||
|
@ -993,8 +996,8 @@ class DumpInfoAnnotator {
|
|||
kClosureInfo.outputUnit = _unitInfoForClass(element);
|
||||
kClosureInfo.size = dumpInfoTask.sizeOf(element);
|
||||
|
||||
FunctionEntity callMethod = closedWorld.elementEnvironment
|
||||
.lookupClassMember(element, Identifiers.call);
|
||||
FunctionEntity callMethod =
|
||||
closedWorld.elementEnvironment.lookupClassMember(element, Names.call);
|
||||
|
||||
final functionInfo =
|
||||
visitFunction(callMethod, disambiguatedElementName, isClosure: true);
|
||||
|
|
|
@ -6,18 +6,16 @@ library dart2js.elements.names;
|
|||
|
||||
import 'package:front_end/src/api_unstable/dart2js.dart' show $_;
|
||||
|
||||
import 'entities.dart' show LibraryEntity;
|
||||
|
||||
/// A [Name] represents the abstraction of a Dart identifier which takes privacy
|
||||
/// and setter into account.
|
||||
// TODO(johnniwinther): Try to share logic with [Selector].
|
||||
abstract class Name {
|
||||
/// Create a [Name] for an identifier [text]. If [text] begins with '_' a
|
||||
/// private name with respect to [library] is created. If [isSetter] is `true`
|
||||
/// the created name represents the setter name 'text='.
|
||||
factory Name(String text, LibraryEntity? library, {bool isSetter = false}) {
|
||||
/// private name with respect to library [uri] is created. If [isSetter] is
|
||||
/// `true` the created name represents the setter name 'text='.
|
||||
factory Name(String text, Uri? uri, {bool isSetter = false}) {
|
||||
if (isPrivateName(text)) {
|
||||
return PrivateName(text, library!, isSetter: isSetter);
|
||||
return PrivateName(text, uri!, isSetter: isSetter);
|
||||
}
|
||||
return PublicName(text, isSetter: isSetter);
|
||||
}
|
||||
|
@ -34,14 +32,14 @@ abstract class Name {
|
|||
/// is returned.
|
||||
Name get getter;
|
||||
|
||||
/// Returns the seeter name corresponding to this name. If this name is a
|
||||
/// getter name 'v' then the name 'v=' is returned, otherwsie the name itself
|
||||
/// Returns the setter name corresponding to this name. If this name is a
|
||||
/// getter name 'v' then the name 'v=' is returned, otherwise the name itself
|
||||
/// is returned.
|
||||
Name get setter;
|
||||
|
||||
/// Returns `true` if an entity of this name is accessible from library
|
||||
/// [element].
|
||||
bool isAccessibleFrom(LibraryEntity element);
|
||||
bool isAccessibleFrom(Uri uri);
|
||||
|
||||
/// Returns `true` if this name is private.
|
||||
bool get isPrivate;
|
||||
|
@ -51,8 +49,15 @@ abstract class Name {
|
|||
bool isSimilarTo(Name other);
|
||||
int get similarHashCode;
|
||||
|
||||
/// Returns `true` if this name has the name [text] and [library] as [other].
|
||||
///
|
||||
/// This is similar to `==` but doesn't take `isSetter` into account.
|
||||
bool matches(Name other);
|
||||
|
||||
/// If this name is private, returns the [Uri] for the library from which the
|
||||
/// name originates. Otherwise, returns `null`.
|
||||
// TODO(sra): Should this rather throw for public names?
|
||||
LibraryEntity? get library;
|
||||
Uri? get uri;
|
||||
|
||||
/// Returns `true` when [s] is private if used as an identifier.
|
||||
static bool isPrivateName(String s) => !s.isEmpty && s.codeUnitAt(0) == $_;
|
||||
|
@ -76,7 +81,7 @@ class PublicName implements Name {
|
|||
Name get setter => isSetter ? this : PublicName(text, isSetter: true);
|
||||
|
||||
@override
|
||||
bool isAccessibleFrom(LibraryEntity element) => true;
|
||||
bool isAccessibleFrom(Uri uri) => true;
|
||||
|
||||
@override
|
||||
bool get isPrivate => false;
|
||||
|
@ -97,7 +102,10 @@ class PublicName implements Name {
|
|||
int get similarHashCode => text.hashCode + 11 * isSetter.hashCode;
|
||||
|
||||
@override
|
||||
LibraryEntity? get library => null;
|
||||
bool matches(Name other) => text == other.text;
|
||||
|
||||
@override
|
||||
Uri? get uri => null;
|
||||
|
||||
@override
|
||||
String toString() => isSetter ? '$text=' : text;
|
||||
|
@ -105,34 +113,37 @@ class PublicName implements Name {
|
|||
|
||||
class PrivateName extends PublicName {
|
||||
@override
|
||||
final LibraryEntity library;
|
||||
final Uri uri;
|
||||
|
||||
PrivateName(String text, this.library, {bool isSetter = false})
|
||||
PrivateName(String text, this.uri, {bool isSetter = false})
|
||||
: super(text, isSetter: isSetter);
|
||||
|
||||
@override
|
||||
Name get getter => isSetter ? PrivateName(text, library) : this;
|
||||
Name get getter => isSetter ? PrivateName(text, uri) : this;
|
||||
|
||||
@override
|
||||
Name get setter {
|
||||
return isSetter ? this : PrivateName(text, library, isSetter: true);
|
||||
return isSetter ? this : PrivateName(text, uri, isSetter: true);
|
||||
}
|
||||
|
||||
@override
|
||||
bool isAccessibleFrom(LibraryEntity element) => library == element;
|
||||
bool isAccessibleFrom(Uri uri) => this.uri == uri;
|
||||
|
||||
@override
|
||||
bool get isPrivate => true;
|
||||
|
||||
@override
|
||||
int get hashCode => super.hashCode + 13 * library.hashCode;
|
||||
int get hashCode => super.hashCode + 13 * uri.hashCode;
|
||||
|
||||
@override
|
||||
bool operator ==(other) {
|
||||
if (other is! PrivateName) return false;
|
||||
return super == (other) && library == other.library;
|
||||
return super == (other) && uri == other.uri;
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() => '${library.name}#${super.toString()}';
|
||||
bool matches(Name other) => super.matches(other) && uri == other.uri;
|
||||
|
||||
@override
|
||||
String toString() => '${uri}#${super.toString()}';
|
||||
}
|
||||
|
|
|
@ -1472,7 +1472,7 @@ class KernelTypeGraphBuilder extends ir.Visitor<TypeInformation>
|
|||
// We have something like `Uint32List(len)`.
|
||||
int length = _findLength(arguments);
|
||||
MemberEntity member = _elementMap.elementEnvironment
|
||||
.lookupClassMember(constructor.enclosingClass, '[]');
|
||||
.lookupClassMember(constructor.enclosingClass, Names.INDEX_NAME);
|
||||
TypeInformation elementType = _inferrer.returnTypeOfMember(member);
|
||||
return _inferrer.concreteTypes.putIfAbsent(
|
||||
node,
|
||||
|
|
|
@ -560,10 +560,10 @@ class InferrerEngine implements interfaces.InferrerEngine {
|
|||
/// implement `call`.
|
||||
FunctionEntity _lookupCallMethod(ClassEntity cls) {
|
||||
FunctionEntity function =
|
||||
_elementEnvironment.lookupClassMember(cls, Identifiers.call);
|
||||
_elementEnvironment.lookupClassMember(cls, Names.call);
|
||||
if (function == null || function.isAbstract) {
|
||||
function =
|
||||
_elementEnvironment.lookupClassMember(cls, Identifiers.noSuchMethod_);
|
||||
_elementEnvironment.lookupClassMember(cls, Names.noSuchMethod_);
|
||||
}
|
||||
return function;
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ import 'package:kernel/core_types.dart' as ir;
|
|||
import '../common.dart';
|
||||
import '../common/elements.dart';
|
||||
import '../elements/entities.dart';
|
||||
import '../elements/names.dart';
|
||||
import '../elements/types.dart';
|
||||
import '../ordered_typeset.dart';
|
||||
import '../universe/call_structure.dart';
|
||||
|
@ -20,6 +21,11 @@ abstract class IrToElementMap {
|
|||
/// Returns the [DartType] corresponding to [type].
|
||||
DartType getDartType(ir.DartType type);
|
||||
|
||||
/// Returns the [Name] corresponding to [name].
|
||||
///
|
||||
/// If [setter] is `true`, the setter name is returned.
|
||||
Name getName(ir.Name name, {bool setter = false});
|
||||
|
||||
/// Returns the [MemberEntity] corresponding to the member [node].
|
||||
MemberEntity getMember(ir.Member node);
|
||||
|
||||
|
|
|
@ -648,7 +648,8 @@ class Namer extends ModularNamer {
|
|||
// Public names are easy.
|
||||
if (!originalName.isPrivate) return text;
|
||||
|
||||
LibraryEntity library = originalName.library;
|
||||
LibraryEntity library =
|
||||
_elementEnvironment.lookupLibrary(originalName.uri, required: true);
|
||||
|
||||
// The first library asking for a short private name wins.
|
||||
LibraryEntity owner =
|
||||
|
@ -888,13 +889,13 @@ class Namer extends ModularNamer {
|
|||
// No superclass uses the disambiguated name as a property name, so we can
|
||||
// use it for this field. This generates nicer field names since otherwise
|
||||
// the field name would have to be mangled.
|
||||
return _disambiguateMember(Name(element.name, element.library));
|
||||
return _disambiguateMember(
|
||||
Name(element.name, element.library.canonicalUri));
|
||||
}
|
||||
|
||||
bool _isShadowingSuperField(FieldEntity element) {
|
||||
assert(element.isField);
|
||||
String fieldName = element.name;
|
||||
bool isPrivate = Name.isPrivateName(fieldName);
|
||||
Name fieldName = element.memberName;
|
||||
LibraryEntity memberLibrary = element.library;
|
||||
ClassEntity lookupClass =
|
||||
_elementEnvironment.getSuperClass(element.enclosingClass);
|
||||
|
@ -903,7 +904,7 @@ class Namer extends ModularNamer {
|
|||
_elementEnvironment.lookupLocalClassMember(lookupClass, fieldName);
|
||||
if (foundMember != null) {
|
||||
if (foundMember.isField) {
|
||||
if (!isPrivate || memberLibrary == foundMember.library) {
|
||||
if (!fieldName.isPrivate || memberLibrary == foundMember.library) {
|
||||
// Private fields can only be shadowed by a field declared in the
|
||||
// same library.
|
||||
return true;
|
||||
|
@ -1030,8 +1031,10 @@ class Namer extends ModularNamer {
|
|||
jsAst.Name _disambiguateMember(Name originalName,
|
||||
[List<String> suffixes = const []]) {
|
||||
// Build a string encoding the library name, if the name is private.
|
||||
String libraryKey =
|
||||
originalName.isPrivate ? _generateLibraryKey(originalName.library) : '';
|
||||
String libraryKey = originalName.isPrivate
|
||||
? _generateLibraryKey(
|
||||
_elementEnvironment.lookupLibrary(originalName.uri, required: true))
|
||||
: '';
|
||||
|
||||
// In the unique key, separate the name parts by '@'.
|
||||
// This avoids clashes since the original names cannot contain that symbol.
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
library js_backend.backend.resolution_listener;
|
||||
|
||||
import '../common/elements.dart' show KCommonElements, KElementEnvironment;
|
||||
import '../common/names.dart' show Identifiers;
|
||||
import '../common/names.dart' show Identifiers, Names;
|
||||
import '../constants/values.dart';
|
||||
import '../deferred_load/deferred_load.dart';
|
||||
import '../elements/entities.dart';
|
||||
|
@ -160,8 +160,8 @@ class ResolutionEnqueuerListener extends EnqueuerListener {
|
|||
enqueuer.applyImpact(_customElementsAnalysis.flush());
|
||||
|
||||
for (ClassEntity cls in recentClasses) {
|
||||
MemberEntity element = _elementEnvironment.lookupLocalClassMember(
|
||||
cls, Identifiers.noSuchMethod_);
|
||||
MemberEntity element =
|
||||
_elementEnvironment.lookupLocalClassMember(cls, Names.noSuchMethod_);
|
||||
if (element != null &&
|
||||
element.isInstanceMember &&
|
||||
element.isFunction &&
|
||||
|
|
|
@ -9,7 +9,7 @@ library js_backend.runtime_types;
|
|||
import '../common.dart';
|
||||
import '../common/elements.dart'
|
||||
show ElementEnvironment, JCommonElements, JElementEnvironment;
|
||||
import '../common/names.dart' show Identifiers;
|
||||
import '../common/names.dart' show Names;
|
||||
import '../elements/entities.dart';
|
||||
import '../elements/types.dart';
|
||||
import '../js/js.dart' as jsAst;
|
||||
|
@ -769,7 +769,7 @@ ClassFunctionType _computeFunctionType(
|
|||
if (cls.isClosure) {
|
||||
// Use signature function if available.
|
||||
signatureFunction =
|
||||
elementEnvironment.lookupLocalClassMember(cls, Identifiers.signature);
|
||||
elementEnvironment.lookupLocalClassMember(cls, Names.signature);
|
||||
if (signatureFunction == null) {
|
||||
// In Dart 2, a closure only needs its function type if it has a
|
||||
// signature function.
|
||||
|
@ -780,7 +780,7 @@ ClassFunctionType _computeFunctionType(
|
|||
return null;
|
||||
}
|
||||
MemberEntity call =
|
||||
elementEnvironment.lookupLocalClassMember(cls, Identifiers.call);
|
||||
elementEnvironment.lookupLocalClassMember(cls, Names.call);
|
||||
if (call != null && call.isFunction) {
|
||||
FunctionEntity callFunction = call;
|
||||
FunctionType callType = elementEnvironment.getFunctionType(callFunction);
|
||||
|
|
|
@ -60,7 +60,7 @@ class JRecordField extends JField implements JRecordFieldInterface {
|
|||
|
||||
JRecordField(String name, this.box, {required bool isConst})
|
||||
: super(box.container.library as JLibrary, box.container as JClass,
|
||||
Name(name, box.container.library),
|
||||
Name(name, box.container.library.canonicalUri),
|
||||
isStatic: false, isAssignable: true, isConst: isConst);
|
||||
|
||||
factory JRecordField.readFromDataSource(DataSourceReader source) {
|
||||
|
@ -163,7 +163,7 @@ class JClosureField extends JField implements PrivatelyNamedJSEntity {
|
|||
: this.internal(
|
||||
containingClass.closureClassEntity.library,
|
||||
containingClass.closureClassEntity as JClosureClass,
|
||||
Name(name, containingClass.closureClassEntity.library),
|
||||
Name(name, containingClass.closureClassEntity.library.canonicalUri),
|
||||
declaredName,
|
||||
isAssignable: isAssignable,
|
||||
isConst: isConst);
|
||||
|
@ -183,7 +183,7 @@ class JClosureField extends JField implements PrivatelyNamedJSEntity {
|
|||
bool isAssignable = source.readBool();
|
||||
source.end(tag);
|
||||
return JClosureField.internal(
|
||||
cls.library, cls, Name(name, cls.library), declaredName,
|
||||
cls.library, cls, Name(name, cls.library.canonicalUri), declaredName,
|
||||
isAssignable: isAssignable, isConst: isConst);
|
||||
}
|
||||
|
||||
|
|
|
@ -172,7 +172,8 @@ class JsKernelToElementMap
|
|||
LibraryEntity newLibrary = libraries.getEntity(oldLibrary.libraryIndex);
|
||||
IndexedClass newClass =
|
||||
JClass(newLibrary, oldClass.name, isAbstract: oldClass.isAbstract);
|
||||
JClassEnv newEnv = env.convert(_elementMap, liveMemberUsage);
|
||||
JClassEnv newEnv = env.convert(_elementMap, liveMemberUsage,
|
||||
(ir.Library library) => libraryMap[library]);
|
||||
classMap[env.cls] = classes.register(newClass, data.convert(), newEnv);
|
||||
assert(newClass.classIndex == oldClass.classIndex);
|
||||
libraries.getEnv(newClass.library).registerClass(newClass.name, newEnv);
|
||||
|
@ -194,8 +195,7 @@ class JsKernelToElementMap
|
|||
ClassEntity newClass =
|
||||
oldClass != null ? classes.getEntity(oldClass.classIndex) : null;
|
||||
IndexedMember newMember;
|
||||
Name memberName = Name(oldMember.memberName.text, newLibrary,
|
||||
isSetter: oldMember.memberName.isSetter);
|
||||
Name memberName = oldMember.memberName;
|
||||
if (oldMember.isField) {
|
||||
IndexedField field = oldMember;
|
||||
newMember = JField(newLibrary, newClass, memberName,
|
||||
|
@ -610,11 +610,10 @@ class JsKernelToElementMap
|
|||
});
|
||||
}
|
||||
|
||||
MemberEntity lookupClassMember(IndexedClass cls, String name,
|
||||
{bool setter = false}) {
|
||||
MemberEntity lookupClassMember(IndexedClass cls, Name name) {
|
||||
assert(checkFamily(cls));
|
||||
JClassEnv classEnv = classes.getEnv(cls);
|
||||
return classEnv.lookupMember(this, name, setter: setter);
|
||||
return classEnv.lookupMember(this, name);
|
||||
}
|
||||
|
||||
ConstructorEntity lookupConstructor(IndexedClass cls, String name) {
|
||||
|
@ -647,7 +646,7 @@ class JsKernelToElementMap
|
|||
assert(checkFamily(cls));
|
||||
if (data is JClassDataImpl && !data.isCallTypeComputed) {
|
||||
MemberEntity callMember =
|
||||
_elementEnvironment.lookupClassMember(cls, Identifiers.call);
|
||||
_elementEnvironment.lookupClassMember(cls, Names.call);
|
||||
if (callMember is FunctionEntity &&
|
||||
callMember.isFunction &&
|
||||
!callMember.isAbstract) {
|
||||
|
@ -1237,8 +1236,9 @@ class JsKernelToElementMap
|
|||
}
|
||||
|
||||
@override
|
||||
Name getName(ir.Name name) {
|
||||
return Name(name.text, name.isPrivate ? getLibrary(name.library) : null);
|
||||
Name getName(ir.Name name, {bool setter = false}) {
|
||||
return Name(name.text, name.isPrivate ? name.library.importUri : null,
|
||||
isSetter: setter);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -1305,13 +1305,13 @@ class JsKernelToElementMap
|
|||
|
||||
Selector getGetterSelector(ir.Name irName) {
|
||||
Name name =
|
||||
Name(irName.text, irName.isPrivate ? getLibrary(irName.library) : null);
|
||||
Name(irName.text, irName.isPrivate ? irName.library.importUri : null);
|
||||
return Selector.getter(name);
|
||||
}
|
||||
|
||||
Selector getSetterSelector(ir.Name irName) {
|
||||
Name name =
|
||||
Name(irName.text, irName.isPrivate ? getLibrary(irName.library) : null);
|
||||
Name(irName.text, irName.isPrivate ? irName.library.importUri : null);
|
||||
return Selector.setter(name);
|
||||
}
|
||||
|
||||
|
@ -1526,8 +1526,8 @@ class JsKernelToElementMap
|
|||
FunctionEntity getSuperNoSuchMethod(ClassEntity cls) {
|
||||
while (cls != null) {
|
||||
cls = elementEnvironment.getSuperClass(cls);
|
||||
MemberEntity member = elementEnvironment.lookupLocalClassMember(
|
||||
cls, Identifiers.noSuchMethod_);
|
||||
MemberEntity member =
|
||||
elementEnvironment.lookupLocalClassMember(cls, Names.noSuchMethod_);
|
||||
if (member != null && !member.isAbstract) {
|
||||
if (member.isFunction) {
|
||||
FunctionEntity function = member;
|
||||
|
@ -1541,7 +1541,7 @@ class JsKernelToElementMap
|
|||
}
|
||||
}
|
||||
FunctionEntity function = elementEnvironment.lookupLocalClassMember(
|
||||
commonElements.objectClass, Identifiers.noSuchMethod_);
|
||||
commonElements.objectClass, Names.noSuchMethod_);
|
||||
assert(function != null,
|
||||
failedAt(cls, "No super noSuchMethod found for class $cls."));
|
||||
return function;
|
||||
|
@ -1759,7 +1759,7 @@ class JsKernelToElementMap
|
|||
InterfaceType memberThisType,
|
||||
ir.VariableDeclaration variable,
|
||||
BoxLocal boxLocal,
|
||||
Map<String, MemberEntity> memberMap) {
|
||||
Map<Name, MemberEntity> memberMap) {
|
||||
JRecordField boxedField =
|
||||
JRecordField(variable.name, boxLocal, isConst: variable.isConst);
|
||||
members.register(
|
||||
|
@ -1768,7 +1768,7 @@ class JsKernelToElementMap
|
|||
ClosureMemberDefinition(computeSourceSpanFromTreeNode(variable),
|
||||
MemberKind.closureField, variable),
|
||||
memberThisType));
|
||||
memberMap[boxedField.name] = boxedField;
|
||||
memberMap[boxedField.memberName] = boxedField;
|
||||
|
||||
return boxedField;
|
||||
}
|
||||
|
@ -1783,7 +1783,7 @@ class JsKernelToElementMap
|
|||
if (info.boxedVariables.isNotEmpty) {
|
||||
NodeBox box = info.capturedVariablesAccessor;
|
||||
|
||||
Map<String, IndexedMember> memberMap = {};
|
||||
Map<Name, IndexedMember> memberMap = {};
|
||||
closureMigrated.JRecord container =
|
||||
closureMigrated.JRecord(member.library, box.name);
|
||||
BoxLocal boxLocal = BoxLocal(container);
|
||||
|
@ -1851,7 +1851,7 @@ class JsKernelToElementMap
|
|||
}
|
||||
String name = _computeClosureName(node);
|
||||
SourceSpan location = computeSourceSpanFromTreeNode(node);
|
||||
Map<String, IndexedMember> memberMap = {};
|
||||
Map<Name, IndexedMember> memberMap = {};
|
||||
|
||||
JClass classEntity = closureMigrated.JClosureClass(enclosingLibrary, name);
|
||||
// Create a classData and set up the interfaces and subclass
|
||||
|
@ -1918,7 +1918,7 @@ class JsKernelToElementMap
|
|||
closureData.callType,
|
||||
node,
|
||||
typeVariableAccess));
|
||||
memberMap[callMethod.name] = closureClassInfo.callMethod = callMethod;
|
||||
memberMap[callMethod.memberName] = closureClassInfo.callMethod = callMethod;
|
||||
return closureClassInfo;
|
||||
}
|
||||
|
||||
|
@ -1928,7 +1928,7 @@ class JsKernelToElementMap
|
|||
InterfaceType memberThisType,
|
||||
KernelScopeInfo info,
|
||||
Map<ir.VariableDeclaration, JRecordField> recordFieldsVisibleInScope,
|
||||
Map<String, MemberEntity> memberMap) {
|
||||
Map<Name, MemberEntity> memberMap) {
|
||||
// TODO(efortuna): Limit field number usage to when we need to distinguish
|
||||
// between two variables with the same name from different scopes.
|
||||
int fieldNumber = 0;
|
||||
|
@ -2027,7 +2027,7 @@ class JsKernelToElementMap
|
|||
ir.VariableDeclaration capturedLocal,
|
||||
JsClosureClassInfo closureClassInfo,
|
||||
InterfaceType memberThisType,
|
||||
Map<String, MemberEntity> memberMap,
|
||||
Map<Name, MemberEntity> memberMap,
|
||||
ir.TreeNode sourceNode,
|
||||
Map<ir.VariableDeclaration, JRecordField> recordFieldsVisibleInScope,
|
||||
int fieldNumber) {
|
||||
|
@ -2051,7 +2051,7 @@ class JsKernelToElementMap
|
|||
ClosureMemberDefinition(computeSourceSpanFromTreeNode(sourceNode),
|
||||
MemberKind.closureField, sourceNode),
|
||||
memberThisType));
|
||||
memberMap[closureField.name] = closureField;
|
||||
memberMap[closureField.memberName] = closureField;
|
||||
closureClassInfo.registerFieldForLocal(recordField.box, closureField);
|
||||
closureClassInfo.registerFieldForBoxedVariable(capturedLocal, recordField);
|
||||
return true;
|
||||
|
@ -2059,7 +2059,7 @@ class JsKernelToElementMap
|
|||
|
||||
void _constructSignatureMethod(
|
||||
JsClosureClassInfo closureClassInfo,
|
||||
Map<String, MemberEntity> memberMap,
|
||||
Map<Name, MemberEntity> memberMap,
|
||||
ir.FunctionNode closureSourceNode,
|
||||
InterfaceType memberThisType,
|
||||
SourceSpan location,
|
||||
|
@ -2074,7 +2074,7 @@ class JsKernelToElementMap
|
|||
memberThisType,
|
||||
closureSourceNode.typeParameters,
|
||||
typeVariableAccess));
|
||||
memberMap[signatureMethod.name] =
|
||||
memberMap[signatureMethod.memberName] =
|
||||
closureClassInfo.signatureMethod = signatureMethod;
|
||||
}
|
||||
|
||||
|
@ -2082,7 +2082,7 @@ class JsKernelToElementMap
|
|||
String name,
|
||||
JsClosureClassInfo closureClassInfo,
|
||||
InterfaceType memberThisType,
|
||||
Map<String, MemberEntity> memberMap,
|
||||
Map<Name, MemberEntity> memberMap,
|
||||
ir.TreeNode sourceNode,
|
||||
bool isConst,
|
||||
bool isAssignable,
|
||||
|
@ -2097,7 +2097,7 @@ class JsKernelToElementMap
|
|||
ClosureMemberDefinition(computeSourceSpanFromTreeNode(sourceNode),
|
||||
MemberKind.closureField, sourceNode),
|
||||
memberThisType));
|
||||
memberMap[closureField.name] = closureField;
|
||||
memberMap[closureField.memberName] = closureField;
|
||||
return closureField;
|
||||
}
|
||||
|
||||
|
@ -2361,10 +2361,9 @@ class JsElementEnvironment extends ElementEnvironment
|
|||
}
|
||||
|
||||
@override
|
||||
MemberEntity lookupLocalClassMember(ClassEntity cls, String name,
|
||||
{bool setter = false, bool required = false}) {
|
||||
MemberEntity member =
|
||||
elementMap.lookupClassMember(cls, name, setter: setter);
|
||||
MemberEntity lookupLocalClassMember(ClassEntity cls, Name name,
|
||||
{bool required = false}) {
|
||||
MemberEntity member = elementMap.lookupClassMember(cls, name);
|
||||
if (member == null && required) {
|
||||
throw failedAt(CURRENT_ELEMENT_SPANNABLE,
|
||||
"The member '$name' was not found in ${cls.name}.");
|
||||
|
|
|
@ -281,8 +281,8 @@ class JGenerativeConstructor extends JConstructor {
|
|||
bool isExternal = source.readBool();
|
||||
bool isConst = source.readBool();
|
||||
source.end(tag);
|
||||
return JGenerativeConstructor(
|
||||
enclosingClass, Name(name, enclosingClass.library), parameterStructure,
|
||||
return JGenerativeConstructor(enclosingClass,
|
||||
Name(name, enclosingClass.library.canonicalUri), parameterStructure,
|
||||
isExternal: isExternal, isConst: isConst);
|
||||
}
|
||||
|
||||
|
@ -331,8 +331,8 @@ class JFactoryConstructor extends JConstructor {
|
|||
bool isConst = source.readBool();
|
||||
bool isFromEnvironmentConstructor = source.readBool();
|
||||
source.end(tag);
|
||||
return JFactoryConstructor(
|
||||
enclosingClass, Name(name, enclosingClass.library), parameterStructure,
|
||||
return JFactoryConstructor(enclosingClass,
|
||||
Name(name, enclosingClass.library.canonicalUri), parameterStructure,
|
||||
isExternal: isExternal,
|
||||
isConst: isConst,
|
||||
isFromEnvironmentConstructor: isFromEnvironmentConstructor);
|
||||
|
@ -423,7 +423,7 @@ class JMethod extends JFunction {
|
|||
library = enclosingClass.library;
|
||||
break;
|
||||
}
|
||||
String name = source.readString();
|
||||
Name memberName = source.readMemberName();
|
||||
ParameterStructure parameterStructure =
|
||||
ParameterStructure.readFromDataSource(source);
|
||||
AsyncMarker asyncMarker = source.readEnum(AsyncMarker.values);
|
||||
|
@ -431,8 +431,8 @@ class JMethod extends JFunction {
|
|||
bool isExternal = source.readBool();
|
||||
bool isAbstract = source.readBool();
|
||||
source.end(tag);
|
||||
return JMethod(library, enclosingClass, Name(name, library),
|
||||
parameterStructure, asyncMarker,
|
||||
return JMethod(
|
||||
library, enclosingClass, memberName, parameterStructure, asyncMarker,
|
||||
isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
|
||||
}
|
||||
|
||||
|
@ -447,7 +447,7 @@ class JMethod extends JFunction {
|
|||
sink.writeEnum(MemberContextKind.library);
|
||||
sink.writeLibrary(library);
|
||||
}
|
||||
sink.writeString(name);
|
||||
sink.writeMemberName(memberName);
|
||||
parameterStructure.writeToDataSink(sink);
|
||||
sink.writeEnum(asyncMarker);
|
||||
sink.writeBool(isStatic);
|
||||
|
@ -531,13 +531,13 @@ class JGetter extends JFunction {
|
|||
library = enclosingClass.library;
|
||||
break;
|
||||
}
|
||||
String name = source.readString();
|
||||
Name memberName = source.readMemberName();
|
||||
AsyncMarker asyncMarker = source.readEnum(AsyncMarker.values);
|
||||
bool isStatic = source.readBool();
|
||||
bool isExternal = source.readBool();
|
||||
bool isAbstract = source.readBool();
|
||||
source.end(tag);
|
||||
return JGetter(library, enclosingClass, Name(name, library), asyncMarker,
|
||||
return JGetter(library, enclosingClass, memberName, asyncMarker,
|
||||
isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
|
||||
}
|
||||
|
||||
|
@ -552,7 +552,7 @@ class JGetter extends JFunction {
|
|||
sink.writeEnum(MemberContextKind.library);
|
||||
sink.writeLibrary(library);
|
||||
}
|
||||
sink.writeString(name);
|
||||
sink.writeMemberName(memberName);
|
||||
sink.writeEnum(asyncMarker);
|
||||
sink.writeBool(isStatic);
|
||||
sink.writeBool(isExternal);
|
||||
|
@ -597,12 +597,12 @@ class JSetter extends JFunction {
|
|||
library = enclosingClass.library;
|
||||
break;
|
||||
}
|
||||
String name = source.readString();
|
||||
Name memberName = source.readMemberName();
|
||||
bool isStatic = source.readBool();
|
||||
bool isExternal = source.readBool();
|
||||
bool isAbstract = source.readBool();
|
||||
source.end(tag);
|
||||
return JSetter(library, enclosingClass, Name(name, library, isSetter: true),
|
||||
return JSetter(library, enclosingClass, memberName,
|
||||
isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
|
||||
}
|
||||
|
||||
|
@ -617,7 +617,7 @@ class JSetter extends JFunction {
|
|||
sink.writeEnum(MemberContextKind.library);
|
||||
sink.writeLibrary(library);
|
||||
}
|
||||
sink.writeString(name);
|
||||
sink.writeMemberName(memberName);
|
||||
sink.writeBool(isStatic);
|
||||
sink.writeBool(isExternal);
|
||||
sink.writeBool(isAbstract);
|
||||
|
@ -664,12 +664,12 @@ class JField extends JMember implements FieldEntity, IndexedField {
|
|||
library = enclosingClass.library;
|
||||
break;
|
||||
}
|
||||
String name = source.readString();
|
||||
Name memberName = source.readMemberName();
|
||||
bool isStatic = source.readBool();
|
||||
bool isAssignable = source.readBool();
|
||||
bool isConst = source.readBool();
|
||||
source.end(tag);
|
||||
return JField(library, enclosingClass, Name(name, library),
|
||||
return JField(library, enclosingClass, memberName,
|
||||
isStatic: isStatic, isAssignable: isAssignable, isConst: isConst);
|
||||
}
|
||||
|
||||
|
@ -684,7 +684,7 @@ class JField extends JMember implements FieldEntity, IndexedField {
|
|||
sink.writeEnum(MemberContextKind.library);
|
||||
sink.writeLibrary(library);
|
||||
}
|
||||
sink.writeString(name);
|
||||
sink.writeMemberName(memberName);
|
||||
sink.writeBool(isStatic);
|
||||
sink.writeBool(isAssignable);
|
||||
sink.writeBool(isConst);
|
||||
|
|
|
@ -11,6 +11,7 @@ import 'package:kernel/ast.dart' as ir;
|
|||
import '../constants/values.dart';
|
||||
import '../elements/entities.dart';
|
||||
import '../elements/indexed.dart';
|
||||
import '../elements/names.dart';
|
||||
import '../elements/types.dart';
|
||||
import '../ir/element_map.dart';
|
||||
import '../ir/static_type_cache.dart';
|
||||
|
@ -217,8 +218,7 @@ abstract class JClassEnv {
|
|||
/// Return the [MemberEntity] for the member [name] in the class. If [setter]
|
||||
/// is `true`, the setter or assignable field corresponding to [name] is
|
||||
/// returned.
|
||||
MemberEntity lookupMember(IrToElementMap elementMap, String name,
|
||||
{bool setter = false});
|
||||
MemberEntity lookupMember(IrToElementMap elementMap, Name name);
|
||||
|
||||
/// Calls [f] for each member of [cls].
|
||||
void forEachMember(IrToElementMap elementMap, void f(MemberEntity member));
|
||||
|
@ -244,8 +244,7 @@ class JClassEnvImpl implements JClassEnv {
|
|||
@override
|
||||
final ir.Class cls;
|
||||
final Map<String, ir.Member> _constructorMap;
|
||||
final Map<String, ir.Member> _memberMap;
|
||||
final Map<String, ir.Member> _setterMap;
|
||||
final Map<Name, ir.Member> _memberMap;
|
||||
final List<ir.Member> _members; // in declaration order.
|
||||
@override
|
||||
final bool isMixinApplicationWithMembers;
|
||||
|
@ -253,23 +252,20 @@ class JClassEnvImpl implements JClassEnv {
|
|||
/// Constructor bodies created for this class.
|
||||
List<ConstructorBodyEntity> _constructorBodyList;
|
||||
|
||||
JClassEnvImpl(this.cls, this._constructorMap, this._memberMap,
|
||||
this._setterMap, this._members, this.isMixinApplicationWithMembers);
|
||||
JClassEnvImpl(this.cls, this._constructorMap, this._memberMap, this._members,
|
||||
this.isMixinApplicationWithMembers);
|
||||
|
||||
factory JClassEnvImpl.readFromDataSource(DataSourceReader source) {
|
||||
source.begin(tag);
|
||||
ir.Class cls = source.readClassNode();
|
||||
Map<String, ir.Member> constructorMap =
|
||||
source.readStringMap(source.readMemberNode);
|
||||
Map<String, ir.Member> memberMap =
|
||||
source.readStringMap(source.readMemberNode);
|
||||
Map<String, ir.Member> setterMap =
|
||||
source.readStringMap(source.readMemberNode);
|
||||
Map<Name, ir.Member> memberMap = source.readNameMap(source.readMemberNode);
|
||||
List<ir.Member> members = source.readMemberNodes();
|
||||
bool isSuperMixinApplication = source.readBool();
|
||||
source.end(tag);
|
||||
return JClassEnvImpl(cls, constructorMap, memberMap, setterMap, members,
|
||||
isSuperMixinApplication);
|
||||
return JClassEnvImpl(
|
||||
cls, constructorMap, memberMap, members, isSuperMixinApplication);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -278,8 +274,7 @@ class JClassEnvImpl implements JClassEnv {
|
|||
sink.begin(tag);
|
||||
sink.writeClassNode(cls);
|
||||
sink.writeStringMap(_constructorMap, sink.writeMemberNode);
|
||||
sink.writeStringMap(_memberMap, sink.writeMemberNode);
|
||||
sink.writeStringMap(_setterMap, sink.writeMemberNode);
|
||||
sink.writeNameMap(_memberMap, sink.writeMemberNode);
|
||||
sink.writeMemberNodes(_members);
|
||||
sink.writeBool(isMixinApplicationWithMembers);
|
||||
sink.end(tag);
|
||||
|
@ -289,9 +284,8 @@ class JClassEnvImpl implements JClassEnv {
|
|||
bool get isUnnamedMixinApplication => cls.isAnonymousMixin;
|
||||
|
||||
@override
|
||||
MemberEntity lookupMember(IrToElementMap elementMap, String name,
|
||||
{bool setter = false}) {
|
||||
ir.Member member = setter ? _setterMap[name] : _memberMap[name];
|
||||
MemberEntity lookupMember(IrToElementMap elementMap, Name name) {
|
||||
ir.Member member = _memberMap[name];
|
||||
return member != null ? elementMap.getMember(member) : null;
|
||||
}
|
||||
|
||||
|
@ -332,14 +326,14 @@ class RecordEnv implements JClassEnv {
|
|||
/// debugging data stream.
|
||||
static const String tag = 'record-env';
|
||||
|
||||
final Map<String, IndexedMember> _memberMap;
|
||||
final Map<Name, IndexedMember> _memberMap;
|
||||
|
||||
RecordEnv(this._memberMap);
|
||||
|
||||
factory RecordEnv.readFromDataSource(DataSourceReader source) {
|
||||
source.begin(tag);
|
||||
Map<String, IndexedMember> _memberMap =
|
||||
source.readStringMap(() => source.readMember());
|
||||
Map<Name, IndexedMember> _memberMap =
|
||||
source.readNameMap(() => source.readMember());
|
||||
source.end(tag);
|
||||
return RecordEnv(_memberMap);
|
||||
}
|
||||
|
@ -348,7 +342,7 @@ class RecordEnv implements JClassEnv {
|
|||
void writeToDataSink(DataSinkWriter sink) {
|
||||
sink.writeEnum(JClassEnvKind.record);
|
||||
sink.begin(tag);
|
||||
sink.writeStringMap(
|
||||
sink.writeNameMap(
|
||||
_memberMap, (IndexedMember member) => sink.writeMember(member));
|
||||
sink.end(tag);
|
||||
}
|
||||
|
@ -376,8 +370,7 @@ class RecordEnv implements JClassEnv {
|
|||
}
|
||||
|
||||
@override
|
||||
MemberEntity lookupMember(IrToElementMap elementMap, String name,
|
||||
{bool setter = false}) {
|
||||
MemberEntity lookupMember(IrToElementMap elementMap, Name name) {
|
||||
return _memberMap[name];
|
||||
}
|
||||
|
||||
|
@ -396,12 +389,12 @@ class ClosureClassEnv extends RecordEnv {
|
|||
/// debugging data stream.
|
||||
static const String tag = 'closure-class-env';
|
||||
|
||||
ClosureClassEnv(Map<String, MemberEntity> memberMap) : super(memberMap);
|
||||
ClosureClassEnv(Map<Name, MemberEntity> memberMap) : super(memberMap);
|
||||
|
||||
factory ClosureClassEnv.readFromDataSource(DataSourceReader source) {
|
||||
source.begin(tag);
|
||||
Map<String, IndexedMember> _memberMap =
|
||||
source.readStringMap(() => source.readMember());
|
||||
Map<Name, IndexedMember> _memberMap =
|
||||
source.readNameMap(() => source.readMember());
|
||||
source.end(tag);
|
||||
return ClosureClassEnv(_memberMap);
|
||||
}
|
||||
|
@ -410,20 +403,10 @@ class ClosureClassEnv extends RecordEnv {
|
|||
void writeToDataSink(DataSinkWriter sink) {
|
||||
sink.writeEnum(JClassEnvKind.closure);
|
||||
sink.begin(tag);
|
||||
sink.writeStringMap(
|
||||
sink.writeNameMap(
|
||||
_memberMap, (IndexedMember member) => sink.writeMember(member));
|
||||
sink.end(tag);
|
||||
}
|
||||
|
||||
@override
|
||||
MemberEntity lookupMember(IrToElementMap elementMap, String name,
|
||||
{bool setter = false}) {
|
||||
if (setter) {
|
||||
// All closure fields are final.
|
||||
return null;
|
||||
}
|
||||
return super.lookupMember(elementMap, name, setter: setter);
|
||||
}
|
||||
}
|
||||
|
||||
/// Enum used for identifying [JClassData] subclasses in serialization.
|
||||
|
|
|
@ -545,11 +545,9 @@ class JsClosedWorld implements JClosedWorld {
|
|||
@override
|
||||
bool hasElementIn(ClassEntity cls, Name name, Entity element) {
|
||||
while (cls != null) {
|
||||
MemberEntity member = elementEnvironment
|
||||
.lookupLocalClassMember(cls, name.text, setter: name.isSetter);
|
||||
if (member != null &&
|
||||
!member.isAbstract &&
|
||||
(!name.isPrivate || member.library == name.library)) {
|
||||
MemberEntity member =
|
||||
elementEnvironment.lookupLocalClassMember(cls, name);
|
||||
if (member != null && !member.isAbstract) {
|
||||
return member == element;
|
||||
}
|
||||
cls = elementEnvironment.getSuperClass(cls);
|
||||
|
@ -563,8 +561,8 @@ class JsClosedWorld implements JClosedWorld {
|
|||
{ClassEntity stopAtSuperclass}) {
|
||||
assert(classHierarchy.isInstantiated(cls),
|
||||
failedAt(cls, '$cls has not been instantiated.'));
|
||||
MemberEntity element = elementEnvironment
|
||||
.lookupClassMember(cls, selector.name, setter: selector.isSetter);
|
||||
MemberEntity element =
|
||||
elementEnvironment.lookupClassMember(cls, selector.memberName);
|
||||
if (element == null) return false;
|
||||
|
||||
if (element.isAbstract) {
|
||||
|
|
|
@ -14,7 +14,6 @@ import '../constants/values.dart';
|
|||
import '../deferred_load/output_unit.dart' show OutputUnit, OutputUnitData;
|
||||
import '../elements/entities.dart';
|
||||
import '../elements/indexed.dart';
|
||||
import '../elements/names.dart';
|
||||
import '../elements/types.dart';
|
||||
import '../inferrer/abstract_value_strategy.dart';
|
||||
import '../ir/closure.dart';
|
||||
|
@ -302,17 +301,7 @@ class JsClosedWorldBuilder {
|
|||
Set<FunctionEntity> methodsNeedingSignature =
|
||||
map.toBackendFunctionSet(rtiNeed.methodsNeedingSignature);
|
||||
Set<Selector> selectorsNeedingTypeArguments =
|
||||
rtiNeed.selectorsNeedingTypeArguments.map((Selector selector) {
|
||||
if (selector.memberName.isPrivate) {
|
||||
return Selector(
|
||||
selector.kind,
|
||||
PrivateName(selector.memberName.text,
|
||||
map.toBackendLibrary(selector.memberName.library),
|
||||
isSetter: selector.memberName.isSetter),
|
||||
selector.callStructure);
|
||||
}
|
||||
return selector;
|
||||
}).toSet();
|
||||
rtiNeed.selectorsNeedingTypeArguments;
|
||||
return RuntimeTypesNeedImpl(
|
||||
_elementEnvironment,
|
||||
classesNeedingTypeArguments,
|
||||
|
|
|
@ -258,11 +258,11 @@ class KernelToElementMap
|
|||
return cls;
|
||||
}
|
||||
|
||||
MemberEntity lookupClassMember(IndexedClass cls, String name,
|
||||
MemberEntity lookupClassMember(IndexedClass cls, Name name,
|
||||
{bool setter = false}) {
|
||||
assert(checkFamily(cls));
|
||||
KClassEnv classEnv = classes.getEnv(cls);
|
||||
return classEnv.lookupMember(this, name, setter: setter);
|
||||
return classEnv.lookupMember(this, name);
|
||||
}
|
||||
|
||||
ConstructorEntity lookupConstructor(IndexedClass cls, String name) {
|
||||
|
@ -303,7 +303,7 @@ class KernelToElementMap
|
|||
assert(checkFamily(cls));
|
||||
if (data is KClassDataImpl && !data.isCallTypeComputed) {
|
||||
MemberEntity callMember =
|
||||
_elementEnvironment.lookupClassMember(cls, Identifiers.call);
|
||||
_elementEnvironment.lookupClassMember(cls, Names.call);
|
||||
if (callMember is FunctionEntity &&
|
||||
callMember.isFunction &&
|
||||
!callMember.isAbstract) {
|
||||
|
@ -898,10 +898,10 @@ class KernelToElementMap
|
|||
: ir.EvaluationMode.strong);
|
||||
}
|
||||
|
||||
/// Returns the [Name] corresponding to [name].
|
||||
@override
|
||||
Name getName(ir.Name name) {
|
||||
return Name(name.text, name.isPrivate ? getLibrary(name.library) : null);
|
||||
Name getName(ir.Name name, {bool setter = false}) {
|
||||
return Name(name.text, name.isPrivate ? name.library.importUri : null,
|
||||
isSetter: setter);
|
||||
}
|
||||
|
||||
/// Returns the [CallStructure] corresponding to the [arguments].
|
||||
|
@ -964,13 +964,13 @@ class KernelToElementMap
|
|||
|
||||
Selector getGetterSelector(ir.Name irName) {
|
||||
Name name =
|
||||
Name(irName.text, irName.isPrivate ? getLibrary(irName.library) : null);
|
||||
Name(irName.text, irName.isPrivate ? irName.library.importUri : null);
|
||||
return Selector.getter(name);
|
||||
}
|
||||
|
||||
Selector getSetterSelector(ir.Name irName) {
|
||||
Name name =
|
||||
Name(irName.text, irName.isPrivate ? getLibrary(irName.library) : null);
|
||||
Name(irName.text, irName.isPrivate ? irName.library.importUri : null);
|
||||
return Selector.setter(name);
|
||||
}
|
||||
|
||||
|
@ -1221,8 +1221,8 @@ class KernelToElementMap
|
|||
FunctionEntity getSuperNoSuchMethod(ClassEntity cls) {
|
||||
while (cls != null) {
|
||||
cls = elementEnvironment.getSuperClass(cls);
|
||||
MemberEntity member = elementEnvironment.lookupLocalClassMember(
|
||||
cls, Identifiers.noSuchMethod_);
|
||||
MemberEntity member =
|
||||
elementEnvironment.lookupLocalClassMember(cls, Names.noSuchMethod_);
|
||||
if (member != null && !member.isAbstract) {
|
||||
if (member.isFunction) {
|
||||
FunctionEntity function = member;
|
||||
|
@ -1236,7 +1236,7 @@ class KernelToElementMap
|
|||
}
|
||||
}
|
||||
FunctionEntity function = elementEnvironment.lookupLocalClassMember(
|
||||
commonElements.objectClass, Identifiers.noSuchMethod_);
|
||||
commonElements.objectClass, Names.noSuchMethod_);
|
||||
assert(function != null,
|
||||
failedAt(cls, "No super noSuchMethod found for class $cls."));
|
||||
return function;
|
||||
|
@ -1899,10 +1899,9 @@ class KernelElementEnvironment extends ElementEnvironment
|
|||
}
|
||||
|
||||
@override
|
||||
MemberEntity lookupLocalClassMember(ClassEntity cls, String name,
|
||||
{bool setter = false, bool required = false}) {
|
||||
MemberEntity member =
|
||||
elementMap.lookupClassMember(cls, name, setter: setter);
|
||||
MemberEntity lookupLocalClassMember(ClassEntity cls, Name name,
|
||||
{bool required = false}) {
|
||||
MemberEntity member = elementMap.lookupClassMember(cls, name);
|
||||
if (member == null && required) {
|
||||
throw failedAt(CURRENT_ELEMENT_SPANNABLE,
|
||||
"The member '$name' was not found in ${cls.name}.");
|
||||
|
|
|
@ -16,6 +16,7 @@ import 'package:collection/collection.dart' show mergeSort; // a stable sort.
|
|||
import '../common.dart';
|
||||
import '../constants/values.dart';
|
||||
import '../elements/entities.dart';
|
||||
import '../elements/names.dart';
|
||||
import '../elements/types.dart';
|
||||
import '../ir/element_map.dart';
|
||||
import '../ir/static_type_cache.dart';
|
||||
|
@ -162,7 +163,7 @@ class KLibraryEnv {
|
|||
|
||||
/// Convert this [KLibraryEnv] to a corresponding [JLibraryEnv] containing
|
||||
/// only the members in [liveMembers].
|
||||
JLibraryEnv convert(IrToElementMap elementMap,
|
||||
JLibraryEnv convert(IrToElementMap kElementMap,
|
||||
Map<MemberEntity, MemberUsage> liveMemberUsage) {
|
||||
Map<String, ir.Member> memberMap;
|
||||
Map<String, ir.Member> setterMap;
|
||||
|
@ -171,7 +172,7 @@ class KLibraryEnv {
|
|||
} else {
|
||||
memberMap = <String, ir.Member>{};
|
||||
_memberMap.forEach((String name, ir.Member node) {
|
||||
MemberEntity member = elementMap.getMember(node);
|
||||
MemberEntity member = kElementMap.getMember(node);
|
||||
if (liveMemberUsage.containsKey(member)) {
|
||||
memberMap[name] = node;
|
||||
}
|
||||
|
@ -182,7 +183,7 @@ class KLibraryEnv {
|
|||
} else {
|
||||
setterMap = <String, ir.Member>{};
|
||||
_setterMap.forEach((String name, ir.Member node) {
|
||||
MemberEntity member = elementMap.getMember(node);
|
||||
MemberEntity member = kElementMap.getMember(node);
|
||||
if (liveMemberUsage.containsKey(member)) {
|
||||
setterMap[name] = node;
|
||||
}
|
||||
|
@ -251,11 +252,8 @@ abstract class KClassEnv {
|
|||
/// Ensures that all members have been computed for [cls].
|
||||
void ensureMembers(KernelToElementMap elementMap);
|
||||
|
||||
/// Return the [MemberEntity] for the member [name] in the class. If [setter]
|
||||
/// is `true`, the setter or assignable field corresponding to [name] is
|
||||
/// returned.
|
||||
MemberEntity lookupMember(IrToElementMap elementMap, String name,
|
||||
{bool setter = false});
|
||||
/// Return the [MemberEntity] for the member [name] in the class.
|
||||
MemberEntity lookupMember(IrToElementMap elementMap, Name name);
|
||||
|
||||
/// Calls [f] for each member of [cls].
|
||||
void forEachMember(IrToElementMap elementMap, void f(MemberEntity member));
|
||||
|
@ -273,8 +271,13 @@ abstract class KClassEnv {
|
|||
|
||||
/// Convert this [KClassEnv] to the corresponding [JClassEnv] containing only
|
||||
/// the members in [liveMembers].
|
||||
JClassEnv convert(IrToElementMap elementMap,
|
||||
Map<MemberEntity, MemberUsage> liveMemberUsage);
|
||||
///
|
||||
/// [getJLibrary] returns the [LibraryEntity] in the J-model corresponding to
|
||||
/// a [ir.Library] node.
|
||||
JClassEnv convert(
|
||||
IrToElementMap kElementMap,
|
||||
Map<MemberEntity, MemberUsage> liveMemberUsage,
|
||||
LibraryEntity Function(ir.Library library) getJLibrary);
|
||||
|
||||
/// Returns `true` if [node] is a known member of this class.
|
||||
///
|
||||
|
@ -299,8 +302,7 @@ class KClassEnvImpl implements KClassEnv {
|
|||
final ir.Class cls;
|
||||
|
||||
Map<String, ir.Member> _constructorMap;
|
||||
Map<String, ir.Member> _memberMap;
|
||||
Map<String, ir.Member> _setterMap;
|
||||
Map<Name, ir.Member> _memberMap;
|
||||
List<ir.Member> _members; // in declaration order.
|
||||
bool _isMixinApplicationWithMembers;
|
||||
|
||||
|
@ -310,7 +312,7 @@ class KClassEnvImpl implements KClassEnv {
|
|||
KClassEnvImpl(this.cls);
|
||||
|
||||
KClassEnvImpl.internal(this.cls, this._constructorMap, this._memberMap,
|
||||
this._setterMap, this._members, this._isMixinApplicationWithMembers);
|
||||
this._members, this._isMixinApplicationWithMembers);
|
||||
|
||||
@override
|
||||
bool get isUnnamedMixinApplication => cls.isAnonymousMixin;
|
||||
|
@ -325,7 +327,6 @@ class KClassEnvImpl implements KClassEnv {
|
|||
bool checkHasMember(ir.Member node) {
|
||||
if (_memberMap == null) return false;
|
||||
return _memberMap.values.contains(node) ||
|
||||
_setterMap.values.contains(node) ||
|
||||
_constructorMap.values.contains(node);
|
||||
}
|
||||
|
||||
|
@ -337,8 +338,7 @@ class KClassEnvImpl implements KClassEnv {
|
|||
void _ensureMaps(KernelToElementMap elementMap) {
|
||||
if (_memberMap != null) return;
|
||||
|
||||
_memberMap = <String, ir.Member>{};
|
||||
_setterMap = <String, ir.Member>{};
|
||||
_memberMap = <Name, ir.Member>{};
|
||||
_constructorMap = <String, ir.Member>{};
|
||||
var members = <ir.Member>[];
|
||||
_isMixinApplicationWithMembers = false;
|
||||
|
@ -346,10 +346,10 @@ class KClassEnvImpl implements KClassEnv {
|
|||
void addField(ir.Field member, {bool includeStatic}) {
|
||||
if (!includeStatic && member.isStatic) return;
|
||||
if (isRedirectingFactoryField(member)) return;
|
||||
var name = member.name.text;
|
||||
var name = elementMap.getName(member.name);
|
||||
_memberMap[name] = member;
|
||||
if (member.hasSetter) {
|
||||
_setterMap[name] = member;
|
||||
_memberMap[name.setter] = member;
|
||||
}
|
||||
members.add(member);
|
||||
}
|
||||
|
@ -361,30 +361,18 @@ class KClassEnvImpl implements KClassEnv {
|
|||
if (memberIsIgnorable(member, cls: cls)) return;
|
||||
if (!includeStatic && member.isStatic) return;
|
||||
if (member.isNoSuchMethodForwarder) {
|
||||
// TODO(sigmund): remove once #33732 is fixed.
|
||||
if (!includeNoSuchMethodForwarders ||
|
||||
member.name.isPrivate &&
|
||||
member.name.libraryName != member.enclosingLibrary.reference) {
|
||||
if (!includeNoSuchMethodForwarders) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
var name = member.name.text;
|
||||
if (member.kind == ir.ProcedureKind.Factory) {
|
||||
if (member.isRedirectingFactory) {
|
||||
// Don't include redirecting factories.
|
||||
return;
|
||||
}
|
||||
_constructorMap[name] = member;
|
||||
} else if (member.kind == ir.ProcedureKind.Setter) {
|
||||
_setterMap[name] = member;
|
||||
members.add(member);
|
||||
if (isFromMixinApplication) {
|
||||
_isMixinApplicationWithMembers = true;
|
||||
}
|
||||
_constructorMap[member.name.text] = member;
|
||||
} else {
|
||||
assert(member.kind == ir.ProcedureKind.Method ||
|
||||
member.kind == ir.ProcedureKind.Getter ||
|
||||
member.kind == ir.ProcedureKind.Operator);
|
||||
var name = elementMap.getName(member.name, setter: member.isSetter);
|
||||
_memberMap[name] = member;
|
||||
members.add(member);
|
||||
if (isFromMixinApplication) {
|
||||
|
@ -438,10 +426,9 @@ class KClassEnvImpl implements KClassEnv {
|
|||
}
|
||||
|
||||
@override
|
||||
MemberEntity lookupMember(IrToElementMap elementMap, String name,
|
||||
{bool setter = false}) {
|
||||
MemberEntity lookupMember(IrToElementMap elementMap, Name name) {
|
||||
_ensureMaps(elementMap);
|
||||
ir.Member member = setter ? _setterMap[name] : _memberMap[name];
|
||||
ir.Member member = _memberMap[name];
|
||||
return member != null ? elementMap.getMember(member) : null;
|
||||
}
|
||||
|
||||
|
@ -480,57 +467,47 @@ class KClassEnvImpl implements KClassEnv {
|
|||
}
|
||||
|
||||
@override
|
||||
JClassEnv convert(IrToElementMap elementMap,
|
||||
Map<MemberEntity, MemberUsage> liveMemberUsage) {
|
||||
JClassEnv convert(
|
||||
IrToElementMap kElementMap,
|
||||
Map<MemberEntity, MemberUsage> liveMemberUsage,
|
||||
LibraryEntity Function(ir.Library library) getJLibrary) {
|
||||
Map<String, ir.Member> constructorMap;
|
||||
Map<String, ir.Member> memberMap;
|
||||
Map<String, ir.Member> setterMap;
|
||||
Map<Name, ir.Member> memberMap;
|
||||
List<ir.Member> members;
|
||||
if (_constructorMap == null) {
|
||||
constructorMap = const <String, ir.Member>{};
|
||||
} else {
|
||||
constructorMap = <String, ir.Member>{};
|
||||
_constructorMap.forEach((String name, ir.Member node) {
|
||||
MemberEntity member = elementMap.getMember(node);
|
||||
MemberEntity member = kElementMap.getMember(node);
|
||||
if (liveMemberUsage.containsKey(member)) {
|
||||
constructorMap[name] = node;
|
||||
}
|
||||
});
|
||||
}
|
||||
if (_memberMap == null) {
|
||||
memberMap = const <String, ir.Member>{};
|
||||
memberMap = const <Name, ir.Member>{};
|
||||
} else {
|
||||
memberMap = <String, ir.Member>{};
|
||||
_memberMap.forEach((String name, ir.Member node) {
|
||||
MemberEntity member = elementMap.getMember(node);
|
||||
memberMap = <Name, ir.Member>{};
|
||||
_memberMap.forEach((Name name, ir.Member node) {
|
||||
MemberEntity member = kElementMap.getMember(node);
|
||||
if (liveMemberUsage.containsKey(member)) {
|
||||
memberMap[name] = node;
|
||||
}
|
||||
});
|
||||
}
|
||||
if (_setterMap == null) {
|
||||
setterMap = const <String, ir.Member>{};
|
||||
} else {
|
||||
setterMap = <String, ir.Member>{};
|
||||
_setterMap.forEach((String name, ir.Member node) {
|
||||
MemberEntity member = elementMap.getMember(node);
|
||||
if (liveMemberUsage.containsKey(member)) {
|
||||
setterMap[name] = node;
|
||||
}
|
||||
});
|
||||
}
|
||||
if (_members == null) {
|
||||
members = const <ir.Member>[];
|
||||
} else {
|
||||
members = <ir.Member>[];
|
||||
_members.forEach((ir.Member node) {
|
||||
MemberEntity member = elementMap.getMember(node);
|
||||
MemberEntity member = kElementMap.getMember(node);
|
||||
if (liveMemberUsage.containsKey(member)) {
|
||||
members.add(node);
|
||||
}
|
||||
});
|
||||
}
|
||||
return JClassEnvImpl(cls, constructorMap, memberMap, setterMap, members,
|
||||
return JClassEnvImpl(cls, constructorMap, memberMap, members,
|
||||
_isMixinApplicationWithMembers ?? false);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -831,8 +831,8 @@ class KernelImpactConverter implements ImpactRegistry {
|
|||
}
|
||||
ClassEntity? cls = type.element;
|
||||
while (cls != null) {
|
||||
MemberEntity member =
|
||||
elementMap.elementEnvironment.lookupClassMember(cls, '==')!;
|
||||
MemberEntity member = elementMap.elementEnvironment
|
||||
.lookupClassMember(cls, Names.EQUALS_NAME)!;
|
||||
if (member.isAbstract) {
|
||||
cls = elementMap.elementEnvironment.getSuperClass(cls);
|
||||
} else {
|
||||
|
|
|
@ -120,7 +120,7 @@ class KernelFrontendStrategy
|
|||
(_, MemberEntity member) {
|
||||
if (!member.isInstanceMember) return;
|
||||
MemberEntity interceptorMember = elementEnvironment
|
||||
.lookupLocalClassMember(interceptorClass, member.name);
|
||||
.lookupLocalClassMember(interceptorClass, member.memberName);
|
||||
// Interceptors must override all Object methods due to calling convention
|
||||
// differences.
|
||||
assert(
|
||||
|
|
|
@ -136,7 +136,7 @@ class KClosedWorld implements BuiltWorld, interfaces.KClosedWorld {
|
|||
.checkHasMember(elementMap.getMemberNode(member))) {
|
||||
throw SpannableAssertionFailure(
|
||||
member,
|
||||
"Member $member is in the environment of its enclosing class"
|
||||
"Member $member is not in the environment of its enclosing class"
|
||||
" ${member.enclosingClass}.");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ import '../constants/values.dart';
|
|||
import '../deferred_load/output_unit.dart' show OutputUnit;
|
||||
import '../elements/entities.dart';
|
||||
import '../elements/indexed.dart';
|
||||
import '../elements/names.dart';
|
||||
import '../elements/types.dart';
|
||||
import '../inferrer/abstract_value_domain.dart';
|
||||
import '../ir/constants.dart';
|
||||
|
|
|
@ -246,6 +246,26 @@ class DataSinkWriter {
|
|||
}
|
||||
}
|
||||
|
||||
/// Writes the [map] from [Name] to [V] values to this data sink, calling [f]
|
||||
/// to write each value to the data sink. If [allowNull] is `true`, [map] is
|
||||
/// allowed to be `null`.
|
||||
///
|
||||
/// This is a convenience method to be used together with
|
||||
/// [DataSourceReader.readNameMap].
|
||||
void writeNameMap<V>(Map<Name, V>? map, void f(V value),
|
||||
{bool allowNull = false}) {
|
||||
if (map == null) {
|
||||
assert(allowNull);
|
||||
writeInt(0);
|
||||
} else {
|
||||
writeInt(map.length);
|
||||
map.forEach((Name key, V value) {
|
||||
writeMemberName(key);
|
||||
f(value);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// Writes the string [values] to this data sink. If [allowNull] is `true`,
|
||||
/// [values] is allowed to be `null`.
|
||||
///
|
||||
|
@ -386,6 +406,13 @@ class DataSinkWriter {
|
|||
writeValueOrNull(value.library, writeLibraryNode);
|
||||
}
|
||||
|
||||
/// Writes a [Name] to this data sink.
|
||||
void writeMemberName(Name value) {
|
||||
writeString(value.text);
|
||||
writeValueOrNull(value.uri, writeUri);
|
||||
writeBool(value.isSetter);
|
||||
}
|
||||
|
||||
/// Writes a kernel library dependency node [value] to this data sink.
|
||||
void writeLibraryDependencyNode(ir.LibraryDependency value) {
|
||||
final library = value.parent as ir.Library;
|
||||
|
|
|
@ -378,6 +378,24 @@ class DataSourceReader {
|
|||
return list;
|
||||
}
|
||||
|
||||
/// Reads a map from [Name] values to [V] values from this data source,
|
||||
/// calling [f] to read each value from the data source. If [emptyAsNull] is
|
||||
/// `true`, `null` is returned instead of an empty map.
|
||||
///
|
||||
/// This is a convenience method to be used together with
|
||||
/// [DataSinkWriter.writeNameMap].
|
||||
Map<Name, V>? readNameMap<V>(V f(), {bool emptyAsNull = false}) {
|
||||
int count = readInt();
|
||||
if (count == 0 && emptyAsNull) return null;
|
||||
Map<Name, V> map = {};
|
||||
for (int i = 0; i < count; i++) {
|
||||
Name key = readMemberName();
|
||||
V value = f();
|
||||
map[key] = value;
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/// Reads a map from string values to [V] values from this data source,
|
||||
/// calling [f] to read each value from the data source. If [emptyAsNull] is
|
||||
/// `true`, `null` is returned instead of an empty map.
|
||||
|
@ -537,6 +555,14 @@ class DataSourceReader {
|
|||
return ir.Name(text, library);
|
||||
}
|
||||
|
||||
/// Reads a [Name] from this data source.
|
||||
Name readMemberName() {
|
||||
String text = readString();
|
||||
Uri? uri = readValueOrNull(readUri);
|
||||
bool setter = readBool();
|
||||
return Name(text, uri, isSetter: setter);
|
||||
}
|
||||
|
||||
/// Reads a kernel library dependency node from this data source.
|
||||
ir.LibraryDependency readLibraryDependencyNode() {
|
||||
ir.Library library = readLibraryNode();
|
||||
|
|
|
@ -4285,7 +4285,7 @@ class KernelSsaGraphBuilder extends ir.Visitor<void> with ir.VisitorVoidMixin {
|
|||
Map<String, ir.Expression> namedArguments = {};
|
||||
int kind = _readIntLiteral(invocation.arguments.positional[4]);
|
||||
|
||||
Name memberName = Name(name, _currentFrame.member.library);
|
||||
Name memberName = Name(name, _currentFrame.member.library.canonicalUri);
|
||||
Selector selector;
|
||||
switch (kind) {
|
||||
case invocationMirrorGetterKind:
|
||||
|
|
|
@ -51,7 +51,8 @@ class InvokeDynamicSpecializer {
|
|||
Selector selector = instruction.selector;
|
||||
if (selector.name == name) return;
|
||||
instruction.selector = Selector.call(
|
||||
Name(name, commonElements.interceptorsLibrary), selector.callStructure);
|
||||
Name(name, commonElements.interceptorsLibrary.canonicalUri),
|
||||
selector.callStructure);
|
||||
}
|
||||
|
||||
constant_system.Operation operation() => null;
|
||||
|
|
|
@ -12,6 +12,7 @@ import '../common/tasks.dart' show Measurer, CompilerTask;
|
|||
import '../constants/constant_system.dart' as constant_system;
|
||||
import '../constants/values.dart';
|
||||
import '../elements/entities.dart';
|
||||
import '../elements/names.dart';
|
||||
import '../elements/types.dart';
|
||||
import '../inferrer/abstract_value_domain.dart';
|
||||
import '../inferrer/types.dart';
|
||||
|
@ -1181,8 +1182,8 @@ class SsaInstructionSimplifier extends HBaseVisitor
|
|||
}
|
||||
|
||||
FieldEntity _indexFieldOfEnumClass(ClassEntity enumClass) {
|
||||
MemberEntity member =
|
||||
_closedWorld.elementEnvironment.lookupClassMember(enumClass, 'index');
|
||||
MemberEntity member = _closedWorld.elementEnvironment
|
||||
.lookupClassMember(enumClass, const PublicName('index'));
|
||||
if (member is FieldEntity) return member;
|
||||
throw StateError('$enumClass should have index field, found $member');
|
||||
}
|
||||
|
|
|
@ -63,8 +63,6 @@ class Selector {
|
|||
|
||||
String get name => memberName.text;
|
||||
|
||||
LibraryEntity? get library => memberName.library;
|
||||
|
||||
static bool isOperatorName(String name) {
|
||||
return instanceMethodOperatorNames.contains(name);
|
||||
}
|
||||
|
@ -198,22 +196,17 @@ class Selector {
|
|||
factory Selector.readFromDataSource(DataSourceReader source) {
|
||||
source.begin(tag);
|
||||
SelectorKind kind = source.readEnum(SelectorKind.values);
|
||||
bool isSetter = source.readBool();
|
||||
LibraryEntity? library = source.readLibraryOrNull();
|
||||
String text = source.readString();
|
||||
Name memberName = source.readMemberName();
|
||||
CallStructure callStructure = CallStructure.readFromDataSource(source);
|
||||
source.end(tag);
|
||||
return Selector(
|
||||
kind, Name(text, library, isSetter: isSetter), callStructure);
|
||||
return Selector(kind, memberName, callStructure);
|
||||
}
|
||||
|
||||
/// Serializes this [Selector] to [sink].
|
||||
void writeToDataSink(DataSinkWriter sink) {
|
||||
sink.begin(tag);
|
||||
sink.writeEnum(kind);
|
||||
sink.writeBool(memberName.isSetter);
|
||||
sink.writeLibraryOrNull(memberName.library);
|
||||
sink.writeString(memberName.text);
|
||||
sink.writeMemberName(memberName);
|
||||
callStructure.writeToDataSink(sink);
|
||||
sink.end(tag);
|
||||
}
|
||||
|
@ -244,9 +237,7 @@ class Selector {
|
|||
|
||||
bool appliesUnnamed(MemberEntity element) {
|
||||
assert(name == element.name);
|
||||
if (memberName.isPrivate && memberName.library != element.library) {
|
||||
// TODO(johnniwinther): Maybe this should be
|
||||
// `memberName != element.memberName`.
|
||||
if (!memberName.matches(element.memberName)) {
|
||||
return false;
|
||||
}
|
||||
if (element.isSetter) return isSetter;
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
// @dart = 2.7
|
||||
|
||||
import 'package:compiler/src/compiler.dart';
|
||||
import 'package:compiler/src/elements/names.dart';
|
||||
import 'package:expect/expect.dart';
|
||||
import "package:async_helper/async_helper.dart";
|
||||
import 'package:compiler/src/commandline_options.dart';
|
||||
|
@ -56,7 +58,7 @@ void main() {
|
|||
var options = [Flags.omitImplicitChecks];
|
||||
var result = await runCompiler(
|
||||
memorySourceFiles: {'main.dart': TEST}, options: options);
|
||||
var compiler = result.compiler;
|
||||
Compiler compiler = result.compiler;
|
||||
var results = compiler.globalInference.resultsForTesting;
|
||||
var closedWorld = results.closedWorld;
|
||||
var elementEnvironment = closedWorld.elementEnvironment;
|
||||
|
@ -65,13 +67,15 @@ void main() {
|
|||
elementEnvironment.lookupClass(elementEnvironment.mainLibrary, "A");
|
||||
|
||||
checkReturn(String name, TypeMask type) {
|
||||
MemberEntity element = elementEnvironment.lookupClassMember(classA, name);
|
||||
MemberEntity element =
|
||||
elementEnvironment.lookupClassMember(classA, PublicName(name));
|
||||
var mask = results.resultOfMember(element).returnType;
|
||||
Expect.isTrue(type.containsMask(mask, closedWorld));
|
||||
}
|
||||
|
||||
checkType(String name, type) {
|
||||
MemberEntity element = elementEnvironment.lookupClassMember(classA, name);
|
||||
MemberEntity element =
|
||||
elementEnvironment.lookupClassMember(classA, PublicName(name));
|
||||
Expect.isTrue(
|
||||
type.containsMask(results.resultOfMember(element).type, closedWorld));
|
||||
}
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
// @dart = 2.7
|
||||
|
||||
import 'package:compiler/src/elements/names.dart';
|
||||
|
||||
import '../helpers/memory_compiler.dart';
|
||||
import 'package:async_helper/async_helper.dart';
|
||||
import 'package:compiler/src/common/elements.dart';
|
||||
|
@ -60,7 +62,7 @@ main() {
|
|||
Expect.isNotNull(library);
|
||||
ClassEntity clss = environment.lookupClass(library, 'ListLiteralTest');
|
||||
Expect.isNotNull(clss);
|
||||
var member = environment.lookupClassMember(clss, 'testMain');
|
||||
var member = environment.lookupClassMember(clss, PublicName('testMain'));
|
||||
Expect.isNotNull(member);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
// @dart = 2.7
|
||||
|
||||
import 'package:compiler/src/elements/names.dart';
|
||||
|
||||
import '../helpers/memory_compiler.dart';
|
||||
import 'package:async_helper/async_helper.dart';
|
||||
import 'package:compiler/src/common/elements.dart';
|
||||
|
@ -61,7 +63,7 @@ main() {
|
|||
Expect.isNotNull(library);
|
||||
ClassEntity clss = environment.lookupClass(library, 'B1');
|
||||
Expect.isNotNull(clss);
|
||||
var member = environment.lookupClassMember(clss, 'foo');
|
||||
var member = environment.lookupClassMember(clss, PublicName('foo'));
|
||||
Expect.isNotNull(member);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ import 'package:compiler/src/common/elements.dart';
|
|||
import 'package:compiler/src/commandline_options.dart';
|
||||
import 'package:compiler/src/compiler.dart';
|
||||
import 'package:compiler/src/elements/entities.dart';
|
||||
import 'package:compiler/src/elements/names.dart';
|
||||
import 'package:compiler/src/kernel/element_map.dart';
|
||||
import 'package:compiler/src/kernel/kernel_strategy.dart';
|
||||
import 'package:expect/expect.dart';
|
||||
|
@ -325,7 +326,8 @@ Future<CompiledData<T>> computeData<T>(String name, Uri entryPoint,
|
|||
MemberEntity member;
|
||||
if (id.className != null) {
|
||||
ClassEntity cls = getGlobalClass(id.className);
|
||||
member = elementEnvironment.lookupClassMember(cls, id.memberName);
|
||||
member = elementEnvironment.lookupClassMember(
|
||||
cls, Name(id.memberName, cls.library.canonicalUri));
|
||||
member ??= elementEnvironment.lookupConstructor(cls, id.memberName);
|
||||
Expect.isNotNull(
|
||||
member, "Global member '$member' not found in class $cls.");
|
||||
|
@ -552,8 +554,8 @@ Spannable computeSpannable(
|
|||
print("No class '${id.className}' in $mainUri.");
|
||||
return NO_LOCATION_SPANNABLE;
|
||||
}
|
||||
MemberEntity member = elementEnvironment
|
||||
.lookupClassMember(cls, memberName, setter: isSetter);
|
||||
MemberEntity member = elementEnvironment.lookupClassMember(
|
||||
cls, Name(memberName, cls.library.canonicalUri, isSetter: isSetter));
|
||||
if (member == null) {
|
||||
ConstructorEntity constructor =
|
||||
elementEnvironment.lookupConstructor(cls, memberName);
|
||||
|
|
|
@ -9,6 +9,7 @@ import 'package:compiler/src/commandline_options.dart';
|
|||
import 'package:compiler/src/common/elements.dart';
|
||||
import 'package:compiler/src/compiler.dart';
|
||||
import 'package:compiler/src/elements/entities.dart';
|
||||
import 'package:compiler/src/elements/names.dart';
|
||||
import 'package:compiler/src/js/js.dart' as js;
|
||||
import 'package:compiler/src/js_model/js_strategy.dart';
|
||||
import 'package:compiler/src/world.dart';
|
||||
|
@ -194,7 +195,8 @@ main(List<String> args) {
|
|||
ClassEntity cls = elementEnvironment.lookupClass(
|
||||
elementEnvironment.mainLibrary, className);
|
||||
Expect.isNotNull(cls, "Class '$className' not found.");
|
||||
method = elementEnvironment.lookupClassMember(cls, methodName);
|
||||
method = elementEnvironment.lookupClassMember(
|
||||
cls, Name(methodName, cls.library.canonicalUri));
|
||||
Expect.isNotNull(method, "Method '$methodName' not found in $cls.");
|
||||
} else {
|
||||
method = elementEnvironment.lookupLibraryMember(
|
||||
|
|
|
@ -6,6 +6,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;
|
||||
|
||||
|
@ -45,8 +46,8 @@ MemberEntity findClassMember(
|
|||
JElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
|
||||
ClassEntity cls = findClass(closedWorld, className);
|
||||
assert(cls != null, "Class '$className' not found.");
|
||||
MemberEntity member =
|
||||
elementEnvironment.lookupClassMember(cls, memberName, setter: isSetter);
|
||||
MemberEntity member = elementEnvironment.lookupClassMember(
|
||||
cls, Name(memberName, cls.library.canonicalUri, isSetter: isSetter));
|
||||
if (member == null && !isSetter) {
|
||||
member = elementEnvironment.lookupConstructor(cls, memberName);
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
import 'package:compiler/src/common/elements.dart';
|
||||
import 'package:compiler/src/deferred_load/output_unit.dart' show OutputUnit;
|
||||
import 'package:compiler/src/elements/entities.dart';
|
||||
import 'package:compiler/src/elements/names.dart';
|
||||
import 'package:compiler/src/js/js.dart' as js;
|
||||
import 'package:compiler/src/js_backend/namer.dart';
|
||||
import 'package:compiler/src/js_emitter/model.dart';
|
||||
|
@ -29,7 +30,8 @@ MemberEntity lookupMember(JElementEnvironment elementEnvironment, String name) {
|
|||
ClassEntity cls = elementEnvironment.lookupClass(
|
||||
elementEnvironment.mainLibrary, className);
|
||||
Expect.isNotNull(cls, "No class '$className' found in the main library.");
|
||||
member = elementEnvironment.lookupClassMember(cls, name);
|
||||
member = elementEnvironment.lookupClassMember(
|
||||
cls, Name(name, cls.library.canonicalUri));
|
||||
member ??= elementEnvironment.lookupConstructor(cls, name);
|
||||
Expect.isNotNull(member, "No member '$name' found in $cls");
|
||||
} else {
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
library type_test_helper;
|
||||
|
||||
import 'dart:async';
|
||||
import 'package:compiler/src/elements/names.dart';
|
||||
import 'package:expect/expect.dart';
|
||||
import 'package:compiler/src/common/elements.dart';
|
||||
import 'package:compiler/src/commandline_options.dart';
|
||||
|
@ -136,7 +137,8 @@ class TypeEnvironment {
|
|||
|
||||
MemberEntity _getMember(String name, [ClassEntity cls]) {
|
||||
if (cls != null) {
|
||||
return elementEnvironment.lookupLocalClassMember(cls, name);
|
||||
return elementEnvironment.lookupLocalClassMember(
|
||||
cls, Name(name, cls.library.canonicalUri));
|
||||
} else {
|
||||
LibraryEntity mainLibrary = elementEnvironment.mainLibrary;
|
||||
return elementEnvironment.lookupLibraryMember(mainLibrary, name);
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
library dart2js.constants.values.test;
|
||||
|
||||
import 'package:async_helper/async_helper.dart';
|
||||
import 'package:compiler/src/elements/names.dart';
|
||||
import 'package:expect/expect.dart';
|
||||
import 'package:compiler/src/elements/entities.dart';
|
||||
import 'package:compiler/src/elements/types.dart';
|
||||
|
@ -30,8 +31,10 @@ void main() {
|
|||
""");
|
||||
ClassEntity C = env.getClass('C');
|
||||
InterfaceType C_raw = env.elementEnvironment.getRawType(C);
|
||||
FieldEntity field1 = env.elementEnvironment.lookupClassMember(C, 'field1');
|
||||
FieldEntity field2 = env.elementEnvironment.lookupClassMember(C, 'field2');
|
||||
FieldEntity field1 =
|
||||
env.elementEnvironment.lookupClassMember(C, PublicName('field1'));
|
||||
FieldEntity field2 =
|
||||
env.elementEnvironment.lookupClassMember(C, PublicName('field2'));
|
||||
ConstructedConstantValue value1 = new ConstructedConstantValue(C_raw, {
|
||||
field1: new IntConstantValue(BigInt.zero),
|
||||
field2: new IntConstantValue(BigInt.one),
|
||||
|
|
|
@ -194,7 +194,7 @@ main() {}
|
|||
ClassEntity cls = elementEnvironment.lookupClass(
|
||||
elementEnvironment.mainLibrary, className);
|
||||
Selector selector = new Selector.call(
|
||||
new Name(methodName, elementEnvironment.mainLibrary),
|
||||
new Name(methodName, elementEnvironment.mainLibrary.canonicalUri),
|
||||
CallStructure.NO_ARGS);
|
||||
WorldImpact impact = new WorldImpactBuilderImpl()
|
||||
..registerDynamicUse(
|
||||
|
|
|
@ -8,6 +8,7 @@ import 'package:async_helper/async_helper.dart';
|
|||
import 'package:compiler/src/common/elements.dart';
|
||||
import 'package:compiler/src/compiler.dart';
|
||||
import 'package:compiler/src/elements/entities.dart';
|
||||
import 'package:compiler/src/elements/names.dart';
|
||||
import 'package:compiler/src/world.dart';
|
||||
import 'package:expect/expect.dart';
|
||||
import '../helpers/memory_compiler.dart';
|
||||
|
@ -37,7 +38,8 @@ main() {
|
|||
elementEnvironment.lookupClass(elementEnvironment.mainLibrary, 'Class');
|
||||
ClassEntity mixin =
|
||||
elementEnvironment.lookupClass(elementEnvironment.mainLibrary, 'Mixin');
|
||||
FunctionEntity method = elementEnvironment.lookupClassMember(cls, 'method');
|
||||
FunctionEntity method =
|
||||
elementEnvironment.lookupClassMember(cls, PublicName('method'));
|
||||
Expect.isNotNull(method);
|
||||
Expect.equals(mixin, method.enclosingClass);
|
||||
Expect.isFalse(method.isAbstract);
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
import 'package:async_helper/async_helper.dart';
|
||||
import 'package:compiler/src/common/elements.dart';
|
||||
import 'package:compiler/src/common/names.dart';
|
||||
import 'package:compiler/src/compiler.dart';
|
||||
import 'package:compiler/src/elements/entities.dart';
|
||||
import 'package:compiler/src/js_backend/no_such_method_registry.dart';
|
||||
|
@ -261,7 +262,8 @@ checkTest(Compiler compiler, NoSuchMethodTest test) {
|
|||
compiler.frontendStrategy.noSuchMethodRegistry;
|
||||
var resolver = registry.internalResolverForTesting;
|
||||
FunctionEntity ObjectNSM = frontendEnvironment.lookupClassMember(
|
||||
compiler.frontendStrategy.commonElements.objectClass, 'noSuchMethod');
|
||||
compiler.frontendStrategy.commonElements.objectClass,
|
||||
Names.noSuchMethod_);
|
||||
JClosedWorld backendClosedWorld = compiler.backendClosedWorldForTesting;
|
||||
ElementEnvironment backendEnvironment = backendClosedWorld.elementEnvironment;
|
||||
NoSuchMethodData data = backendClosedWorld.noSuchMethodData;
|
||||
|
@ -272,7 +274,7 @@ checkTest(Compiler compiler, NoSuchMethodTest test) {
|
|||
frontendEnvironment.mainLibrary, info.className);
|
||||
Expect.isNotNull(cls, "Class ${info.className} not found.");
|
||||
FunctionEntity noSuchMethod =
|
||||
frontendEnvironment.lookupClassMember(cls, 'noSuchMethod');
|
||||
frontendEnvironment.lookupClassMember(cls, Names.noSuchMethod_);
|
||||
Expect.isNotNull(noSuchMethod, "noSuchMethod not found in $cls.");
|
||||
|
||||
if (info.superClassName == null) {
|
||||
|
@ -282,8 +284,8 @@ checkTest(Compiler compiler, NoSuchMethodTest test) {
|
|||
frontendEnvironment.mainLibrary, info.superClassName);
|
||||
Expect.isNotNull(
|
||||
superclass, "Superclass ${info.superClassName} not found.");
|
||||
FunctionEntity superNoSuchMethod =
|
||||
frontendEnvironment.lookupClassMember(superclass, 'noSuchMethod');
|
||||
FunctionEntity superNoSuchMethod = frontendEnvironment.lookupClassMember(
|
||||
superclass, Names.noSuchMethod_);
|
||||
Expect.isNotNull(
|
||||
superNoSuchMethod, "noSuchMethod not found in $superclass.");
|
||||
Expect.equals(
|
||||
|
@ -309,8 +311,8 @@ checkTest(Compiler compiler, NoSuchMethodTest test) {
|
|||
ClassEntity frontendClass = frontendEnvironment.lookupClass(
|
||||
frontendEnvironment.mainLibrary, info.className);
|
||||
Expect.isNotNull(frontendClass, "Class ${info.className} not found.");
|
||||
FunctionEntity frontendNoSuchMethod =
|
||||
frontendEnvironment.lookupClassMember(frontendClass, 'noSuchMethod');
|
||||
FunctionEntity frontendNoSuchMethod = frontendEnvironment.lookupClassMember(
|
||||
frontendClass, Names.noSuchMethod_);
|
||||
Expect.isNotNull(
|
||||
frontendNoSuchMethod, "noSuchMethod not found in $frontendClass.");
|
||||
|
||||
|
@ -331,7 +333,7 @@ checkTest(Compiler compiler, NoSuchMethodTest test) {
|
|||
backendEnvironment.mainLibrary, info.className);
|
||||
Expect.isNotNull(backendClass, "Class ${info.className} not found.");
|
||||
FunctionEntity backendNoSuchMethod =
|
||||
backendEnvironment.lookupClassMember(backendClass, 'noSuchMethod');
|
||||
backendEnvironment.lookupClassMember(backendClass, Names.noSuchMethod_);
|
||||
Expect.isNotNull(
|
||||
backendNoSuchMethod, "noSuchMethod not found in $backendClass.");
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
library type_substitution_test;
|
||||
|
||||
import 'package:compiler/src/elements/names.dart';
|
||||
import 'package:expect/expect.dart';
|
||||
import 'package:async_helper/async_helper.dart';
|
||||
import 'package:compiler/src/commandline_options.dart';
|
||||
|
@ -17,7 +18,8 @@ import '../helpers/type_test_helper.dart';
|
|||
DartType getType(ElementEnvironment elementEnvironment, String name) {
|
||||
ClassEntity cls =
|
||||
elementEnvironment.lookupClass(elementEnvironment.mainLibrary, 'Class');
|
||||
FunctionEntity element = elementEnvironment.lookupClassMember(cls, name);
|
||||
FunctionEntity element = elementEnvironment.lookupClassMember(
|
||||
cls, Name(name, cls.library.canonicalUri));
|
||||
Expect.isNotNull(element);
|
||||
FunctionType type = elementEnvironment.getFunctionType(element);
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@ import 'package:compiler/src/common.dart';
|
|||
import 'package:compiler/src/common/elements.dart';
|
||||
import 'package:compiler/src/compiler.dart';
|
||||
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_backend/runtime_types_resolution.dart';
|
||||
import 'package:compiler/src/js_model/js_world.dart';
|
||||
|
@ -288,8 +289,9 @@ abstract class IrMixin implements ComputeValueMixin {
|
|||
frontendClass, backendMember.name);
|
||||
} else {
|
||||
return elementEnvironment.lookupClassMember(
|
||||
frontendClass, backendMember.name,
|
||||
setter: backendMember.isSetter);
|
||||
frontendClass,
|
||||
Name(backendMember.name, frontendClass.library.canonicalUri,
|
||||
isSetter: backendMember.isSetter));
|
||||
}
|
||||
}
|
||||
return elementEnvironment.lookupLibraryMember(
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
library source_map_name_test;
|
||||
|
||||
import 'package:async_helper/async_helper.dart';
|
||||
import 'package:compiler/src/elements/names.dart';
|
||||
import 'package:expect/expect.dart';
|
||||
import 'package:compiler/src/commandline_options.dart';
|
||||
import 'package:compiler/src/common/elements.dart' show JElementEnvironment;
|
||||
|
@ -101,7 +102,8 @@ main() {
|
|||
ClassEntity cls = env.lookupClass(mainApp, clsName);
|
||||
Expect.isNotNull(cls, "Class '$clsName' not found.");
|
||||
var subname = name.substring(dotPosition + 1);
|
||||
element = env.lookupLocalClassMember(cls, subname) ??
|
||||
element = env.lookupLocalClassMember(
|
||||
cls, Name(subname, cls.library.canonicalUri)) ??
|
||||
env.lookupConstructor(cls, subname);
|
||||
} else {
|
||||
element = env.lookupLibraryMember(mainApp, name);
|
||||
|
|
|
@ -39,7 +39,7 @@ if %DART_ROOT:~-1%==\ set DART_ROOT=%DART_ROOT:~0,-1%
|
|||
|
||||
set DART2JS=%DART_ROOT%\pkg\compiler\lib\src\dart2js.dart
|
||||
|
||||
"%DART%" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "%DART2JS%" %EXTRA_OPTIONS% %*
|
||||
"%DART%" "--packages=%DART_ROOT%\.dart_tool\package_config.json" %EXTRA_VM_OPTIONS% "%DART2JS%" %EXTRA_OPTIONS% %*
|
||||
|
||||
endlocal
|
||||
|
||||
|
|
75
tests/web/regress/private_names_lib1.dart
Normal file
75
tests/web/regress/private_names_lib1.dart
Normal file
|
@ -0,0 +1,75 @@
|
|||
// Copyright (c) 2022, 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 'private_names_lib2.dart';
|
||||
|
||||
export 'private_names_lib2.dart' show DoubleLinkedQueueEntry;
|
||||
|
||||
abstract class _DoubleLinkedQueueEntry<E> {
|
||||
_DoubleLinkedQueueEntry<E>? _previousLink;
|
||||
_DoubleLinkedQueueEntry<E>? _nextLink;
|
||||
|
||||
void _link(
|
||||
_DoubleLinkedQueueEntry<E>? previous, _DoubleLinkedQueueEntry<E>? next) {
|
||||
_nextLink = next;
|
||||
_previousLink = previous;
|
||||
previous?._nextLink = this;
|
||||
next?._previousLink = this;
|
||||
}
|
||||
|
||||
_DoubleLinkedQueueElement<E>? _asNonSentinelEntry();
|
||||
|
||||
void _prepend(E element, DoubleLinkedQueue<E>? queue) {
|
||||
_DoubleLinkedQueueElement<E>(element, queue)._link(_previousLink, this);
|
||||
}
|
||||
}
|
||||
|
||||
class _DoubleLinkedQueueElement<E> extends _DoubleLinkedQueueEntry<E>
|
||||
implements DoubleLinkedQueueEntry<E> {
|
||||
DoubleLinkedQueue<E>? _queue;
|
||||
E element;
|
||||
|
||||
_DoubleLinkedQueueElement(this.element, this._queue);
|
||||
|
||||
void prepend(E e) {
|
||||
_prepend(e, _queue);
|
||||
_queue?._elementCount++;
|
||||
}
|
||||
|
||||
_DoubleLinkedQueueElement<E> _asNonSentinelEntry() => this;
|
||||
}
|
||||
|
||||
class _DoubleLinkedQueueSentinel<E> extends _DoubleLinkedQueueEntry<E> {
|
||||
_DoubleLinkedQueueSentinel() {
|
||||
_previousLink = this;
|
||||
_nextLink = this;
|
||||
}
|
||||
|
||||
Null _asNonSentinelEntry() => null;
|
||||
}
|
||||
|
||||
class DoubleLinkedQueue<E> /*extends Iterable<E> implements Queue<E>*/ {
|
||||
final _DoubleLinkedQueueSentinel<E> _sentinel =
|
||||
_DoubleLinkedQueueSentinel<E>();
|
||||
|
||||
int _elementCount = 0;
|
||||
|
||||
DoubleLinkedQueue();
|
||||
|
||||
factory DoubleLinkedQueue.from(Iterable<dynamic> elements) {
|
||||
DoubleLinkedQueue<E> list = DoubleLinkedQueue<E>();
|
||||
for (final e in elements) {
|
||||
list.addLast(e as E);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
void addLast(E value) {
|
||||
_sentinel._prepend(value, this);
|
||||
_elementCount++;
|
||||
}
|
||||
|
||||
DoubleLinkedQueueEntry<E>? firstEntry() =>
|
||||
_sentinel._nextLink!._asNonSentinelEntry();
|
||||
}
|
24
tests/web/regress/private_names_lib2.dart
Normal file
24
tests/web/regress/private_names_lib2.dart
Normal file
|
@ -0,0 +1,24 @@
|
|||
// Copyright (c) 2022, 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.
|
||||
|
||||
class DoubleLinkedQueueEntry<E> {
|
||||
DoubleLinkedQueueEntry<E>? _previousLink;
|
||||
DoubleLinkedQueueEntry<E>? _nextLink;
|
||||
|
||||
E element;
|
||||
|
||||
DoubleLinkedQueueEntry(this.element);
|
||||
|
||||
void _link(
|
||||
DoubleLinkedQueueEntry<E>? previous, DoubleLinkedQueueEntry<E>? next) {
|
||||
_nextLink = next;
|
||||
_previousLink = previous;
|
||||
previous?._nextLink = this;
|
||||
next?._previousLink = this;
|
||||
}
|
||||
|
||||
void prepend(E e) {
|
||||
DoubleLinkedQueueEntry<E>(e)._link(_previousLink, this);
|
||||
}
|
||||
}
|
31
tests/web/regress/private_names_test.dart
Normal file
31
tests/web/regress/private_names_test.dart
Normal file
|
@ -0,0 +1,31 @@
|
|||
// Copyright (c) 2022, 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.
|
||||
|
||||
// Derived from lib/collection/queue_test which showed in error in the
|
||||
// of private names in dart2js.
|
||||
|
||||
library queue.test;
|
||||
|
||||
import 'private_names_lib1.dart';
|
||||
|
||||
class DoubleLinkedQueueTest {
|
||||
void testMain() {
|
||||
testQueueElements();
|
||||
}
|
||||
|
||||
void testQueueElements() {
|
||||
DoubleLinkedQueue<int> queue1 = new DoubleLinkedQueue<int>.from([1, 2, 3]);
|
||||
var firstEntry = queue1.firstEntry()!;
|
||||
firstEntry.prepend(4);
|
||||
}
|
||||
}
|
||||
|
||||
void linkEntryTest() {
|
||||
var entry = new DoubleLinkedQueueEntry(42);
|
||||
}
|
||||
|
||||
main() {
|
||||
new DoubleLinkedQueueTest().testMain();
|
||||
linkEntryTest();
|
||||
}
|
75
tests/web_2/regress/private_names_lib1.dart
Normal file
75
tests/web_2/regress/private_names_lib1.dart
Normal file
|
@ -0,0 +1,75 @@
|
|||
// Copyright (c) 2022, 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 'private_names_lib2.dart';
|
||||
|
||||
export 'private_names_lib2.dart' show DoubleLinkedQueueEntry;
|
||||
|
||||
abstract class _DoubleLinkedQueueEntry<E> {
|
||||
_DoubleLinkedQueueEntry<E>? _previousLink;
|
||||
_DoubleLinkedQueueEntry<E>? _nextLink;
|
||||
|
||||
void _link(
|
||||
_DoubleLinkedQueueEntry<E>? previous, _DoubleLinkedQueueEntry<E>? next) {
|
||||
_nextLink = next;
|
||||
_previousLink = previous;
|
||||
previous?._nextLink = this;
|
||||
next?._previousLink = this;
|
||||
}
|
||||
|
||||
_DoubleLinkedQueueElement<E>? _asNonSentinelEntry();
|
||||
|
||||
void _prepend(E element, DoubleLinkedQueue<E>? queue) {
|
||||
_DoubleLinkedQueueElement<E>(element, queue)._link(_previousLink, this);
|
||||
}
|
||||
}
|
||||
|
||||
class _DoubleLinkedQueueElement<E> extends _DoubleLinkedQueueEntry<E>
|
||||
implements DoubleLinkedQueueEntry<E> {
|
||||
DoubleLinkedQueue<E>? _queue;
|
||||
E element;
|
||||
|
||||
_DoubleLinkedQueueElement(this.element, this._queue);
|
||||
|
||||
void prepend(E e) {
|
||||
_prepend(e, _queue);
|
||||
_queue?._elementCount++;
|
||||
}
|
||||
|
||||
_DoubleLinkedQueueElement<E> _asNonSentinelEntry() => this;
|
||||
}
|
||||
|
||||
class _DoubleLinkedQueueSentinel<E> extends _DoubleLinkedQueueEntry<E> {
|
||||
_DoubleLinkedQueueSentinel() {
|
||||
_previousLink = this;
|
||||
_nextLink = this;
|
||||
}
|
||||
|
||||
Null _asNonSentinelEntry() => null;
|
||||
}
|
||||
|
||||
class DoubleLinkedQueue<E> /*extends Iterable<E> implements Queue<E>*/ {
|
||||
final _DoubleLinkedQueueSentinel<E> _sentinel =
|
||||
_DoubleLinkedQueueSentinel<E>();
|
||||
|
||||
int _elementCount = 0;
|
||||
|
||||
DoubleLinkedQueue();
|
||||
|
||||
factory DoubleLinkedQueue.from(Iterable<dynamic> elements) {
|
||||
DoubleLinkedQueue<E> list = DoubleLinkedQueue<E>();
|
||||
for (final e in elements) {
|
||||
list.addLast(e as E);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
void addLast(E value) {
|
||||
_sentinel._prepend(value, this);
|
||||
_elementCount++;
|
||||
}
|
||||
|
||||
DoubleLinkedQueueEntry<E>? firstEntry() =>
|
||||
_sentinel._nextLink!._asNonSentinelEntry();
|
||||
}
|
24
tests/web_2/regress/private_names_lib2.dart
Normal file
24
tests/web_2/regress/private_names_lib2.dart
Normal file
|
@ -0,0 +1,24 @@
|
|||
// Copyright (c) 2022, 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.
|
||||
|
||||
class DoubleLinkedQueueEntry<E> {
|
||||
DoubleLinkedQueueEntry<E>? _previousLink;
|
||||
DoubleLinkedQueueEntry<E>? _nextLink;
|
||||
|
||||
E element;
|
||||
|
||||
DoubleLinkedQueueEntry(this.element);
|
||||
|
||||
void _link(
|
||||
DoubleLinkedQueueEntry<E>? previous, DoubleLinkedQueueEntry<E>? next) {
|
||||
_nextLink = next;
|
||||
_previousLink = previous;
|
||||
previous?._nextLink = this;
|
||||
next?._previousLink = this;
|
||||
}
|
||||
|
||||
void prepend(E e) {
|
||||
DoubleLinkedQueueEntry<E>(e)._link(_previousLink, this);
|
||||
}
|
||||
}
|
33
tests/web_2/regress/private_names_test.dart
Normal file
33
tests/web_2/regress/private_names_test.dart
Normal file
|
@ -0,0 +1,33 @@
|
|||
// Copyright (c) 2022, 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.
|
||||
|
||||
// Derived from lib_2/collection/queue_test which showed in error in the
|
||||
// of private names in dart2js.
|
||||
|
||||
// @dart = 2.9
|
||||
|
||||
library queue.test;
|
||||
|
||||
import 'private_names_lib1.dart';
|
||||
|
||||
class DoubleLinkedQueueTest {
|
||||
void testMain() {
|
||||
testQueueElements();
|
||||
}
|
||||
|
||||
void testQueueElements() {
|
||||
DoubleLinkedQueue<int> queue1 = new DoubleLinkedQueue<int>.from([1, 2, 3]);
|
||||
var firstEntry = queue1.firstEntry();
|
||||
firstEntry.prepend(4);
|
||||
}
|
||||
}
|
||||
|
||||
void linkEntryTest() {
|
||||
var entry = new DoubleLinkedQueueEntry(42);
|
||||
}
|
||||
|
||||
main() {
|
||||
new DoubleLinkedQueueTest().testMain();
|
||||
linkEntryTest();
|
||||
}
|
Loading…
Reference in a new issue