|  | // Copyright (c) 2019, 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 java.util.ArrayList; | 
|  | import java.util.List; | 
|  |  | 
|  | /** | 
|  | * Immutable structure for specifying input and output of a feature split. | 
|  | * | 
|  | * <p>A {@link FeatureSplit} can be added to a {@link R8Command} to enable the building of dynamic | 
|  | * apps. | 
|  | * | 
|  | * <p>To build a {@link FeatureSplit} use the {@link FeatureSplit.Builder} class, available through | 
|  | * the {@link R8Command.Builder}. For example: | 
|  | * | 
|  | * <pre> | 
|  | *   R8Command command = R8Command.builder() | 
|  | *     .addProgramFiles(path1, path2) | 
|  | *     .setMode(CompilationMode.RELEASE) | 
|  | *     .setProgramConsumer(baseConsumer) | 
|  | *     .addFeatureSplit(builder -> builder | 
|  | *         .addProgramResourceProvider(programResourceProvider) | 
|  | *         .setProgramConsumer(featureConsumer) | 
|  | *         .build()) | 
|  | *     .build(); | 
|  | * </pre> | 
|  | */ | 
|  | @Keep | 
|  | public class FeatureSplit { | 
|  |  | 
|  | public static final FeatureSplit BASE = | 
|  | new FeatureSplit(null, null) { | 
|  | @Override | 
|  | public boolean isBase() { | 
|  | return true; | 
|  | } | 
|  | }; | 
|  |  | 
|  | public static final FeatureSplit BASE_STARTUP = | 
|  | new FeatureSplit(null, null) { | 
|  | @Override | 
|  | public boolean isBase() { | 
|  | return true; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean isStartupBase() { | 
|  | return true; | 
|  | } | 
|  | }; | 
|  |  | 
|  | private final ProgramConsumer programConsumer; | 
|  | private final List<ProgramResourceProvider> programResourceProviders; | 
|  |  | 
|  | private FeatureSplit( | 
|  | ProgramConsumer programConsumer, List<ProgramResourceProvider> programResourceProviders) { | 
|  | this.programConsumer = programConsumer; | 
|  | this.programResourceProviders = programResourceProviders; | 
|  | } | 
|  |  | 
|  | public boolean isBase() { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | public boolean isStartupBase() { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | public List<ProgramResourceProvider> getProgramResourceProviders() { | 
|  | return programResourceProviders; | 
|  | } | 
|  |  | 
|  | public ProgramConsumer getProgramConsumer() { | 
|  | return programConsumer; | 
|  | } | 
|  |  | 
|  | static Builder builder(DiagnosticsHandler handler) { | 
|  | return new Builder(handler); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Builder for constructing a FeatureSplit. | 
|  | * | 
|  | * <p>A builder is obtained by calling addFeatureSplit on a {@link R8Command.Builder}. | 
|  | */ | 
|  | @Keep | 
|  | public static class Builder { | 
|  | private ProgramConsumer programConsumer; | 
|  | private final List<ProgramResourceProvider> programResourceProviders = new ArrayList<>(); | 
|  | private final DiagnosticsHandler handler; | 
|  |  | 
|  | private Builder(DiagnosticsHandler handler) { | 
|  | this.handler = handler; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Set the program consumer. | 
|  | * | 
|  | * <p>Setting the program consumer will override any previous set consumer. This consumer is | 
|  | * specific to the feature, i.e., it will only get output from the | 
|  | * | 
|  | * @param programConsumer Program consumer to set as current. | 
|  | */ | 
|  | public Builder setProgramConsumer(ProgramConsumer programConsumer) { | 
|  | this.programConsumer = programConsumer; | 
|  | return this; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Add a resource provider for program resources. | 
|  | * | 
|  | * @param programResourceProvider A provider of program resources. | 
|  | */ | 
|  | public Builder addProgramResourceProvider(ProgramResourceProvider programResourceProvider) { | 
|  | this.programResourceProviders.add(programResourceProvider); | 
|  | return this; | 
|  | } | 
|  |  | 
|  | /** Build and return the {@link FeatureSplit} */ | 
|  | public FeatureSplit build() { | 
|  | return new FeatureSplit(programConsumer, programResourceProviders); | 
|  | } | 
|  | } | 
|  | } |