blob: 69f924853c2305c07c5c09b0bfea354e3d587df1 [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.optimize.bridgehoisting;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.lens.DefaultNonIdentityGraphLens;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.utils.collections.BidirectionalManyToOneMap;
import java.util.Set;
class BridgeHoistingLens extends DefaultNonIdentityGraphLens {
// Mapping from non-hoisted bridge methods to hoisted bridge methods.
private final BidirectionalManyToOneMap<DexMethod, DexMethod> bridgeToHoistedBridgeMap;
public BridgeHoistingLens(
AppView<?> appView,
BidirectionalManyToOneMap<DexMethod, DexMethod> bridgeToHoistedBridgeMap) {
super(appView.dexItemFactory(), appView.graphLens());
this.bridgeToHoistedBridgeMap = bridgeToHoistedBridgeMap;
}
@Override
public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) {
DexMethod renamedMethod = getPrevious().getRenamedMethodSignature(originalMethod, applied);
return getNextMethodSignature(renamedMethod);
}
@Override
public DexMethod getPreviousMethodSignature(DexMethod method) {
Set<DexMethod> bridges = bridgeToHoistedBridgeMap.getKeys(method);
return bridges.isEmpty() ? method : bridges.iterator().next();
}
@Override
public DexMethod getNextMethodSignature(DexMethod method) {
return bridgeToHoistedBridgeMap.getOrDefault(method, method);
}
@Override
public boolean hasCodeRewritings() {
return getPrevious().hasCodeRewritings();
}
}