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