Reduce use of putIfAbsent
Change-Id: I2088d80126bd5af09c0091c768c381b13733aa1e
Reviewed-on: https://dart-review.googlesource.com/62021
Commit-Queue: Stephen Adams <sra@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 467d61b..54daa5c 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -1073,11 +1073,13 @@
/// this current set. This should only be called from [ImportSetLattice],
/// since it is where we preserve this invariant.
ImportSet _add(_DeferredImport import) {
- return _transitions.putIfAbsent(import, () {
- var result = new ImportSet(new List.from(_imports)..add(import));
+ ImportSet result = _transitions[import];
+ if (result == null) {
+ result = new ImportSet(new List.from(_imports)..add(import));
result._transitions[import] = result;
- return result;
- });
+ _transitions[import] = result;
+ }
+ return result;
}
String toString() {
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index 5b45c23..74e9360 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -1207,8 +1207,7 @@
// Put the other operators in buckets by size, later to be added in
// size order.
int size = computeSize(element);
- Set<MemberEntity> set =
- methodSizes.putIfAbsent(size, () => new Setlet<MemberEntity>());
+ Set<MemberEntity> set = methodSizes[size] ??= new Setlet<MemberEntity>();
set.add(element);
});
return methodSizes;
diff --git a/pkg/compiler/lib/src/inferrer/type_system.dart b/pkg/compiler/lib/src/inferrer/type_system.dart
index b5c8895..6fa9191 100644
--- a/pkg/compiler/lib/src/inferrer/type_system.dart
+++ b/pkg/compiler/lib/src/inferrer/type_system.dart
@@ -398,12 +398,14 @@
MemberTypeInformation getInferredTypeOfMember(MemberEntity member) {
assert(!member.isAbstract,
failedAt(member, "Unexpected abstract member $member."));
- return memberTypeInformations.putIfAbsent(member, () {
- MemberTypeInformation typeInformation =
- strategy.createMemberTypeInformation(_abstractValueDomain, member);
- _orderedTypeInformations.add(typeInformation);
- return typeInformation;
- });
+ return memberTypeInformations[member] ??= _getInferredTypeOfMember(member);
+ }
+
+ MemberTypeInformation _getInferredTypeOfMember(MemberEntity member) {
+ MemberTypeInformation typeInformation =
+ strategy.createMemberTypeInformation(_abstractValueDomain, member);
+ _orderedTypeInformations.add(typeInformation);
+ return typeInformation;
}
/**
diff --git a/pkg/compiler/lib/src/io/source_map_builder.dart b/pkg/compiler/lib/src/io/source_map_builder.dart
index ffb6423..c19cfa0 100644
--- a/pkg/compiler/lib/src/io/source_map_builder.dart
+++ b/pkg/compiler/lib/src/io/source_map_builder.dart
@@ -276,13 +276,11 @@
/// Map from line/column pairs to lists of [T] elements.
class LineColumnMap<T> {
Map<int, Map<int, List<T>>> _map = <int, Map<int, List<T>>>{};
- var _makeLineMap = () => <int, List<T>>{};
- var _makeList = () => <T>[];
/// Returns the list of elements associated with ([line],[column]).
List<T> _getList(int line, int column) {
- Map<int, List<T>> lineMap = _map.putIfAbsent(line, _makeLineMap);
- return lineMap.putIfAbsent(column, _makeList);
+ Map<int, List<T>> lineMap = _map[line] ??= <int, List<T>>{};
+ return lineMap[column] ??= <T>[];
}
/// Adds [element] to the end of the list of elements associated with
diff --git a/pkg/compiler/lib/src/js_backend/inferred_data.dart b/pkg/compiler/lib/src/js_backend/inferred_data.dart
index 3318b1c..1f5de05 100644
--- a/pkg/compiler/lib/src/js_backend/inferred_data.dart
+++ b/pkg/compiler/lib/src/js_backend/inferred_data.dart
@@ -167,8 +167,7 @@
@override
SideEffectsBuilder getSideEffectsBuilder(MemberEntity member) {
- return _sideEffectsBuilders.putIfAbsent(
- member, () => new SideEffectsBuilder(member));
+ return _sideEffectsBuilders[member] ??= new SideEffectsBuilder(member);
}
@override
diff --git a/pkg/compiler/lib/src/js_backend/interceptor_data.dart b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
index 3ef09f3..abed251 100644
--- a/pkg/compiler/lib/src/js_backend/interceptor_data.dart
+++ b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
@@ -254,8 +254,8 @@
if (member.name == Identifiers.call) return;
// All methods on [Object] are shadowed by [Interceptor].
if (cls == _commonElements.objectClass) return;
- Set<MemberEntity> set = _interceptedElements.putIfAbsent(
- member.name, () => new Set<MemberEntity>());
+ Set<MemberEntity> set =
+ _interceptedElements[member.name] ??= new Set<MemberEntity>();
set.add(member);
});
@@ -271,8 +271,8 @@
(ClassEntity cls, MemberEntity member) {
// All methods on [Object] are shadowed by [Interceptor].
if (cls == _commonElements.objectClass) return;
- Set<MemberEntity> set = _interceptedElements.putIfAbsent(
- member.name, () => new Set<MemberEntity>());
+ Set<MemberEntity> set =
+ _interceptedElements[member.name] ??= new Set<MemberEntity>();
set.add(member);
});
}
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 2136ceb..1af442c 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -930,215 +930,222 @@
}
LibraryEntity _getLibrary(ir.Library node, [LibraryEnv libraryEnv]) {
- return _libraryMap.putIfAbsent(node, () {
- assert(
- !_envIsClosed,
- "Environment of $this is closed. Trying to create "
- "library for $node.");
- Uri canonicalUri = node.importUri;
- String name = node.name;
- if (name == null) {
- // Use the file name as script name.
- String path = canonicalUri.path;
- name = path.substring(path.lastIndexOf('/') + 1);
- }
- IndexedLibrary library = createLibrary(name, canonicalUri);
- return _libraries.register(library, new LibraryData(node),
- libraryEnv ?? _env.lookupLibrary(canonicalUri));
- });
+ return _libraryMap[node] ??= _getLibraryCreate(node, libraryEnv);
+ }
+
+ LibraryEntity _getLibraryCreate(ir.Library node, LibraryEnv libraryEnv) {
+ assert(
+ !_envIsClosed,
+ "Environment of $this is closed. Trying to create "
+ "library for $node.");
+ Uri canonicalUri = node.importUri;
+ String name = node.name;
+ if (name == null) {
+ // Use the file name as script name.
+ String path = canonicalUri.path;
+ name = path.substring(path.lastIndexOf('/') + 1);
+ }
+ IndexedLibrary library = createLibrary(name, canonicalUri);
+ return _libraries.register(library, new LibraryData(node),
+ libraryEnv ?? _env.lookupLibrary(canonicalUri));
}
ClassEntity _getClass(ir.Class node, [ClassEnv classEnv]) {
- return _classMap.putIfAbsent(node, () {
- assert(
- !_envIsClosed,
- "Environment of $this is closed. Trying to create "
- "class for $node.");
- KLibrary library = _getLibrary(node.enclosingLibrary);
- if (classEnv == null) {
- classEnv = _libraries.getEnv(library).lookupClass(node.name);
- }
- IndexedClass cls =
- createClass(library, node.name, isAbstract: node.isAbstract);
- return _classes.register(cls,
- new ClassData(node, new RegularClassDefinition(cls, node)), classEnv);
- });
+ return _classMap[node] ??= _getClassCreate(node, classEnv);
+ }
+
+ ClassEntity _getClassCreate(ir.Class node, ClassEnv classEnv) {
+ assert(
+ !_envIsClosed,
+ "Environment of $this is closed. Trying to create "
+ "class for $node.");
+ KLibrary library = _getLibrary(node.enclosingLibrary);
+ if (classEnv == null) {
+ classEnv = _libraries.getEnv(library).lookupClass(node.name);
+ }
+ IndexedClass cls =
+ createClass(library, node.name, isAbstract: node.isAbstract);
+ return _classes.register(cls,
+ new ClassData(node, new RegularClassDefinition(cls, node)), classEnv);
}
TypedefEntity _getTypedef(ir.Typedef node) {
- return _typedefMap.putIfAbsent(node, () {
- assert(
- !_envIsClosed,
- "Environment of $this is closed. Trying to create "
- "typedef for $node.");
- IndexedLibrary library = _getLibrary(node.enclosingLibrary);
- IndexedTypedef typedef = createTypedef(library, node.name);
- TypedefType typedefType = new TypedefType(
- typedef,
- new List<DartType>.filled(
- node.typeParameters.length, const DynamicType()));
- return _typedefs.register(
- typedef, new TypedefData(node, typedef, typedefType));
- });
+ return _typedefMap[node] ??= _getTypedefCreate(node);
+ }
+
+ TypedefEntity _getTypedefCreate(ir.Typedef node) {
+ assert(
+ !_envIsClosed,
+ "Environment of $this is closed. Trying to create "
+ "typedef for $node.");
+ IndexedLibrary library = _getLibrary(node.enclosingLibrary);
+ IndexedTypedef typedef = createTypedef(library, node.name);
+ TypedefType typedefType = new TypedefType(
+ typedef,
+ new List<DartType>.filled(
+ node.typeParameters.length, const DynamicType()));
+ return _typedefs.register(
+ typedef, new TypedefData(node, typedef, typedefType));
}
TypeVariableEntity _getTypeVariable(ir.TypeParameter node) {
- return _typeVariableMap.putIfAbsent(node, () {
- assert(
- !_envIsClosed,
- "Environment of $this is closed. Trying to create "
- "type variable for $node.");
- if (node.parent is ir.Class) {
- ir.Class cls = node.parent;
- int index = cls.typeParameters.indexOf(node);
- return _typeVariables.register(
- createTypeVariable(_getClass(cls), node.name, index),
- new TypeVariableData(node));
- }
- if (node.parent is ir.FunctionNode) {
- ir.FunctionNode func = node.parent;
- int index = func.typeParameters.indexOf(node);
- if (func.parent is ir.Constructor) {
- ir.Constructor constructor = func.parent;
- ir.Class cls = constructor.enclosingClass;
+ return _typeVariableMap[node] ??= _getTypeVariableCreate(node);
+ }
+
+ TypeVariableEntity _getTypeVariableCreate(ir.TypeParameter node) {
+ assert(
+ !_envIsClosed,
+ "Environment of $this is closed. Trying to create "
+ "type variable for $node.");
+ if (node.parent is ir.Class) {
+ ir.Class cls = node.parent;
+ int index = cls.typeParameters.indexOf(node);
+ return _typeVariables.register(
+ createTypeVariable(_getClass(cls), node.name, index),
+ new TypeVariableData(node));
+ }
+ if (node.parent is ir.FunctionNode) {
+ ir.FunctionNode func = node.parent;
+ int index = func.typeParameters.indexOf(node);
+ if (func.parent is ir.Constructor) {
+ ir.Constructor constructor = func.parent;
+ ir.Class cls = constructor.enclosingClass;
+ return _getTypeVariable(cls.typeParameters[index]);
+ } else if (func.parent is ir.Procedure) {
+ ir.Procedure procedure = func.parent;
+ if (procedure.kind == ir.ProcedureKind.Factory) {
+ ir.Class cls = procedure.enclosingClass;
return _getTypeVariable(cls.typeParameters[index]);
- } else if (func.parent is ir.Procedure) {
- ir.Procedure procedure = func.parent;
- if (procedure.kind == ir.ProcedureKind.Factory) {
- ir.Class cls = procedure.enclosingClass;
- return _getTypeVariable(cls.typeParameters[index]);
- } else {
- return _typeVariables.register(
- createTypeVariable(_getMethod(procedure), node.name, index),
- new TypeVariableData(node));
- }
} else {
- throw new UnsupportedError(
- 'Unsupported function type parameter parent '
- 'node ${func.parent}.');
+ return _typeVariables.register(
+ createTypeVariable(_getMethod(procedure), node.name, index),
+ new TypeVariableData(node));
}
+ } else {
+ throw new UnsupportedError('Unsupported function type parameter parent '
+ 'node ${func.parent}.');
}
- throw new UnsupportedError('Unsupported type parameter type node $node.');
- });
+ }
+ throw new UnsupportedError('Unsupported type parameter type node $node.');
}
ConstructorEntity _getConstructor(ir.Member node) {
- return _constructorMap.putIfAbsent(node, () {
- assert(
- !_envIsClosed,
- "Environment of $this is closed. Trying to create "
- "constructor for $node.");
- MemberDefinition definition;
- ir.FunctionNode functionNode;
- ClassEntity enclosingClass = _getClass(node.enclosingClass);
- Name name = getName(node.name);
- bool isExternal = node.isExternal;
+ return _constructorMap[node] ??= _getConstructorCreate(node);
+ }
- IndexedConstructor constructor;
- if (node is ir.Constructor) {
- functionNode = node.function;
- constructor = createGenerativeConstructor(enclosingClass, name,
- _getParameterStructure(functionNode, includeTypeParameters: false),
- isExternal: isExternal, isConst: node.isConst);
- definition = new SpecialMemberDefinition(
- constructor, node, MemberKind.constructor);
- } else if (node is ir.Procedure) {
- functionNode = node.function;
- bool isFromEnvironment = isExternal &&
- name.text == 'fromEnvironment' &&
- const ['int', 'bool', 'String'].contains(enclosingClass.name);
- constructor = createFactoryConstructor(enclosingClass, name,
- _getParameterStructure(functionNode, includeTypeParameters: false),
- isExternal: isExternal,
- isConst: node.isConst,
- isFromEnvironmentConstructor: isFromEnvironment);
- definition = new RegularMemberDefinition(constructor, node);
- } else {
- // TODO(johnniwinther): Convert `node.location` to a [SourceSpan].
- throw failedAt(
- NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}.");
- }
- return _members.register<IndexedConstructor, ConstructorData>(
- constructor, new ConstructorDataImpl(node, functionNode, definition));
- });
+ ConstructorEntity _getConstructorCreate(ir.Member node) {
+ assert(
+ !_envIsClosed,
+ "Environment of $this is closed. Trying to create "
+ "constructor for $node.");
+ MemberDefinition definition;
+ ir.FunctionNode functionNode;
+ ClassEntity enclosingClass = _getClass(node.enclosingClass);
+ Name name = getName(node.name);
+ bool isExternal = node.isExternal;
+
+ IndexedConstructor constructor;
+ if (node is ir.Constructor) {
+ functionNode = node.function;
+ constructor = createGenerativeConstructor(enclosingClass, name,
+ _getParameterStructure(functionNode, includeTypeParameters: false),
+ isExternal: isExternal, isConst: node.isConst);
+ definition = new SpecialMemberDefinition(
+ constructor, node, MemberKind.constructor);
+ } else if (node is ir.Procedure) {
+ functionNode = node.function;
+ bool isFromEnvironment = isExternal &&
+ name.text == 'fromEnvironment' &&
+ const ['int', 'bool', 'String'].contains(enclosingClass.name);
+ constructor = createFactoryConstructor(enclosingClass, name,
+ _getParameterStructure(functionNode, includeTypeParameters: false),
+ isExternal: isExternal,
+ isConst: node.isConst,
+ isFromEnvironmentConstructor: isFromEnvironment);
+ definition = new RegularMemberDefinition(constructor, node);
+ } else {
+ // TODO(johnniwinther): Convert `node.location` to a [SourceSpan].
+ throw failedAt(
+ NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}.");
+ }
+ return _members.register<IndexedConstructor, ConstructorData>(
+ constructor, new ConstructorDataImpl(node, functionNode, definition));
}
FunctionEntity _getMethod(ir.Procedure node) {
- return _methodMap.putIfAbsent(node, () {
- assert(
- !_envIsClosed,
- "Environment of $this is closed. Trying to create "
- "function for $node.");
- LibraryEntity library;
- ClassEntity enclosingClass;
- if (node.enclosingClass != null) {
- enclosingClass = _getClass(node.enclosingClass);
- library = enclosingClass.library;
- } else {
- library = _getLibrary(node.enclosingLibrary);
- }
- Name name = getName(node.name);
- bool isStatic = node.isStatic;
- bool isExternal = node.isExternal;
- // TODO(johnniwinther): Remove `&& !node.isExternal` when #31233 is fixed.
- bool isAbstract = node.isAbstract && !node.isExternal;
- AsyncMarker asyncMarker = getAsyncMarker(node.function);
- IndexedFunction function;
- switch (node.kind) {
- case ir.ProcedureKind.Factory:
- throw new UnsupportedError("Cannot create method from factory.");
- case ir.ProcedureKind.Getter:
- function = createGetter(library, enclosingClass, name, asyncMarker,
- isStatic: isStatic,
- isExternal: isExternal,
- isAbstract: isAbstract);
- break;
- case ir.ProcedureKind.Method:
- case ir.ProcedureKind.Operator:
- function = createMethod(library, enclosingClass, name,
- _getParameterStructure(node.function), asyncMarker,
- isStatic: isStatic,
- isExternal: isExternal,
- isAbstract: isAbstract);
- break;
- case ir.ProcedureKind.Setter:
- assert(asyncMarker == AsyncMarker.SYNC);
- function = createSetter(library, enclosingClass, name.setter,
- isStatic: isStatic,
- isExternal: isExternal,
- isAbstract: isAbstract);
- break;
- }
- return _members.register<IndexedFunction, FunctionData>(
- function,
- new FunctionDataImpl(node, node.function,
- new RegularMemberDefinition(function, node)));
- });
+ return _methodMap[node] ??= _getMethodCreate(node);
+ }
+
+ FunctionEntity _getMethodCreate(ir.Procedure node) {
+ assert(
+ !_envIsClosed,
+ "Environment of $this is closed. Trying to create "
+ "function for $node.");
+ LibraryEntity library;
+ ClassEntity enclosingClass;
+ if (node.enclosingClass != null) {
+ enclosingClass = _getClass(node.enclosingClass);
+ library = enclosingClass.library;
+ } else {
+ library = _getLibrary(node.enclosingLibrary);
+ }
+ Name name = getName(node.name);
+ bool isStatic = node.isStatic;
+ bool isExternal = node.isExternal;
+ // TODO(johnniwinther): Remove `&& !node.isExternal` when #31233 is fixed.
+ bool isAbstract = node.isAbstract && !node.isExternal;
+ AsyncMarker asyncMarker = getAsyncMarker(node.function);
+ IndexedFunction function;
+ switch (node.kind) {
+ case ir.ProcedureKind.Factory:
+ throw new UnsupportedError("Cannot create method from factory.");
+ case ir.ProcedureKind.Getter:
+ function = createGetter(library, enclosingClass, name, asyncMarker,
+ isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
+ break;
+ case ir.ProcedureKind.Method:
+ case ir.ProcedureKind.Operator:
+ function = createMethod(library, enclosingClass, name,
+ _getParameterStructure(node.function), asyncMarker,
+ isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
+ break;
+ case ir.ProcedureKind.Setter:
+ assert(asyncMarker == AsyncMarker.SYNC);
+ function = createSetter(library, enclosingClass, name.setter,
+ isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
+ break;
+ }
+ return _members.register<IndexedFunction, FunctionData>(
+ function,
+ new FunctionDataImpl(
+ node, node.function, new RegularMemberDefinition(function, node)));
}
FieldEntity _getField(ir.Field node) {
- return _fieldMap.putIfAbsent(node, () {
- assert(
- !_envIsClosed,
- "Environment of $this is closed. Trying to create "
- "field for $node.");
- LibraryEntity library;
- ClassEntity enclosingClass;
- if (node.enclosingClass != null) {
- enclosingClass = _getClass(node.enclosingClass);
- library = enclosingClass.library;
- } else {
- library = _getLibrary(node.enclosingLibrary);
- }
- Name name = getName(node.name);
- bool isStatic = node.isStatic;
- IndexedField field = createField(library, enclosingClass, name,
- isStatic: isStatic,
- isAssignable: node.isMutable,
- isConst: node.isConst);
- return _members.register<IndexedField, FieldData>(field,
- new FieldDataImpl(node, new RegularMemberDefinition(field, node)));
- });
+ return _fieldMap[node] ??= _getFieldCreate(node);
+ }
+
+ FieldEntity _getFieldCreate(ir.Field node) {
+ assert(
+ !_envIsClosed,
+ "Environment of $this is closed. Trying to create "
+ "field for $node.");
+ LibraryEntity library;
+ ClassEntity enclosingClass;
+ if (node.enclosingClass != null) {
+ enclosingClass = _getClass(node.enclosingClass);
+ library = enclosingClass.library;
+ } else {
+ library = _getLibrary(node.enclosingLibrary);
+ }
+ Name name = getName(node.name);
+ bool isStatic = node.isStatic;
+ IndexedField field = createField(library, enclosingClass, name,
+ isStatic: isStatic,
+ isAssignable: node.isMutable,
+ isConst: node.isConst);
+ return _members.register<IndexedField, FieldData>(field,
+ new FieldDataImpl(node, new RegularMemberDefinition(field, node)));
}
ParameterStructure _getParameterStructure(ir.FunctionNode node,
diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart
index 0de573e..543d330 100644
--- a/pkg/compiler/lib/src/native/enqueue.dart
+++ b/pkg/compiler/lib/src/native/enqueue.dart
@@ -271,7 +271,7 @@
_elementEnvironment.forEachSupertype(cls, (InterfaceType type) {
List<ClassEntity> subtypes =
- emitter.subtypes.putIfAbsent(type.element, () => <ClassEntity>[]);
+ emitter.subtypes[type.element] ??= <ClassEntity>[];
subtypes.add(cls);
});
@@ -286,7 +286,7 @@
}
List<ClassEntity> directSubtypes =
- emitter.directSubtypes.putIfAbsent(superclass, () => <ClassEntity>[]);
+ emitter.directSubtypes[superclass] ??= <ClassEntity>[];
directSubtypes.add(cls);
}
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index dc49fe5..fecaed8 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -304,12 +304,10 @@
Selector selector = dynamicUse.selector;
String name = selector.name;
Object constraint = dynamicUse.receiverConstraint;
- Map<Selector, SelectorConstraints> selectors = selectorMap.putIfAbsent(
- name, () => new Maplet<Selector, SelectorConstraints>());
- UniverseSelectorConstraints constraints =
- selectors.putIfAbsent(selector, () {
- return selectorConstraintsStrategy.createSelectorConstraints(selector);
- });
+ Map<Selector, SelectorConstraints> selectors =
+ selectorMap[name] ??= new Maplet<Selector, SelectorConstraints>();
+ UniverseSelectorConstraints constraints = selectors[selector] ??=
+ selectorConstraintsStrategy.createSelectorConstraints(selector);
return constraints.addReceiverConstraint(constraint);
}
diff --git a/pkg/compiler/lib/src/universe/function_set.dart b/pkg/compiler/lib/src/universe/function_set.dart
index aee80f5..5f78a8e 100644
--- a/pkg/compiler/lib/src/universe/function_set.dart
+++ b/pkg/compiler/lib/src/universe/function_set.dart
@@ -20,7 +20,7 @@
Map<String, FunctionSetNode> nodes = new Map<String, FunctionSetNode>();
for (MemberEntity member in liveInstanceMembers) {
String name = member.name;
- nodes.putIfAbsent(name, () => new FunctionSetNode(name)).add(member);
+ (nodes[name] ??= new FunctionSetNode(name)).add(member);
}
return new FunctionSet.internal(nodes);
}