| // 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"); |
| } |
| } |
| } |