blob: 6bf4c74bc91b35b266192879cd8f0667746a36ca [file] [log] [blame]
// 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.ir.optimize.info.field;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.function.BiConsumer;
/**
* A mapping from instance fields of a class to information about how a particular constructor
* initializes these instance fields.
*
* <p>Returns {@link UnknownInstanceFieldInitializationInfo} if no information is known about the
* initialization of a given instance field.
*/
public abstract class InstanceFieldInitializationInfoCollection {
public static Builder builder() {
return new Builder();
}
public abstract void forEach(
DexDefinitionSupplier definitions,
BiConsumer<DexEncodedField, InstanceFieldInitializationInfo> consumer);
public abstract InstanceFieldInitializationInfo get(DexEncodedField field);
public abstract boolean isEmpty();
public abstract InstanceFieldInitializationInfoCollection rewrittenWithLens(
AppView<AppInfoWithLiveness> appView, GraphLense lens);
public static class Builder {
Map<DexField, InstanceFieldInitializationInfo> infos = new IdentityHashMap<>();
public void recordInitializationInfo(
DexEncodedField field, InstanceFieldInitializationInfo info) {
assert !infos.containsKey(field.field);
infos.put(field.field, info);
}
public InstanceFieldInitializationInfoCollection build() {
if (infos.isEmpty()) {
return EmptyInstanceFieldInitializationInfoCollection.getInstance();
}
return new NonTrivialInstanceFieldInitializationInfoCollection(infos);
}
}
}