public static JConstructorDeclaration createExternConstructorDeclaration(
      JConstructorType pConstructorType,
      String pName,
      String simpleName,
      VisibilityModifier pVisibility,
      boolean pStrictFp,
      JClassType pDeclaringClassType) {

    List<JType> parameterTypes = pConstructorType.getParameters();
    List<JParameterDeclaration> parameters = new ArrayList<>(parameterTypes.size());

    FileLocation externFileLoc = new FileLocation(0, "", 0, 0, 0);

    int i = 0;

    for (JType parameterType : parameterTypes) {
      parameters.add(
          new JParameterDeclaration(
              externFileLoc, parameterType, "parameter" + String.valueOf(i), false));
      i++;
    }

    return new JConstructorDeclaration(
        externFileLoc,
        pConstructorType,
        pName,
        simpleName,
        parameters,
        pVisibility,
        pStrictFp,
        pDeclaringClassType);
  }
/**
 * This class represents the Constructor declaration AST node type.
 *
 * <p>ConstructorDeclaration: [ Javadoc ] { ExtendedModifier } [ < TypeParameter { , TypeParameter }
 * > ] Identifier ( [ FormalParameter { , FormalParameter } ] ) [throws TypeName { , TypeName } ]
 * Block
 *
 * <p>The constructor declaration is a method declaration represented in {@link JMethodDeclaration},
 * who's return type is denoted as the class type it was declared in. Additionally, not all valid
 * method modifiers are valid for a constructor, e.g. abstract static, native, synchronized, final.
 */
public class JConstructorDeclaration extends JMethodDeclaration {

  private static final JConstructorDeclaration UNRESOLVED_CONSTRUCTOR =
      new JConstructorDeclaration(
          new FileLocation(0, "", 0, 0, 0),
          JConstructorType.createUnresolvableConstructorType(),
          "__UNRESOLVABLE__",
          "__UNRESOLVABLE__",
          new ArrayList<JParameterDeclaration>(),
          VisibilityModifier.NONE,
          false,
          JClassType.createUnresolvableType());

  public JConstructorDeclaration(
      FileLocation pFileLocation,
      JConstructorType pType,
      String pName,
      String simpleName,
      List<JParameterDeclaration> pParameterDeclarations,
      VisibilityModifier pVisibility,
      boolean pIsStrictfp,
      JClassType declaringClass) {
    super(
        pFileLocation,
        pType,
        pName,
        simpleName,
        pParameterDeclarations,
        pVisibility,
        false,
        false,
        false,
        false,
        false,
        pIsStrictfp,
        declaringClass);
  }

  @Override
  public JConstructorType getType() {
    return (JConstructorType) super.getType();
  }

  @Override
  public int hashCode() {
    int prime = 31;
    int result = 7;
    return prime * result + super.hashCode();
  }

  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }

    if (!(obj instanceof JConstructorDeclaration)) {
      return false;
    }

    return super.equals(obj);
  }

  public static JConstructorDeclaration createUnresolvedConstructorDeclaration() {
    return UNRESOLVED_CONSTRUCTOR;
  }

  public static JConstructorDeclaration createExternConstructorDeclaration(
      JConstructorType pConstructorType,
      String pName,
      String simpleName,
      VisibilityModifier pVisibility,
      boolean pStrictFp,
      JClassType pDeclaringClassType) {

    List<JType> parameterTypes = pConstructorType.getParameters();
    List<JParameterDeclaration> parameters = new ArrayList<>(parameterTypes.size());

    FileLocation externFileLoc = new FileLocation(0, "", 0, 0, 0);

    int i = 0;

    for (JType parameterType : parameterTypes) {
      parameters.add(
          new JParameterDeclaration(
              externFileLoc, parameterType, "parameter" + String.valueOf(i), false));
      i++;
    }

    return new JConstructorDeclaration(
        externFileLoc,
        pConstructorType,
        pName,
        simpleName,
        parameters,
        pVisibility,
        pStrictFp,
        pDeclaringClassType);
  }
}