blob: 6ee0789244ea935df79603c012d4cbef40a2e7bf [file] [log] [blame]
// Copyright (c) 2025, 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.partial;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DirectMappedDexApplication;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.Timing;
import java.util.Collection;
import java.util.Collections;
public abstract class R8PartialSubCompilationConfiguration {
public final Timing timing;
R8PartialSubCompilationConfiguration(Timing timing) {
this.timing = timing;
}
public boolean isR8() {
return false;
}
public R8PartialR8SubCompilationConfiguration asR8SubCompilationConfiguration() {
return null;
}
/** Returns true if normal writing should be aborted. */
public void writeApplication(Collection<DexProgramClass> outputClasses, InternalOptions options) {
assert false;
}
public static class R8PartialD8DexSubCompilationConfiguration
extends R8PartialSubCompilationConfiguration {
private Collection<DexProgramClass> outputClasses;
public R8PartialD8DexSubCompilationConfiguration(Timing timing) {
super(timing);
}
public Collection<DexProgramClass> getOutputClasses() {
assert outputClasses != null;
return outputClasses;
}
@Override
public void writeApplication(
Collection<DexProgramClass> outputClasses, InternalOptions options) {
this.outputClasses = outputClasses;
}
}
public static class R8PartialD8DesugarSubCompilationConfiguration
extends R8PartialSubCompilationConfiguration {
private Collection<DexProgramClass> outputClasses;
public R8PartialD8DesugarSubCompilationConfiguration(Timing timing) {
super(timing);
}
public Collection<DexProgramClass> getOutputClasses() {
assert outputClasses != null;
return outputClasses;
}
@Override
public void writeApplication(
Collection<DexProgramClass> outputClasses, InternalOptions options) {
this.outputClasses = outputClasses;
}
}
public static class R8PartialR8SubCompilationConfiguration
extends R8PartialSubCompilationConfiguration {
private Collection<DexProgramClass> desugaringOutputClasses;
private Collection<DexProgramClass> dexingOutputClasses;
public R8PartialR8SubCompilationConfiguration(
Collection<DexProgramClass> desugaringOutputClasses,
Collection<DexProgramClass> dexingOutputClasses,
Timing timing) {
super(timing);
this.desugaringOutputClasses = desugaringOutputClasses;
this.dexingOutputClasses = dexingOutputClasses;
}
public Collection<DexProgramClass> getDexingOutputClasses() {
assert dexingOutputClasses != null;
return dexingOutputClasses;
}
public DirectMappedDexApplication commitDesugaringOutputClasses(
DirectMappedDexApplication app) {
assert app.classes().isEmpty();
DirectMappedDexApplication newApp =
app.builder().addProgramClasses(desugaringOutputClasses).build();
desugaringOutputClasses = null;
return newApp;
}
public void commitDexingOutputClasses(AppView<AppInfoWithClassHierarchy> appView) {
DirectMappedDexApplication newApp =
appView
.app()
.asDirect()
.builder()
// TODO(b/390570711): This should not clear all classpath classes, only the ones we
// inject into program.
.replaceClasspathClasses(Collections.emptyList())
.addProgramClasses(dexingOutputClasses)
.build();
appView.setAppInfo(appView.appInfo().rebuildWithClassHierarchy(newApp));
dexingOutputClasses = null;
}
@Override
public boolean isR8() {
return true;
}
@Override
public R8PartialR8SubCompilationConfiguration asR8SubCompilationConfiguration() {
return this;
}
}
}