// 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.kotlin;

import static com.android.tools.r8.utils.FunctionUtils.forEachApply;

import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
import com.android.tools.r8.utils.Reporter;
import java.util.List;
import kotlinx.metadata.KmTypeAlias;
import kotlinx.metadata.KmTypeAliasVisitor;

// Holds information about KmTypeAlias
public class KotlinTypeAliasInfo implements EnqueuerMetadataTraceable {

  private final int flags;
  private final String name;
  private final KotlinTypeInfo underlyingType;
  private final KotlinTypeInfo expandedType;
  private final List<KotlinTypeParameterInfo> typeParameters;
  private final List<KotlinAnnotationInfo> annotations;
  private final KotlinVersionRequirementInfo versionRequirements;

  private KotlinTypeAliasInfo(
      int flags,
      String name,
      KotlinTypeInfo underlyingType,
      KotlinTypeInfo expandedType,
      List<KotlinTypeParameterInfo> typeParameters,
      List<KotlinAnnotationInfo> annotations,
      KotlinVersionRequirementInfo versionRequirements) {
    this.flags = flags;
    this.name = name;
    assert underlyingType != null;
    assert expandedType != null;
    this.underlyingType = underlyingType;
    this.expandedType = expandedType;
    this.typeParameters = typeParameters;
    this.annotations = annotations;
    this.versionRequirements = versionRequirements;
  }

  public static KotlinTypeAliasInfo create(
      KmTypeAlias alias, DexItemFactory factory, Reporter reporter) {
    return new KotlinTypeAliasInfo(
        alias.getFlags(),
        alias.getName(),
        KotlinTypeInfo.create(alias.underlyingType, factory, reporter),
        KotlinTypeInfo.create(alias.expandedType, factory, reporter),
        KotlinTypeParameterInfo.create(alias.getTypeParameters(), factory, reporter),
        KotlinAnnotationInfo.create(alias.getAnnotations(), factory),
        KotlinVersionRequirementInfo.create(alias.getVersionRequirements()));
  }

  boolean rewrite(
      KmVisitorProviders.KmTypeAliasVisitorProvider visitorProvider, AppView<?> appView) {
    KmTypeAliasVisitor kmTypeAliasVisitor = visitorProvider.get(flags, name);
    boolean rewritten = underlyingType.rewrite(kmTypeAliasVisitor::visitUnderlyingType, appView);
    rewritten |= expandedType.rewrite(kmTypeAliasVisitor::visitExpandedType, appView);
    for (KotlinTypeParameterInfo typeParameter : typeParameters) {
      rewritten |= typeParameter.rewrite(kmTypeAliasVisitor::visitTypeParameter, appView);
    }
    for (KotlinAnnotationInfo annotation : annotations) {
      rewritten |= annotation.rewrite(kmTypeAliasVisitor::visitAnnotation, appView);
    }
    rewritten |= versionRequirements.rewrite(kmTypeAliasVisitor::visitVersionRequirement);
    return rewritten;
  }

  @Override
  public void trace(DexDefinitionSupplier definitionSupplier) {
    underlyingType.trace(definitionSupplier);
    expandedType.trace(definitionSupplier);
    forEachApply(typeParameters, typeParam -> typeParam::trace, definitionSupplier);
    forEachApply(annotations, annotation -> annotation::trace, definitionSupplier);
  }
}
