diff --git a/pkg/compiler/lib/src/common/elements.dart b/pkg/compiler/lib/src/common/elements.dart index 1e228c82cd0..9fc40de2d1e 100644 --- a/pkg/compiler/lib/src/common/elements.dart +++ b/pkg/compiler/lib/src/common/elements.dart @@ -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(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); diff --git a/pkg/compiler/lib/src/common/names.dart b/pkg/compiler/lib/src/common/names.dart index 3058b114d2e..abd2114d234 100644 --- a/pkg/compiler/lib/src/common/names.dart +++ b/pkg/compiler/lib/src/common/names.dart @@ -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); diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart index bc9c67a8b36..d81e3f9e11b 100644 --- a/pkg/compiler/lib/src/dump_info.dart +++ b/pkg/compiler/lib/src/dump_info.dart @@ -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,10 +571,12 @@ 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) ?? - environment.lookupConstructor(classEntity, member.name.text); + 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; if (member.function != null) { @@ -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); diff --git a/pkg/compiler/lib/src/elements/names.dart b/pkg/compiler/lib/src/elements/names.dart index f4ec96fb6b7..5a29f209b9f 100644 --- a/pkg/compiler/lib/src/elements/names.dart +++ b/pkg/compiler/lib/src/elements/names.dart @@ -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()}'; } diff --git a/pkg/compiler/lib/src/inferrer/builder.dart b/pkg/compiler/lib/src/inferrer/builder.dart index 6a4a5f2ad33..15d51e6fb0f 100644 --- a/pkg/compiler/lib/src/inferrer/builder.dart +++ b/pkg/compiler/lib/src/inferrer/builder.dart @@ -1472,7 +1472,7 @@ class KernelTypeGraphBuilder extends ir.Visitor // 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, diff --git a/pkg/compiler/lib/src/inferrer/engine.dart b/pkg/compiler/lib/src/inferrer/engine.dart index 8eb65cb3df7..9ce44f033b5 100644 --- a/pkg/compiler/lib/src/inferrer/engine.dart +++ b/pkg/compiler/lib/src/inferrer/engine.dart @@ -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; } diff --git a/pkg/compiler/lib/src/ir/element_map.dart b/pkg/compiler/lib/src/ir/element_map.dart index 1b4030d2640..461b8d4d26e 100644 --- a/pkg/compiler/lib/src/ir/element_map.dart +++ b/pkg/compiler/lib/src/ir/element_map.dart @@ -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); diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart index dc91161d9c8..b0f59645dae 100644 --- a/pkg/compiler/lib/src/js_backend/namer.dart +++ b/pkg/compiler/lib/src/js_backend/namer.dart @@ -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 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. diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart index eacd078b41c..85647f89414 100644 --- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart +++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart @@ -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 && diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart index 8b351dc4827..ed597bd319c 100644 --- a/pkg/compiler/lib/src/js_backend/runtime_types.dart +++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart @@ -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); diff --git a/pkg/compiler/lib/src/js_model/closure_migrated.dart b/pkg/compiler/lib/src/js_model/closure_migrated.dart index ab35781b6e0..921fa2f7697 100644 --- a/pkg/compiler/lib/src/js_model/closure_migrated.dart +++ b/pkg/compiler/lib/src/js_model/closure_migrated.dart @@ -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); } diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart index f005c4d37f8..7deb133a31d 100644 --- a/pkg/compiler/lib/src/js_model/element_map_impl.dart +++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart @@ -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 memberMap) { + Map 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 memberMap = {}; + Map 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 memberMap = {}; + Map 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 recordFieldsVisibleInScope, - Map memberMap) { + Map 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 memberMap, + Map memberMap, ir.TreeNode sourceNode, Map 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 memberMap, + Map 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 memberMap, + Map 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}."); diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart index e5f8780354d..fdb122c9b02 100644 --- a/pkg/compiler/lib/src/js_model/elements.dart +++ b/pkg/compiler/lib/src/js_model/elements.dart @@ -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); diff --git a/pkg/compiler/lib/src/js_model/env.dart b/pkg/compiler/lib/src/js_model/env.dart index f597c52f179..065a4858c0c 100644 --- a/pkg/compiler/lib/src/js_model/env.dart +++ b/pkg/compiler/lib/src/js_model/env.dart @@ -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 _constructorMap; - final Map _memberMap; - final Map _setterMap; + final Map _memberMap; final List _members; // in declaration order. @override final bool isMixinApplicationWithMembers; @@ -253,23 +252,20 @@ class JClassEnvImpl implements JClassEnv { /// Constructor bodies created for this class. List _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 constructorMap = source.readStringMap(source.readMemberNode); - Map memberMap = - source.readStringMap(source.readMemberNode); - Map setterMap = - source.readStringMap(source.readMemberNode); + Map memberMap = source.readNameMap(source.readMemberNode); List 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 _memberMap; + final Map _memberMap; RecordEnv(this._memberMap); factory RecordEnv.readFromDataSource(DataSourceReader source) { source.begin(tag); - Map _memberMap = - source.readStringMap(() => source.readMember()); + Map _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 memberMap) : super(memberMap); + ClosureClassEnv(Map memberMap) : super(memberMap); factory ClosureClassEnv.readFromDataSource(DataSourceReader source) { source.begin(tag); - Map _memberMap = - source.readStringMap(() => source.readMember()); + Map _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. diff --git a/pkg/compiler/lib/src/js_model/js_world.dart b/pkg/compiler/lib/src/js_model/js_world.dart index 1d405d4a170..7f0bb7bf2c7 100644 --- a/pkg/compiler/lib/src/js_model/js_world.dart +++ b/pkg/compiler/lib/src/js_model/js_world.dart @@ -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) { diff --git a/pkg/compiler/lib/src/js_model/js_world_builder.dart b/pkg/compiler/lib/src/js_model/js_world_builder.dart index 5433635cc5c..a222f017d3b 100644 --- a/pkg/compiler/lib/src/js_model/js_world_builder.dart +++ b/pkg/compiler/lib/src/js_model/js_world_builder.dart @@ -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 methodsNeedingSignature = map.toBackendFunctionSet(rtiNeed.methodsNeedingSignature); Set 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, diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart index c0e7df0d750..907a6100e33 100644 --- a/pkg/compiler/lib/src/kernel/element_map_impl.dart +++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart @@ -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}."); diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart index 06063106801..f4ca087ea99 100644 --- a/pkg/compiler/lib/src/kernel/env.dart +++ b/pkg/compiler/lib/src/kernel/env.dart @@ -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 liveMemberUsage) { Map memberMap; Map setterMap; @@ -171,7 +172,7 @@ class KLibraryEnv { } else { memberMap = {}; _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 = {}; _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 liveMemberUsage); + /// + /// [getJLibrary] returns the [LibraryEntity] in the J-model corresponding to + /// a [ir.Library] node. + JClassEnv convert( + IrToElementMap kElementMap, + Map 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 _constructorMap; - Map _memberMap; - Map _setterMap; + Map _memberMap; List _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 = {}; - _setterMap = {}; + _memberMap = {}; _constructorMap = {}; var members = []; _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 liveMemberUsage) { + JClassEnv convert( + IrToElementMap kElementMap, + Map liveMemberUsage, + LibraryEntity Function(ir.Library library) getJLibrary) { Map constructorMap; - Map memberMap; - Map setterMap; + Map memberMap; List members; if (_constructorMap == null) { constructorMap = const {}; } else { constructorMap = {}; _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 {}; + memberMap = const {}; } else { - memberMap = {}; - _memberMap.forEach((String name, ir.Member node) { - MemberEntity member = elementMap.getMember(node); + memberMap = {}; + _memberMap.forEach((Name name, ir.Member node) { + MemberEntity member = kElementMap.getMember(node); if (liveMemberUsage.containsKey(member)) { memberMap[name] = node; } }); } - if (_setterMap == null) { - setterMap = const {}; - } else { - setterMap = {}; - _setterMap.forEach((String name, ir.Member node) { - MemberEntity member = elementMap.getMember(node); - if (liveMemberUsage.containsKey(member)) { - setterMap[name] = node; - } - }); - } if (_members == null) { members = const []; } else { members = []; _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); } } diff --git a/pkg/compiler/lib/src/kernel/kernel_impact.dart b/pkg/compiler/lib/src/kernel/kernel_impact.dart index c4c4f4c3865..de768f5f024 100644 --- a/pkg/compiler/lib/src/kernel/kernel_impact.dart +++ b/pkg/compiler/lib/src/kernel/kernel_impact.dart @@ -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 { diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart index e53d7c68cd1..670b9f20b10 100644 --- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart +++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart @@ -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( diff --git a/pkg/compiler/lib/src/kernel/kernel_world.dart b/pkg/compiler/lib/src/kernel/kernel_world.dart index b60859be2bd..0f9ae538da3 100644 --- a/pkg/compiler/lib/src/kernel/kernel_world.dart +++ b/pkg/compiler/lib/src/kernel/kernel_world.dart @@ -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}."); } } diff --git a/pkg/compiler/lib/src/serialization/serialization.dart b/pkg/compiler/lib/src/serialization/serialization.dart index 5e61e495e01..755c2a34622 100644 --- a/pkg/compiler/lib/src/serialization/serialization.dart +++ b/pkg/compiler/lib/src/serialization/serialization.dart @@ -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'; diff --git a/pkg/compiler/lib/src/serialization/sink.dart b/pkg/compiler/lib/src/serialization/sink.dart index 5aad4b23a4a..2a38bb80285 100644 --- a/pkg/compiler/lib/src/serialization/sink.dart +++ b/pkg/compiler/lib/src/serialization/sink.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(Map? 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; diff --git a/pkg/compiler/lib/src/serialization/source.dart b/pkg/compiler/lib/src/serialization/source.dart index bd55802e0ff..b3cc2c94ae4 100644 --- a/pkg/compiler/lib/src/serialization/source.dart +++ b/pkg/compiler/lib/src/serialization/source.dart @@ -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? readNameMap(V f(), {bool emptyAsNull = false}) { + int count = readInt(); + if (count == 0 && emptyAsNull) return null; + Map 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(); diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart index 41f9204cb39..4e052630bdb 100644 --- a/pkg/compiler/lib/src/ssa/builder.dart +++ b/pkg/compiler/lib/src/ssa/builder.dart @@ -4285,7 +4285,7 @@ class KernelSsaGraphBuilder extends ir.Visitor with ir.VisitorVoidMixin { Map 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: diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart index 5e55d7e10bb..3e1c0391ffa 100644 --- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart +++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart @@ -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; diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart index 85797a11fef..c2519c29be3 100644 --- a/pkg/compiler/lib/src/ssa/optimize.dart +++ b/pkg/compiler/lib/src/ssa/optimize.dart @@ -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'); } diff --git a/pkg/compiler/lib/src/universe/selector.dart b/pkg/compiler/lib/src/universe/selector.dart index c32eff00f0c..8e28d804362 100644 --- a/pkg/compiler/lib/src/universe/selector.dart +++ b/pkg/compiler/lib/src/universe/selector.dart @@ -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; diff --git a/pkg/compiler/test/codegen/trust_type_annotations_test.dart b/pkg/compiler/test/codegen/trust_type_annotations_test.dart index 99ac44368ad..0e6cf40f288 100644 --- a/pkg/compiler/test/codegen/trust_type_annotations_test.dart +++ b/pkg/compiler/test/codegen/trust_type_annotations_test.dart @@ -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)); } diff --git a/pkg/compiler/test/end_to_end/dill_loader_test.dart b/pkg/compiler/test/end_to_end/dill_loader_test.dart index 8cfe81aee43..437912354c8 100644 --- a/pkg/compiler/test/end_to_end/dill_loader_test.dart +++ b/pkg/compiler/test/end_to_end/dill_loader_test.dart @@ -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); }); } diff --git a/pkg/compiler/test/end_to_end/modular_loader_test.dart b/pkg/compiler/test/end_to_end/modular_loader_test.dart index 1a136a0a93e..5663824ed84 100644 --- a/pkg/compiler/test/end_to_end/modular_loader_test.dart +++ b/pkg/compiler/test/end_to_end/modular_loader_test.dart @@ -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); }); } diff --git a/pkg/compiler/test/equivalence/id_equivalence_helper.dart b/pkg/compiler/test/equivalence/id_equivalence_helper.dart index 1f740d3d598..e4e02eaf63a 100644 --- a/pkg/compiler/test/equivalence/id_equivalence_helper.dart +++ b/pkg/compiler/test/equivalence/id_equivalence_helper.dart @@ -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> computeData(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); diff --git a/pkg/compiler/test/generic_methods/generic_method_test.dart b/pkg/compiler/test/generic_methods/generic_method_test.dart index 119d58c8b00..3b40d0a79e6 100644 --- a/pkg/compiler/test/generic_methods/generic_method_test.dart +++ b/pkg/compiler/test/generic_methods/generic_method_test.dart @@ -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 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( diff --git a/pkg/compiler/test/helpers/element_lookup.dart b/pkg/compiler/test/helpers/element_lookup.dart index ae8bfa22e7f..e64400c062a 100644 --- a/pkg/compiler/test/helpers/element_lookup.dart +++ b/pkg/compiler/test/helpers/element_lookup.dart @@ -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); } diff --git a/pkg/compiler/test/helpers/program_lookup.dart b/pkg/compiler/test/helpers/program_lookup.dart index 600335dd145..01215b8eda6 100644 --- a/pkg/compiler/test/helpers/program_lookup.dart +++ b/pkg/compiler/test/helpers/program_lookup.dart @@ -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 { diff --git a/pkg/compiler/test/helpers/type_test_helper.dart b/pkg/compiler/test/helpers/type_test_helper.dart index 908efb48404..c5b838a79a5 100644 --- a/pkg/compiler/test/helpers/type_test_helper.dart +++ b/pkg/compiler/test/helpers/type_test_helper.dart @@ -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); diff --git a/pkg/compiler/test/model/constant_value_test.dart b/pkg/compiler/test/model/constant_value_test.dart index c289332f79b..d8adbe48872 100644 --- a/pkg/compiler/test/model/constant_value_test.dart +++ b/pkg/compiler/test/model/constant_value_test.dart @@ -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), diff --git a/pkg/compiler/test/model/enqueuer_test.dart b/pkg/compiler/test/model/enqueuer_test.dart index ac2f0c38450..32ec802d449 100644 --- a/pkg/compiler/test/model/enqueuer_test.dart +++ b/pkg/compiler/test/model/enqueuer_test.dart @@ -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( diff --git a/pkg/compiler/test/model/forwarding_stub_test.dart b/pkg/compiler/test/model/forwarding_stub_test.dart index 921e3cae68d..dbbf43c35db 100644 --- a/pkg/compiler/test/model/forwarding_stub_test.dart +++ b/pkg/compiler/test/model/forwarding_stub_test.dart @@ -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); diff --git a/pkg/compiler/test/model/no_such_method_enabled_test.dart b/pkg/compiler/test/model/no_such_method_enabled_test.dart index 1a24bd8c4e7..f60c2535bf5 100644 --- a/pkg/compiler/test/model/no_such_method_enabled_test.dart +++ b/pkg/compiler/test/model/no_such_method_enabled_test.dart @@ -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."); diff --git a/pkg/compiler/test/model/type_substitution_test.dart b/pkg/compiler/test/model/type_substitution_test.dart index d6482632c93..0e203262b80 100644 --- a/pkg/compiler/test/model/type_substitution_test.dart +++ b/pkg/compiler/test/model/type_substitution_test.dart @@ -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); diff --git a/pkg/compiler/test/rti/rti_need_test_helper.dart b/pkg/compiler/test/rti/rti_need_test_helper.dart index 56b46272208..d53fcf864ef 100644 --- a/pkg/compiler/test/rti/rti_need_test_helper.dart +++ b/pkg/compiler/test/rti/rti_need_test_helper.dart @@ -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( diff --git a/pkg/compiler/test/sourcemaps/name_test.dart b/pkg/compiler/test/sourcemaps/name_test.dart index fee442f6bbc..7799273f454 100644 --- a/pkg/compiler/test/sourcemaps/name_test.dart +++ b/pkg/compiler/test/sourcemaps/name_test.dart @@ -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); diff --git a/sdk/bin/dart2js.bat b/sdk/bin/dart2js.bat index 9341ad8a2b3..cc7a85d6996 100644 --- a/sdk/bin/dart2js.bat +++ b/sdk/bin/dart2js.bat @@ -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 diff --git a/tests/web/regress/private_names_lib1.dart b/tests/web/regress/private_names_lib1.dart new file mode 100644 index 00000000000..823a4d4a959 --- /dev/null +++ b/tests/web/regress/private_names_lib1.dart @@ -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 { + _DoubleLinkedQueueEntry? _previousLink; + _DoubleLinkedQueueEntry? _nextLink; + + void _link( + _DoubleLinkedQueueEntry? previous, _DoubleLinkedQueueEntry? next) { + _nextLink = next; + _previousLink = previous; + previous?._nextLink = this; + next?._previousLink = this; + } + + _DoubleLinkedQueueElement? _asNonSentinelEntry(); + + void _prepend(E element, DoubleLinkedQueue? queue) { + _DoubleLinkedQueueElement(element, queue)._link(_previousLink, this); + } +} + +class _DoubleLinkedQueueElement extends _DoubleLinkedQueueEntry + implements DoubleLinkedQueueEntry { + DoubleLinkedQueue? _queue; + E element; + + _DoubleLinkedQueueElement(this.element, this._queue); + + void prepend(E e) { + _prepend(e, _queue); + _queue?._elementCount++; + } + + _DoubleLinkedQueueElement _asNonSentinelEntry() => this; +} + +class _DoubleLinkedQueueSentinel extends _DoubleLinkedQueueEntry { + _DoubleLinkedQueueSentinel() { + _previousLink = this; + _nextLink = this; + } + + Null _asNonSentinelEntry() => null; +} + +class DoubleLinkedQueue /*extends Iterable implements Queue*/ { + final _DoubleLinkedQueueSentinel _sentinel = + _DoubleLinkedQueueSentinel(); + + int _elementCount = 0; + + DoubleLinkedQueue(); + + factory DoubleLinkedQueue.from(Iterable elements) { + DoubleLinkedQueue list = DoubleLinkedQueue(); + for (final e in elements) { + list.addLast(e as E); + } + return list; + } + + void addLast(E value) { + _sentinel._prepend(value, this); + _elementCount++; + } + + DoubleLinkedQueueEntry? firstEntry() => + _sentinel._nextLink!._asNonSentinelEntry(); +} diff --git a/tests/web/regress/private_names_lib2.dart b/tests/web/regress/private_names_lib2.dart new file mode 100644 index 00000000000..050c31a9921 --- /dev/null +++ b/tests/web/regress/private_names_lib2.dart @@ -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 { + DoubleLinkedQueueEntry? _previousLink; + DoubleLinkedQueueEntry? _nextLink; + + E element; + + DoubleLinkedQueueEntry(this.element); + + void _link( + DoubleLinkedQueueEntry? previous, DoubleLinkedQueueEntry? next) { + _nextLink = next; + _previousLink = previous; + previous?._nextLink = this; + next?._previousLink = this; + } + + void prepend(E e) { + DoubleLinkedQueueEntry(e)._link(_previousLink, this); + } +} diff --git a/tests/web/regress/private_names_test.dart b/tests/web/regress/private_names_test.dart new file mode 100644 index 00000000000..c50edbd3c93 --- /dev/null +++ b/tests/web/regress/private_names_test.dart @@ -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 queue1 = new DoubleLinkedQueue.from([1, 2, 3]); + var firstEntry = queue1.firstEntry()!; + firstEntry.prepend(4); + } +} + +void linkEntryTest() { + var entry = new DoubleLinkedQueueEntry(42); +} + +main() { + new DoubleLinkedQueueTest().testMain(); + linkEntryTest(); +} diff --git a/tests/web_2/regress/private_names_lib1.dart b/tests/web_2/regress/private_names_lib1.dart new file mode 100644 index 00000000000..823a4d4a959 --- /dev/null +++ b/tests/web_2/regress/private_names_lib1.dart @@ -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 { + _DoubleLinkedQueueEntry? _previousLink; + _DoubleLinkedQueueEntry? _nextLink; + + void _link( + _DoubleLinkedQueueEntry? previous, _DoubleLinkedQueueEntry? next) { + _nextLink = next; + _previousLink = previous; + previous?._nextLink = this; + next?._previousLink = this; + } + + _DoubleLinkedQueueElement? _asNonSentinelEntry(); + + void _prepend(E element, DoubleLinkedQueue? queue) { + _DoubleLinkedQueueElement(element, queue)._link(_previousLink, this); + } +} + +class _DoubleLinkedQueueElement extends _DoubleLinkedQueueEntry + implements DoubleLinkedQueueEntry { + DoubleLinkedQueue? _queue; + E element; + + _DoubleLinkedQueueElement(this.element, this._queue); + + void prepend(E e) { + _prepend(e, _queue); + _queue?._elementCount++; + } + + _DoubleLinkedQueueElement _asNonSentinelEntry() => this; +} + +class _DoubleLinkedQueueSentinel extends _DoubleLinkedQueueEntry { + _DoubleLinkedQueueSentinel() { + _previousLink = this; + _nextLink = this; + } + + Null _asNonSentinelEntry() => null; +} + +class DoubleLinkedQueue /*extends Iterable implements Queue*/ { + final _DoubleLinkedQueueSentinel _sentinel = + _DoubleLinkedQueueSentinel(); + + int _elementCount = 0; + + DoubleLinkedQueue(); + + factory DoubleLinkedQueue.from(Iterable elements) { + DoubleLinkedQueue list = DoubleLinkedQueue(); + for (final e in elements) { + list.addLast(e as E); + } + return list; + } + + void addLast(E value) { + _sentinel._prepend(value, this); + _elementCount++; + } + + DoubleLinkedQueueEntry? firstEntry() => + _sentinel._nextLink!._asNonSentinelEntry(); +} diff --git a/tests/web_2/regress/private_names_lib2.dart b/tests/web_2/regress/private_names_lib2.dart new file mode 100644 index 00000000000..050c31a9921 --- /dev/null +++ b/tests/web_2/regress/private_names_lib2.dart @@ -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 { + DoubleLinkedQueueEntry? _previousLink; + DoubleLinkedQueueEntry? _nextLink; + + E element; + + DoubleLinkedQueueEntry(this.element); + + void _link( + DoubleLinkedQueueEntry? previous, DoubleLinkedQueueEntry? next) { + _nextLink = next; + _previousLink = previous; + previous?._nextLink = this; + next?._previousLink = this; + } + + void prepend(E e) { + DoubleLinkedQueueEntry(e)._link(_previousLink, this); + } +} diff --git a/tests/web_2/regress/private_names_test.dart b/tests/web_2/regress/private_names_test.dart new file mode 100644 index 00000000000..fd157b2287a --- /dev/null +++ b/tests/web_2/regress/private_names_test.dart @@ -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 queue1 = new DoubleLinkedQueue.from([1, 2, 3]); + var firstEntry = queue1.firstEntry(); + firstEntry.prepend(4); + } +} + +void linkEntryTest() { + var entry = new DoubleLinkedQueueEntry(42); +} + +main() { + new DoubleLinkedQueueTest().testMain(); + linkEntryTest(); +}