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

import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.tracereferences.TraceReferencesConsumer.TracedClass;
import com.android.tools.r8.tracereferences.TraceReferencesConsumer.TracedField;
import com.android.tools.r8.tracereferences.TraceReferencesConsumer.TracedMethod;
import com.android.tools.r8.utils.StringUtils;
import java.util.List;

class KeepRuleFormatter extends Formatter {
  final boolean allowObfuscation;

  KeepRuleFormatter(boolean allowObfuscation) {
    this.allowObfuscation = allowObfuscation;
  }

  @Override
  protected void printTypeHeader(TracedClass tracedClass) {
    if (tracedClass.isMissingDefinition()) {
      appendLine("# Missing class: " + tracedClass.getReference().getTypeName());
      return;
    }
    append(allowObfuscation ? "-keep,allowobfuscation" : "-keep");
    if (tracedClass.getAccessFlags().isInterface()) {
      appendLine(" interface " + tracedClass.getReference().getTypeName() + " {");
    } else if (tracedClass.getAccessFlags().isEnum()) {
      appendLine(" enum " + tracedClass.getReference().getTypeName() + " {");
    } else {
      appendLine(" class " + tracedClass.getReference().getTypeName() + " {");
    }
  }

  @Override
  protected void printConstructorName(MethodReference method) {
    append("<init>");
  }

  @Override
  protected void printField(TracedField field) {
    append(
        "  "
            + field.getReference().getFieldType().getTypeName()
            + " "
            + field.getReference().getFieldName()
            + ";"
            + System.lineSeparator());
  }

  @Override
  protected void printMethod(TracedMethod tracedMethod) {
    if (tracedMethod.getReference().getMethodName().equals("<clinit>")) {
      return;
    }
    append("  ");
    if (tracedMethod.getAccessFlags().isPublic()) {
      append("public ");
    } else if (tracedMethod.getAccessFlags().isPrivate()) {
      append("private ");
    } else if (tracedMethod.getAccessFlags().isProtected()) {
      append("protected ");
    }
    if (tracedMethod.getAccessFlags().isStatic()) {
      append("static ");
    }
    printNameAndReturn(tracedMethod.getReference());
    printArguments(tracedMethod.getReference());
    appendLine(";");
  }

  @Override
  protected void printPackageNames(List<String> packageNames) {
    if (!packageNames.isEmpty()) {
      append("-keeppackagenames " + StringUtils.join(",", packageNames) + System.lineSeparator());
    }
  }

  @Override
  protected void printTypeFooter() {
    appendLine("}");
  }
}
