blob: 105265791291bbee519727473f0d136aa2110bd1 [file] [log] [blame]
// Copyright (c) 2021, 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;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase.KeepRuleConsumer;
import com.android.tools.r8.errors.Unreachable;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
public class LibraryDesugaringTestConfiguration {
private final List<StringResource> desugaredLibrarySpecificationResources;
private final KeepRuleConsumer keepRuleConsumer;
public static final LibraryDesugaringTestConfiguration DISABLED =
new LibraryDesugaringTestConfiguration();
private LibraryDesugaringTestConfiguration() {
this.keepRuleConsumer = null;
this.desugaredLibrarySpecificationResources = null;
}
private LibraryDesugaringTestConfiguration(
List<StringResource> desugaredLibrarySpecificationResources,
KeepRuleConsumer keepRuleConsumer) {
this.desugaredLibrarySpecificationResources = desugaredLibrarySpecificationResources;
this.keepRuleConsumer = keepRuleConsumer;
}
public static class Builder {
private final List<StringResource> desugaredLibrarySpecificationResources = new ArrayList<>();
KeepRuleConsumer keepRuleConsumer;
private Builder() {}
public Builder setKeepRuleConsumer(KeepRuleConsumer keepRuleConsumer) {
this.keepRuleConsumer = keepRuleConsumer;
return this;
}
public Builder addDesugaredLibraryConfiguration(StringResource desugaredLibrarySpecification) {
desugaredLibrarySpecificationResources.add(desugaredLibrarySpecification);
return this;
}
public LibraryDesugaringTestConfiguration build() {
assert !desugaredLibrarySpecificationResources.isEmpty();
return new LibraryDesugaringTestConfiguration(
desugaredLibrarySpecificationResources, keepRuleConsumer);
}
}
public static Builder builder() {
return new Builder();
}
public static LibraryDesugaringTestConfiguration forSpecification(Path specification) {
return LibraryDesugaringTestConfiguration.builder()
.addDesugaredLibraryConfiguration(StringResource.fromFile(specification))
.build();
}
public boolean isEnabled() {
return this != DISABLED;
}
public void configure(D8Command.Builder builder) {
if (!isEnabled()) {
return;
}
if (keepRuleConsumer != null) {
builder.setDesugaredLibraryKeepRuleConsumer(keepRuleConsumer);
}
desugaredLibrarySpecificationResources.forEach(builder::addDesugaredLibraryConfiguration);
}
public void configure(R8Command.Builder builder) {
if (!isEnabled()) {
return;
}
if (keepRuleConsumer != null) {
builder.setDesugaredLibraryKeepRuleConsumer(keepRuleConsumer);
}
desugaredLibrarySpecificationResources.forEach(builder::addDesugaredLibraryConfiguration);
}
public static class PresentKeepRuleConsumer implements KeepRuleConsumer {
StringBuilder stringBuilder = new StringBuilder();
String result = null;
@Override
public void accept(String string, DiagnosticsHandler handler) {
assert stringBuilder != null;
assert result == null;
stringBuilder.append(string);
}
@Override
public void finished(DiagnosticsHandler handler) {
assert stringBuilder != null;
assert result == null;
result = stringBuilder.toString();
stringBuilder = null;
}
public String get() {
// TODO(clement): remove that branch once StringConsumer has finished again.
if (stringBuilder != null) {
finished(null);
}
assert stringBuilder == null;
assert result != null;
return result;
}
}
public static class AbsentKeepRuleConsumer implements KeepRuleConsumer {
public String get() {
return null;
}
@Override
public void accept(String string, DiagnosticsHandler handler) {
throw new Unreachable("No desugaring on high API levels");
}
@Override
public void finished(DiagnosticsHandler handler) {
throw new Unreachable("No desugaring on high API levels");
}
}
}