| // Copyright (c) 2020, the R8 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. | 
 |  | 
 | package com.android.tools.r8.shaking; | 
 |  | 
 | import com.android.tools.r8.graph.DexField; | 
 | import com.android.tools.r8.graph.DexProgramClass; | 
 | import com.android.tools.r8.graph.FieldAccessInfoCollectionImpl; | 
 | import com.android.tools.r8.graph.FieldAccessInfoImpl; | 
 | import com.google.common.collect.Sets; | 
 | import java.util.Set; | 
 |  | 
 | /** Used to mutate AppInfoWithLiveness between waves. */ | 
 | public class AppInfoWithLivenessModifier { | 
 |  | 
 |   private final Set<DexProgramClass> noLongerInstantiatedClasses = Sets.newConcurrentHashSet(); | 
 |   private final Set<DexField> noLongerWrittenFields = Sets.newConcurrentHashSet(); | 
 |  | 
 |   AppInfoWithLivenessModifier() {} | 
 |  | 
 |   public boolean isEmpty() { | 
 |     return noLongerInstantiatedClasses.isEmpty(); | 
 |   } | 
 |  | 
 |   public void removeInstantiatedType(DexProgramClass clazz) { | 
 |     noLongerInstantiatedClasses.add(clazz); | 
 |   } | 
 |  | 
 |   public void removeWrittenField(DexField field) { | 
 |     noLongerWrittenFields.add(field); | 
 |   } | 
 |  | 
 |   public void modify(AppInfoWithLiveness appInfo) { | 
 |     // Instantiated classes. | 
 |     noLongerInstantiatedClasses.forEach(appInfo::removeFromSingleTargetLookupCache); | 
 |     appInfo.mutateObjectAllocationInfoCollection( | 
 |         mutator -> noLongerInstantiatedClasses.forEach(mutator::markNoLongerInstantiated)); | 
 |     // Written fields. | 
 |     FieldAccessInfoCollectionImpl fieldAccessInfoCollection = | 
 |         appInfo.getMutableFieldAccessInfoCollection(); | 
 |     noLongerWrittenFields.forEach( | 
 |         field -> { | 
 |           FieldAccessInfoImpl fieldAccessInfo = fieldAccessInfoCollection.get(field); | 
 |           if (fieldAccessInfo != null) { | 
 |             fieldAccessInfo.clearWrites(); | 
 |           } | 
 |         }); | 
 |  | 
 |     clear(); | 
 |   } | 
 |  | 
 |   private void clear() { | 
 |     noLongerInstantiatedClasses.clear(); | 
 |   } | 
 | } |