blob: 65bdeec1f2ff4b31691751376e278c886b6f6300 [file] [log] [blame]
// 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.KmContractVisitor;
import kotlinx.metadata.KmEffectExpressionVisitor;
import kotlinx.metadata.KmEffectInvocationKind;
import kotlinx.metadata.KmEffectType;
import kotlinx.metadata.KmEffectVisitor;
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;
import kotlinx.metadata.KmVersionRequirementVisitor;
/**
* 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);
}
@FunctionalInterface
public interface KmFlexibleUpperBoundVisitorProvider {
KmTypeVisitor get(int flags, String typeFlexibilityId);
}
@FunctionalInterface
public interface KmVersionRequirementVisitorProvider {
KmVersionRequirementVisitor get();
}
@FunctionalInterface
public interface KmContractVisitorProvider {
KmContractVisitor get();
}
@FunctionalInterface
public interface KmEffectVisitorProvider {
KmEffectVisitor get(KmEffectType type, KmEffectInvocationKind effectInvocationKind);
}
@FunctionalInterface
public interface KmEffectExpressionVisitorProvider {
KmEffectExpressionVisitor get();
}
}