// 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 com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.utils.ListUtils;
import java.util.List;
import java.util.function.Consumer;

public class GenerateMainDexListRunResult
    extends SingleTestRunResult<GenerateMainDexListRunResult> {

  final TestState state;
  List<String> mainDexList;

  public GenerateMainDexListRunResult(List<String> mainDexList, TestState state) {
    super(null, null, null);
    this.mainDexList = mainDexList;
    this.state = state;
  }

  public List<ClassReference> getMainDexList() {
    return ListUtils.map(
        mainDexList,
        entry -> {
          assert entry.endsWith(".class");
          String binaryName = entry.substring(0, entry.length() - ".class".length());
          return Reference.classFromBinaryName(binaryName);
        });
  }

  public GenerateMainDexListRunResult inspectDiagnosticMessages(
      Consumer<TestDiagnosticMessages> consumer) {
    consumer.accept(state.getDiagnosticsMessages());
    return self();
  }

  @Override
  protected GenerateMainDexListRunResult self() {
    return this;
  }
}
