blob: 24c30f15e23dfdc0f3af0029673f7165f2b1f737 [file] [log] [blame]
// 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 'package:analyzer/src/dart/analysis/unlinked_data.dart';
import 'package:meta/meta.dart';
abstract class UnlinkedUnitStore {
void clear();
AnalysisDriverUnlinkedUnit? get(String key);
void put(String key, AnalysisDriverUnlinkedUnit value);
void release(String key);
}
class UnlinkedUnitStoreImpl implements UnlinkedUnitStore {
// TODO(jensj): Could we use finalizers and automatically clean up
// this map?
@visibleForTesting
final Map<String, _UnlinkedUnitStoreData> map = {};
@override
void clear() {
map.clear();
}
@override
AnalysisDriverUnlinkedUnit? get(String key) {
var lookup = map[key];
if (lookup != null) {
lookup.usageCount++;
return lookup.value.target;
}
return null;
}
@override
void put(String key, AnalysisDriverUnlinkedUnit value) {
map[key] = _UnlinkedUnitStoreData(WeakReference(value));
}
@override
void release(String key) {
var lookup = map[key];
if (lookup != null) {
lookup.usageCount--;
if (lookup.usageCount <= 0) {
map.remove(key);
}
}
}
}
class _UnlinkedUnitStoreData {
final WeakReference<AnalysisDriverUnlinkedUnit> value;
int usageCount = 1;
_UnlinkedUnitStoreData(this.value);
}