blob: 551f54efde772d52233e989d9b5830a5e99b7f43 [file]
// Copyright (c) 2026, 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.retrace;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.CliParserUtils;
import com.android.tools.r8.utils.PartitionMapZipContainer;
import com.android.tools.r8.utils.StringDiagnostic;
import com.android.tools.r8.utils.internal.CliParser;
import com.android.tools.r8.utils.internal.StringUtils;
import java.nio.file.Paths;
public class PartitionCommandParser {
private static class ParserState {
final PartitionCommand.Builder builder;
final Origin origin;
boolean isProguardMapProducerSet = false;
public ParserState(PartitionCommand.Builder builder, Origin origin) {
this.builder = builder;
this.origin = origin;
}
}
private static CliParser<ParserState> createParser() {
var header =
StringUtils.lines(
"Usage: partition [options] <proguard-map>",
" where <proguard-map> is a generated mapping file and options are:");
var parser = new CliParser<ParserState>(header);
return parser
.option1(
"--output",
"<partition-map>",
"Output destination of partitioned map.",
(b, arg) -> {
if (arg.isEmpty()) {
b.builder.getReporter().error(new StringDiagnostic("Empty argument for --output"));
} else {
b.builder.setPartitionMapConsumer(
PartitionMapZipContainer.createPartitionMapZipContainerConsumer(
Paths.get(arg)));
}
})
.apply(CliParserUtils.addVersionOption(b -> b.builder.setPrintVersion(true)))
.apply(CliParserUtils.addHelpOption(b -> b.builder.setPrintHelp(true)))
.positional(
(b, arg) -> {
if (!b.isProguardMapProducerSet) {
b.builder.setProguardMapProducer(ProguardMapProducer.fromPath(Paths.get(arg)));
b.isProguardMapProducerSet = true;
} else {
StringDiagnostic error =
new StringDiagnostic(
"Too many arguments specified for builder at " + arg, b.origin);
b.builder.getReporter().error(error);
}
});
}
static String getUsageMessage() {
return CliParserUtils.getUsageMessage(createParser());
}
public static PartitionCommand.Builder parse(String[] args, Origin origin) {
PartitionCommand.Builder builder = PartitionCommand.builder();
createParser()
.parse(args, new ParserState(builder, origin), err -> builder.getReporter().error(err));
return builder;
}
}