/*
 * Copyright (c) 2018, the Dart 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.
 *
 * This file has been automatically generated.  Please do not edit it manually.
 * To regenerate the file, use the script "pkg/analysis_server/tool/spec/generate_files".
 */
package org.dartlang.analysis.server.protocol;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.dart.server.utilities.general.JsonUtilities;
import com.google.dart.server.utilities.general.ObjectUtilities;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.commons.lang3.StringUtils;

/**
 * A declaration - top-level (class, field, etc) or a class member (method, field, etc).
 *
 * @coverage dart.server.generated.types
 */
@SuppressWarnings("unused")
public class ElementDeclaration {

  public static final ElementDeclaration[] EMPTY_ARRAY = new ElementDeclaration[0];

  public static final List<ElementDeclaration> EMPTY_LIST = Lists.newArrayList();

  /**
   * The name of the declaration.
   */
  private final String name;

  /**
   * The kind of the element that corresponds to the declaration.
   */
  private final String kind;

  /**
   * The index of the file (in the enclosing response).
   */
  private final int fileIndex;

  /**
   * The offset of the declaration name in the file.
   */
  private final int offset;

  /**
   * The one-based index of the line containing the declaration name.
   */
  private final int line;

  /**
   * The one-based index of the column containing the declaration name.
   */
  private final int column;

  /**
   * The offset of the first character of the declaration code in the file.
   */
  private final int codeOffset;

  /**
   * The length of the declaration code in the file.
   */
  private final int codeLength;

  /**
   * The name of the class enclosing this declaration. If the declaration is not a class member, this
   * field will be absent.
   */
  private final String className;

  /**
   * The name of the mixin enclosing this declaration. If the declaration is not a mixin member, this
   * field will be absent.
   */
  private final String mixinName;

  /**
   * The parameter list for the element. If the element is not a method or function this field will
   * not be defined. If the element doesn't have parameters (e.g. getter), this field will not be
   * defined. If the element has zero parameters, this field will have a value of "()". The value
   * should not be treated as exact presentation of parameters, it is just approximation of
   * parameters to give the user general idea.
   */
  private final String parameters;

  /**
   * Constructor for {@link ElementDeclaration}.
   */
  public ElementDeclaration(String name, String kind, int fileIndex, int offset, int line, int column, int codeOffset, int codeLength, String className, String mixinName, String parameters) {
    this.name = name;
    this.kind = kind;
    this.fileIndex = fileIndex;
    this.offset = offset;
    this.line = line;
    this.column = column;
    this.codeOffset = codeOffset;
    this.codeLength = codeLength;
    this.className = className;
    this.mixinName = mixinName;
    this.parameters = parameters;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj instanceof ElementDeclaration) {
      ElementDeclaration other = (ElementDeclaration) obj;
      return
        ObjectUtilities.equals(other.name, name) &&
        ObjectUtilities.equals(other.kind, kind) &&
        other.fileIndex == fileIndex &&
        other.offset == offset &&
        other.line == line &&
        other.column == column &&
        other.codeOffset == codeOffset &&
        other.codeLength == codeLength &&
        ObjectUtilities.equals(other.className, className) &&
        ObjectUtilities.equals(other.mixinName, mixinName) &&
        ObjectUtilities.equals(other.parameters, parameters);
    }
    return false;
  }

  public static ElementDeclaration fromJson(JsonObject jsonObject) {
    String name = jsonObject.get("name").getAsString();
    String kind = jsonObject.get("kind").getAsString();
    int fileIndex = jsonObject.get("fileIndex").getAsInt();
    int offset = jsonObject.get("offset").getAsInt();
    int line = jsonObject.get("line").getAsInt();
    int column = jsonObject.get("column").getAsInt();
    int codeOffset = jsonObject.get("codeOffset").getAsInt();
    int codeLength = jsonObject.get("codeLength").getAsInt();
    String className = jsonObject.get("className") == null ? null : jsonObject.get("className").getAsString();
    String mixinName = jsonObject.get("mixinName") == null ? null : jsonObject.get("mixinName").getAsString();
    String parameters = jsonObject.get("parameters") == null ? null : jsonObject.get("parameters").getAsString();
    return new ElementDeclaration(name, kind, fileIndex, offset, line, column, codeOffset, codeLength, className, mixinName, parameters);
  }

  public static List<ElementDeclaration> fromJsonArray(JsonArray jsonArray) {
    if (jsonArray == null) {
      return EMPTY_LIST;
    }
    ArrayList<ElementDeclaration> list = new ArrayList<ElementDeclaration>(jsonArray.size());
    Iterator<JsonElement> iterator = jsonArray.iterator();
    while (iterator.hasNext()) {
      list.add(fromJson(iterator.next().getAsJsonObject()));
    }
    return list;
  }

  /**
   * The name of the class enclosing this declaration. If the declaration is not a class member, this
   * field will be absent.
   */
  public String getClassName() {
    return className;
  }

  /**
   * The length of the declaration code in the file.
   */
  public int getCodeLength() {
    return codeLength;
  }

  /**
   * The offset of the first character of the declaration code in the file.
   */
  public int getCodeOffset() {
    return codeOffset;
  }

  /**
   * The one-based index of the column containing the declaration name.
   */
  public int getColumn() {
    return column;
  }

  /**
   * The index of the file (in the enclosing response).
   */
  public int getFileIndex() {
    return fileIndex;
  }

  /**
   * The kind of the element that corresponds to the declaration.
   */
  public String getKind() {
    return kind;
  }

  /**
   * The one-based index of the line containing the declaration name.
   */
  public int getLine() {
    return line;
  }

  /**
   * The name of the mixin enclosing this declaration. If the declaration is not a mixin member, this
   * field will be absent.
   */
  public String getMixinName() {
    return mixinName;
  }

  /**
   * The name of the declaration.
   */
  public String getName() {
    return name;
  }

  /**
   * The offset of the declaration name in the file.
   */
  public int getOffset() {
    return offset;
  }

  /**
   * The parameter list for the element. If the element is not a method or function this field will
   * not be defined. If the element doesn't have parameters (e.g. getter), this field will not be
   * defined. If the element has zero parameters, this field will have a value of "()". The value
   * should not be treated as exact presentation of parameters, it is just approximation of
   * parameters to give the user general idea.
   */
  public String getParameters() {
    return parameters;
  }

  @Override
  public int hashCode() {
    HashCodeBuilder builder = new HashCodeBuilder();
    builder.append(name);
    builder.append(kind);
    builder.append(fileIndex);
    builder.append(offset);
    builder.append(line);
    builder.append(column);
    builder.append(codeOffset);
    builder.append(codeLength);
    builder.append(className);
    builder.append(mixinName);
    builder.append(parameters);
    return builder.toHashCode();
  }

  public JsonObject toJson() {
    JsonObject jsonObject = new JsonObject();
    jsonObject.addProperty("name", name);
    jsonObject.addProperty("kind", kind);
    jsonObject.addProperty("fileIndex", fileIndex);
    jsonObject.addProperty("offset", offset);
    jsonObject.addProperty("line", line);
    jsonObject.addProperty("column", column);
    jsonObject.addProperty("codeOffset", codeOffset);
    jsonObject.addProperty("codeLength", codeLength);
    if (className != null) {
      jsonObject.addProperty("className", className);
    }
    if (mixinName != null) {
      jsonObject.addProperty("mixinName", mixinName);
    }
    if (parameters != null) {
      jsonObject.addProperty("parameters", parameters);
    }
    return jsonObject;
  }

  @Override
  public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("[");
    builder.append("name=");
    builder.append(name + ", ");
    builder.append("kind=");
    builder.append(kind + ", ");
    builder.append("fileIndex=");
    builder.append(fileIndex + ", ");
    builder.append("offset=");
    builder.append(offset + ", ");
    builder.append("line=");
    builder.append(line + ", ");
    builder.append("column=");
    builder.append(column + ", ");
    builder.append("codeOffset=");
    builder.append(codeOffset + ", ");
    builder.append("codeLength=");
    builder.append(codeLength + ", ");
    builder.append("className=");
    builder.append(className + ", ");
    builder.append("mixinName=");
    builder.append(mixinName + ", ");
    builder.append("parameters=");
    builder.append(parameters);
    builder.append("]");
    return builder.toString();
  }

}
