// 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.retrace.internal;

import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.FieldReference;
import com.android.tools.r8.references.Reference;
import java.util.Objects;

/** Internal encoding of a field that allows for having either basic info or full info. */
abstract class FieldDefinition implements Definition {

  static FieldDefinition create(ClassReference obfuscatedReference, String fieldName) {
    return new BaseFieldDefinition(obfuscatedReference, fieldName);
  }

  public static FieldDefinition create(FieldReference field) {
    return new FullFieldDefinition(field);
  }

  abstract FieldDefinition substituteHolder(ClassReference newHolder);

  static class BaseFieldDefinition extends FieldDefinition {
    private final ClassReference classReference;
    private final String name;

    private BaseFieldDefinition(ClassReference classReference, String name) {
      this.classReference = classReference;
      this.name = name;
    }

    @Override
    public String getName() {
      return name;
    }

    @Override
    public ClassReference getHolderClass() {
      return classReference;
    }

    @Override
    FieldDefinition substituteHolder(ClassReference newHolder) {
      return FieldDefinition.create(newHolder, name);
    }

    @Override
    public boolean equals(Object o) {
      if (this == o) {
        return true;
      }
      if (o == null || getClass() != o.getClass()) {
        return false;
      }
      BaseFieldDefinition that = (BaseFieldDefinition) o;
      return classReference.equals(that.classReference) && name.equals(that.name);
    }

    @Override
    public int hashCode() {
      return Objects.hash(classReference, name);
    }
  }

  static class FullFieldDefinition extends FieldDefinition {

    private final FieldReference fieldReference;

    private FullFieldDefinition(FieldReference fieldReference) {
      this.fieldReference = fieldReference;
    }

    @Override
    public String getName() {
      return fieldReference.getFieldName();
    }

    @Override
    public ClassReference getHolderClass() {
      return fieldReference.getHolderClass();
    }

    @Override
    FieldDefinition substituteHolder(ClassReference newHolder) {
      return create(
          Reference.field(newHolder, fieldReference.getFieldName(), fieldReference.getFieldType()));
    }

    @Override
    public boolean equals(Object o) {
      if (this == o) {
        return true;
      }
      if (o == null || getClass() != o.getClass()) {
        return false;
      }
      FullFieldDefinition that = (FullFieldDefinition) o;
      return fieldReference.equals(that.fieldReference);
    }

    @Override
    public int hashCode() {
      return fieldReference.hashCode();
    }
  }
}
