blob: ce53a6a7cef14fe13363ca9e6e8481fd6ff5a9fa [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.initializer;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.ir.code.InvokeDirect;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.MapUtils;
import com.google.common.collect.ImmutableMap;
public abstract class InstanceInitializerInfoCollection {
public static Builder builder() {
return new Builder();
}
public static InstanceInitializerInfoCollection empty() {
return EmptyInstanceInitializerInfoCollection.getInstance();
}
public static InstanceInitializerInfoCollection of(InstanceInitializerInfo info) {
if (info != null && info.isNonTrivialInstanceInitializerInfo()) {
return new ContextInsensitiveInstanceInitializerInfoCollection(
info.asNonTrivialInstanceInitializerInfo());
}
return empty();
}
public abstract InstanceInitializerInfo getContextInsensitive();
public abstract InstanceInitializerInfo get(InvokeDirect invoke);
public abstract boolean isEmpty();
public abstract InstanceInitializerInfoCollection rewrittenWithLens(
AppView<AppInfoWithLiveness> appView, GraphLens lens);
public static class Builder {
private final ImmutableMap.Builder<
InstanceInitializerInfoContext, NonTrivialInstanceInitializerInfo>
infosBuilder = ImmutableMap.builder();
private Builder() {}
public Builder put(InstanceInitializerInfoContext context, InstanceInitializerInfo info) {
if (info.isNonTrivialInstanceInitializerInfo()) {
infosBuilder.put(context, info.asNonTrivialInstanceInitializerInfo());
}
return this;
}
public InstanceInitializerInfoCollection build() {
ImmutableMap<InstanceInitializerInfoContext, NonTrivialInstanceInitializerInfo> infos =
infosBuilder.build();
if (infos.isEmpty()) {
return empty();
}
if (infos.size() == 1 && MapUtils.firstKey(infos).isAlwaysTrue()) {
return new ContextInsensitiveInstanceInitializerInfoCollection(MapUtils.firstValue(infos));
}
return new ContextSensitiveInstanceInitializerInfoCollection(infos);
}
}
}