| // 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; |
| } |