blob: eb6b8d8ab71a2bcf0e5cae3faf5390308a64d744 [file] [log] [blame]
// Copyright (c) 2019, 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:build/build.dart';
import 'package:build_runner/src/watcher/asset_change.dart';
import 'package:watcher/watcher.dart';
/// Merges [AssetChange] events.
///
/// For example, if an asset was added then immediately deleted, no event will
/// be recorded for the given asset.
Map<AssetId, ChangeType> collectChanges(List<List<AssetChange>> changes) {
var changeMap = <AssetId, ChangeType>{};
for (var change in changes.expand((l) => l)) {
var originalChangeType = changeMap[change.id];
if (originalChangeType != null) {
switch (originalChangeType) {
case ChangeType.ADD:
if (change.type == ChangeType.REMOVE) {
// ADD followed by REMOVE, just remove the change.
changeMap.remove(change.id);
}
break;
case ChangeType.REMOVE:
if (change.type == ChangeType.ADD) {
// REMOVE followed by ADD, convert to a MODIFY
changeMap[change.id] = ChangeType.MODIFY;
} else if (change.type == ChangeType.MODIFY) {
// REMOVE followed by MODIFY isn't sensible, just throw.
throw StateError(
'Internal error, got REMOVE event followed by MODIFY event for '
'${change.id}.');
}
break;
case ChangeType.MODIFY:
if (change.type == ChangeType.REMOVE) {
// MODIFY followed by REMOVE, convert to REMOVE
changeMap[change.id] = change.type;
} else if (change.type == ChangeType.ADD) {
// MODIFY followed by ADD isn't sensible, just throw.
throw StateError(
'Internal error, got MODIFY event followed by ADD event for '
'${change.id}.');
}
break;
}
} else {
changeMap[change.id] = change.type;
}
}
return changeMap;
}