blob: 93d5f607cc44799df6e7cee3a00e84b09239459a [file] [log] [blame]
// Copyright (c) 2021, 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.DexDefinition;
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
public abstract class EnqueuerEvent {
public static UnconditionalKeepInfoEvent unconditional() {
return UnconditionalKeepInfoEvent.get();
}
public DexDefinition getDefinition(DexDefinitionSupplier definitions) {
return null;
}
public boolean isNoSuchEvent() {
return false;
}
public boolean isClassEvent() {
return false;
}
public ClassEnqueuerEvent asClassEvent() {
return null;
}
public boolean isLiveClassEvent() {
return false;
}
public LiveClassEnqueuerEvent asLiveClassEvent() {
return null;
}
public boolean isInstantiatedClassEvent() {
return false;
}
public InstantiatedClassEnqueuerEvent asInstantiatedClassEvent() {
return null;
}
public boolean isUnconditionalKeepInfoEvent() {
return false;
}
public abstract EnqueuerEvent rewrittenWithLens(GraphLens lens);
public static class NoSuchEnqueuerEvent extends EnqueuerEvent {
private static final NoSuchEnqueuerEvent INSTANCE = new NoSuchEnqueuerEvent();
private NoSuchEnqueuerEvent() {}
public static NoSuchEnqueuerEvent get() {
return INSTANCE;
}
@Override
public boolean isNoSuchEvent() {
return true;
}
@Override
public EnqueuerEvent rewrittenWithLens(GraphLens lens) {
return this;
}
}
public abstract static class ClassEnqueuerEvent extends EnqueuerEvent {
private final DexType clazz;
ClassEnqueuerEvent(DexType clazz) {
this.clazz = clazz;
}
@Override
public DexDefinition getDefinition(DexDefinitionSupplier definitions) {
return definitions.definitionFor(getType());
}
public DexType getType() {
return clazz;
}
@Override
public boolean isClassEvent() {
return true;
}
@Override
public ClassEnqueuerEvent asClassEvent() {
return this;
}
}
public static class LiveClassEnqueuerEvent extends ClassEnqueuerEvent {
public LiveClassEnqueuerEvent(DexProgramClass clazz) {
this(clazz.getType());
}
private LiveClassEnqueuerEvent(DexType type) {
super(type);
}
@Override
public boolean isLiveClassEvent() {
return true;
}
@Override
public LiveClassEnqueuerEvent asLiveClassEvent() {
return this;
}
@Override
public EnqueuerEvent rewrittenWithLens(GraphLens lens) {
DexType rewrittenType = lens.lookupType(getType());
if (rewrittenType.isIntType()) {
return NoSuchEnqueuerEvent.get();
}
return new LiveClassEnqueuerEvent(rewrittenType);
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof LiveClassEnqueuerEvent) {
LiveClassEnqueuerEvent event = (LiveClassEnqueuerEvent) obj;
return getType() == event.getType();
}
return false;
}
@Override
public int hashCode() {
return (getType().hashCode() << 1) | 0;
}
}
public static class InstantiatedClassEnqueuerEvent extends ClassEnqueuerEvent {
public InstantiatedClassEnqueuerEvent(DexProgramClass clazz) {
this(clazz.getType());
}
private InstantiatedClassEnqueuerEvent(DexType type) {
super(type);
}
@Override
public boolean isInstantiatedClassEvent() {
return true;
}
@Override
public InstantiatedClassEnqueuerEvent asInstantiatedClassEvent() {
return this;
}
@Override
public EnqueuerEvent rewrittenWithLens(GraphLens lens) {
DexType rewrittenType = lens.lookupType(getType());
if (rewrittenType.isIntType()) {
return NoSuchEnqueuerEvent.get();
}
return new InstantiatedClassEnqueuerEvent(rewrittenType);
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof InstantiatedClassEnqueuerEvent) {
InstantiatedClassEnqueuerEvent event = (InstantiatedClassEnqueuerEvent) obj;
return getType() == event.getType();
}
return false;
}
@Override
public int hashCode() {
return (getType().hashCode() << 1) | 1;
}
}
public static class UnconditionalKeepInfoEvent extends EnqueuerEvent {
private static final UnconditionalKeepInfoEvent INSTANCE = new UnconditionalKeepInfoEvent();
private UnconditionalKeepInfoEvent() {}
public static UnconditionalKeepInfoEvent get() {
return INSTANCE;
}
@Override
public boolean isUnconditionalKeepInfoEvent() {
return true;
}
@Override
public EnqueuerEvent rewrittenWithLens(GraphLens lens) {
return this;
}
}
}