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

import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.inspector.FieldInspector;
import com.android.tools.r8.inspector.ValueInspector;
import com.android.tools.r8.references.FieldReference;
import com.android.tools.r8.references.Reference;
import java.util.Optional;

public class FieldInspectorImpl implements FieldInspector {
  private final ClassInspectorImpl parent;
  private final DexEncodedField field;
  private FieldReference reference = null;

  public FieldInspectorImpl(ClassInspectorImpl parent, DexEncodedField field) {
    this.parent = parent;
    this.field = field;
  }

  @Override
  public FieldReference getFieldReference() {
    if (reference == null) {
      reference =
          Reference.field(
              parent.getClassReference(),
              field.getReference().name.toString(),
              Reference.typeFromDescriptor(field.getReference().type.toDescriptorString()));
    }
    return reference;
  }

  @Override
  public boolean isStatic() {
    return field.accessFlags.isStatic();
  }

  @Override
  public boolean isFinal() {
    return field.accessFlags.isFinal();
  }

  @Override
  public Optional<ValueInspector> getInitialValue() {
    if (field.isStatic() && field.getStaticValue() != null) {
      return Optional.of(new ValueInspectorImpl(field.getStaticValue(), field.getReference().type));
    }
    return Optional.empty();
  }
}
