// Copyright (c) 2016, 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.graph;

import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.dex.MixedSectionCollection;
import java.util.Arrays;
import java.util.List;

public class DexDebugInfo extends CachedHashValueDexItem {

  public final int startLine;
  public final DexString[] parameters;
  public final DexDebugEvent[] events;

  public DexDebugInfo(int startLine, DexString[] parameters, DexDebugEvent[] events) {
    assert startLine >= 0;
    this.startLine = startLine;
    this.parameters = parameters;
    this.events = events;
    // This call to hashCode is just an optimization to speedup equality when
    // canonicalizing DexDebugInfo objects inside a synchronize method.
    hashCode();
  }

  public List<DexDebugEntry> computeEntries() {
    DexDebugEntryBuilder builder = new DexDebugEntryBuilder(startLine);
    for (DexDebugEvent event : events) {
      event.addToBuilder(builder);
    }
    return builder.build();
  }

  public int computeHashCode() {
    return startLine
        + Arrays.hashCode(parameters) * 7
        + Arrays.hashCode(events) * 13;
  }

  public boolean computeEquals(Object other) {
    if (other instanceof DexDebugInfo) {
      DexDebugInfo o = (DexDebugInfo) other;
      if (startLine != o.startLine) {
        return false;
      }
      if (!Arrays.equals(parameters, o.parameters)) {
        return false;
      }
      return Arrays.equals(events, o.events);
    }
    return false;
  }

  @Override
  public void collectIndexedItems(IndexedItemCollection collection) {
    collectAll(collection, parameters);
    collectAll(collection, events);
  }

  @Override
  void collectMixedSectionItems(MixedSectionCollection collection) {
    collection.add(this);
  }

  public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("DebugInfo (line " + startLine + ") events: [\n");
    for (DexDebugEvent event : events) {
      builder.append("  ").append(event).append("\n");
    }
    builder.append("  END_SEQUENCE\n");
    builder.append("]\n");
    return builder.toString();
  }
}
