blob: ed8077a59a8baa965dbdb5feb3d8b1fb6fabd009 [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.desugar;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.EnclosingMethodAttribute;
import com.android.tools.r8.graph.InnerClassAttribute;
import com.android.tools.r8.ir.desugar.InterfaceProcessor.InterfaceProcessorNestedGraphLens;
class InterfaceMethodRewriterFixup {
private final AppView<?> appView;
private final InterfaceProcessorNestedGraphLens graphLens;
InterfaceMethodRewriterFixup(AppView<?> appView, InterfaceProcessorNestedGraphLens graphLens) {
this.appView = appView;
this.graphLens = graphLens;
}
void run() {
if (graphLens == null) {
return;
}
for (DexProgramClass clazz : appView.appInfo().classes()) {
if (clazz.getEnclosingMethodAttribute() != null
&& clazz.getEnclosingMethodAttribute().getEnclosingMethod() != null) {
// Only relevant to rewrite for local or anonymous classes, as the interface
// desugaring only moves methods to the companion class.
InnerClassAttribute innerClassAttributeForThisClass =
clazz.getInnerClassAttributeForThisClass();
if (innerClassAttributeForThisClass != null
&& innerClassAttributeForThisClass.getOuter() == null) {
clazz.setEnclosingMethodAttribute(
fixupEnclosingMethodAttribute(clazz.getEnclosingMethodAttribute()));
}
}
}
}
private EnclosingMethodAttribute fixupEnclosingMethodAttribute(
EnclosingMethodAttribute enclosingMethodAttribute) {
DexMethod enclosingMethod = enclosingMethodAttribute.getEnclosingMethod();
DexMethod mappedEnclosingMethod = fixupDexMethodForEnclosingMethod(enclosingMethod);
return mappedEnclosingMethod != enclosingMethod
? new EnclosingMethodAttribute(mappedEnclosingMethod)
: enclosingMethodAttribute;
}
private DexMethod fixupDexMethodForEnclosingMethod(DexMethod method) {
if (method == null) {
return null;
}
// Map default methods to their companion methods.
DexMethod mappedMethod =
graphLens.getExtraOriginalMethodSignatures().getRepresentativeKey(method);
if (mappedMethod != null) {
return mappedMethod;
}
// For other methods moved to the companion class use the lens mapping.
return graphLens.getRenamedMethodSignature(method);
}
}