// 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 kotlinx.metadata.KmAnnotation;
import kotlinx.metadata.KmFunctionVisitor;
import kotlinx.metadata.KmLambdaVisitor;
import kotlinx.metadata.KmPropertyVisitor;
import kotlinx.metadata.KmTypeAliasVisitor;
import kotlinx.metadata.KmTypeParameterVisitor;
import kotlinx.metadata.KmTypeVisitor;
import kotlinx.metadata.KmValueParameterVisitor;
import kotlinx.metadata.KmVariance;

/**
 * The reason for having these visitor providers is to make the separation of concern a bit easier
 * while also working with the kotlinx.metadata visitors as shown by the following example:
 *
 * <p>Say we have the following structure KotlinTypeInfo: { TypeProjects:
 * [KotlinTypeProjectionInfo(StarProjection)] }
 *
 * <p>Now the KmTypeVisitor (we use to generate the KotlinTypeInfo, has a visitProjection(int flags,
 * KmVariance variance) generator that will return a new KmTypeVisitor, however, if the projection
 * is a star projection, the generator visitStarProjection() should be used.
 *
 * <p>The information about the projection being a star projection is contained in the
 * KotlinTypeProjectionInfo. As a result, KotlinTypeInfo should query the object for picking the
 * right generator, the KotlinTypeProjectionInfo should return a KmTypeProjection object, or we
 * simply capture the generators lazily (by these providers), such that the object with all the
 * information can decide when/what object to create.
 *
 * <p>Another benefit of this approach than using the build in visitors is that shared structures,
 * such as KotlinAnnotationInfo that can be on type-aliases, functions and properties will not have
 * to take in three different type of visitors.
 */
public class KmVisitorProviders {

  @FunctionalInterface
  public interface KmAnnotationVisitorProvider {

    void get(KmAnnotation annotation);
  }

  @FunctionalInterface
  public interface KmFunctionVisitorProvider {

    KmFunctionVisitor get(int flags, String name);
  }

  public interface KmLambdaVisitorProvider {

    KmLambdaVisitor get();
  }

  @FunctionalInterface
  public interface KmPropertyVisitorProvider {

    KmPropertyVisitor get(int flags, String name, int getterFlags, int setterFlags);
  }

  @FunctionalInterface
  public interface KmTypeAliasVisitorProvider {

    KmTypeAliasVisitor get(int flags, String name);
  }

  @FunctionalInterface
  public interface KmTypeParameterVisitorProvider {

    KmTypeParameterVisitor get(int flags, String name, int id, KmVariance variance);
  }

  @FunctionalInterface
  public interface KmTypeProjectionVisitorProvider {

    KmTypeVisitor get(int flags, KmVariance variance);
  }

  @FunctionalInterface
  public interface KmTypeStarProjectionVisitorProvider {

    void get();
  }

  @FunctionalInterface
  public interface KmTypeVisitorProvider {

    KmTypeVisitor get(int flags);
  }

  @FunctionalInterface
  public interface KmValueParameterVisitorProvider {

    KmValueParameterVisitor get(int flags, String name);
  }
}
