blob: 73c7272a954d554aa3f26c34108cabb9ad7f9bb6 [file] [log] [blame]
// Copyright (c) 2024, 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.verticalclassmerging;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DefaultUseRegistry;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.MethodResolutionResult;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.graph.lens.MethodLookupResult;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.collections.DexMethodSignatureSet;
public class InvokeSuperExtractor extends DefaultUseRegistry<ProgramMethod> {
private final AppView<AppInfoWithLiveness> appViewWithLiveness;
private final GraphLens graphLens;
private final GraphLens codeLens;
private final DexMethodSignatureSet methodsOfInterest;
private final DexMethodSignatureSet result;
private final DexProgramClass source;
public InvokeSuperExtractor(
AppView<AppInfoWithLiveness> appView,
ProgramMethod context,
DexMethodSignatureSet methodsOfInterest,
DexMethodSignatureSet result,
DexProgramClass source) {
super(appView, context);
this.appViewWithLiveness = appView;
this.graphLens = appView.graphLens();
this.codeLens = context.getDefinition().getCode().getCodeLens(appView);
this.methodsOfInterest = methodsOfInterest;
this.result = result;
this.source = source;
}
@Override
public void registerInvokeSpecial(DexMethod method) {
assert false;
}
@Override
public void registerInvokeSuper(DexMethod method) {
handleInvokeSuper(method);
}
private void handleInvokeSuper(DexMethod method) {
MethodLookupResult lookupResult = graphLens.lookupInvokeSuper(method, getContext(), codeLens);
DexMethod rewrittenMethod = lookupResult.getReference();
if (!methodsOfInterest.contains(rewrittenMethod) || result.contains(rewrittenMethod)) {
return;
}
MethodResolutionResult currentResolutionResult =
appViewWithLiveness.appInfo().unsafeResolveMethodDueToDexFormat(rewrittenMethod);
DexClassAndMethod superTarget =
currentResolutionResult.lookupInvokeSuperTarget(getContext(), appViewWithLiveness);
if (superTarget != null && superTarget.getHolder() == source) {
result.add(superTarget);
}
}
}