// Signature format: 2.0
package com.google.devtools.ksp {

  @com.google.devtools.ksp.KspExperimental public final class KSTypeNotPresentException extends java.lang.RuntimeException {
    ctor public KSTypeNotPresentException(@NonNull com.google.devtools.ksp.symbol.KSType ksType, @NonNull Throwable cause);
    method @NonNull public com.google.devtools.ksp.symbol.KSType getKsType();
    property @NonNull public final com.google.devtools.ksp.symbol.KSType ksType;
  }

  @com.google.devtools.ksp.KspExperimental public final class KSTypesNotPresentException extends java.lang.RuntimeException {
    ctor public KSTypesNotPresentException(@NonNull java.util.List<? extends com.google.devtools.ksp.symbol.KSType> ksTypes, @NonNull Throwable cause);
    method @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSType> getKsTypes();
    property @NonNull public final java.util.List<com.google.devtools.ksp.symbol.KSType> ksTypes;
  }

  @kotlin.RequiresOptIn(message="This API is experimental." + "It may be changed in the future without notice or might be removed.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface KspExperimental {
  }

  public final class UtilsKt {
    method @Nullable public static com.google.devtools.ksp.symbol.KSClassDeclaration closestClassDeclaration(@NonNull com.google.devtools.ksp.symbol.KSDeclaration);
    method @NonNull public static com.google.devtools.ksp.symbol.KSClassDeclaration findActualType(@NonNull com.google.devtools.ksp.symbol.KSTypeAlias);
    method @NonNull public static kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSType> getAllSuperTypes(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration);
    method @NonNull @com.google.devtools.ksp.KspExperimental public static <T extends java.lang.annotation.Annotation> kotlin.sequences.Sequence<T> getAnnotationsByType(@NonNull com.google.devtools.ksp.symbol.KSAnnotated, @NonNull kotlin.reflect.KClass<T> annotationKClass);
    method @Nullable public static inline <reified T> com.google.devtools.ksp.symbol.KSClassDeclaration getClassDeclarationByName(@NonNull com.google.devtools.ksp.processing.Resolver);
    method @Nullable public static com.google.devtools.ksp.symbol.KSClassDeclaration getClassDeclarationByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull String name);
    method @NonNull public static kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSFunctionDeclaration> getConstructors(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration);
    method @Nullable public static com.google.devtools.ksp.symbol.KSFile getContainingFile(@NonNull com.google.devtools.ksp.symbol.KSNode);
    method @NonNull public static kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSFunctionDeclaration> getDeclaredFunctions(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration);
    method @NonNull public static kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSPropertyDeclaration> getDeclaredProperties(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration);
    method @NonNull public static kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSFunctionDeclaration> getFunctionDeclarationsByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull String name, boolean includeTopLevel = false);
    method @NonNull public static java.util.List<com.google.devtools.ksp.symbol.KSTypeArgument> getInnerArguments(@NonNull com.google.devtools.ksp.symbol.KSType);
    method @Nullable @com.google.devtools.ksp.KspExperimental public static com.google.devtools.ksp.symbol.KSClassDeclaration getJavaClassByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull com.google.devtools.ksp.symbol.KSName name);
    method @Nullable @com.google.devtools.ksp.KspExperimental public static com.google.devtools.ksp.symbol.KSClassDeclaration getJavaClassByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull String name);
    method @Nullable @com.google.devtools.ksp.KspExperimental public static com.google.devtools.ksp.symbol.KSClassDeclaration getKotlinClassByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull com.google.devtools.ksp.symbol.KSName name);
    method @Nullable @com.google.devtools.ksp.KspExperimental public static com.google.devtools.ksp.symbol.KSClassDeclaration getKotlinClassByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull String name);
    method @Nullable public static com.google.devtools.ksp.symbol.KSType getOuterType(@NonNull com.google.devtools.ksp.symbol.KSType);
    method @Nullable public static com.google.devtools.ksp.symbol.KSPropertyDeclaration getPropertyDeclarationByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull String name, boolean includeTopLevel = false);
    method @NonNull public static com.google.devtools.ksp.symbol.Visibility getVisibility(@NonNull com.google.devtools.ksp.symbol.KSDeclaration);
    method public static boolean isAbstract(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration);
    method public static boolean isAbstract(@NonNull com.google.devtools.ksp.symbol.KSPropertyDeclaration);
    method @com.google.devtools.ksp.KspExperimental public static <T extends java.lang.annotation.Annotation> boolean isAnnotationPresent(@NonNull com.google.devtools.ksp.symbol.KSAnnotated, @NonNull kotlin.reflect.KClass<T> annotationKClass);
    method public static boolean isConstructor(@NonNull com.google.devtools.ksp.symbol.KSFunctionDeclaration);
    method public static boolean isDefault(@NonNull com.google.devtools.ksp.symbol.KSValueArgument);
    method public static boolean isInternal(@NonNull com.google.devtools.ksp.symbol.KSDeclaration);
    method public static boolean isJavaPackagePrivate(@NonNull com.google.devtools.ksp.symbol.KSDeclaration);
    method public static boolean isLocal(@NonNull com.google.devtools.ksp.symbol.KSDeclaration);
    method public static boolean isOpen(@NonNull com.google.devtools.ksp.symbol.KSDeclaration);
    method public static boolean isPrivate(@NonNull com.google.devtools.ksp.symbol.KSDeclaration);
    method public static boolean isProtected(@NonNull com.google.devtools.ksp.symbol.KSDeclaration);
    method public static boolean isPublic(@NonNull com.google.devtools.ksp.symbol.KSDeclaration);
    method public static boolean isVisibleFrom(@NonNull com.google.devtools.ksp.symbol.KSDeclaration, @NonNull com.google.devtools.ksp.symbol.KSDeclaration other);
    method public static boolean validate(@NonNull com.google.devtools.ksp.symbol.KSNode, @NonNull kotlin.jvm.functions.Function2<? super com.google.devtools.ksp.symbol.KSNode,? super com.google.devtools.ksp.symbol.KSNode,java.lang.Boolean> predicate = { _, _ -> return true });
    field @NonNull public static final String ExceptionMessage = "please file a bug at https://github.com/google/ksp/issues/new";
  }

}

package com.google.devtools.ksp.processing {

  public interface CodeGenerator {
    method public void associate(@NonNull java.util.List<? extends com.google.devtools.ksp.symbol.KSFile> sources, @NonNull String packageName, @NonNull String fileName, @NonNull String extensionName = "kt");
    method public void associateByPath(@NonNull java.util.List<? extends com.google.devtools.ksp.symbol.KSFile> sources, @NonNull String path, @NonNull String extensionName = "kt");
    method public void associateWithClasses(@NonNull java.util.List<? extends com.google.devtools.ksp.symbol.KSClassDeclaration> classes, @NonNull String packageName, @NonNull String fileName, @NonNull String extensionName = "kt");
    method public default void associateWithFunctions(@NonNull java.util.List<? extends com.google.devtools.ksp.symbol.KSFunctionDeclaration> functions, @NonNull String packageName, @NonNull String fileName, @NonNull String extensionName = "kt");
    method public default void associateWithProperties(@NonNull java.util.List<? extends com.google.devtools.ksp.symbol.KSPropertyDeclaration> properties, @NonNull String packageName, @NonNull String fileName, @NonNull String extensionName = "kt");
    method @NonNull public java.io.OutputStream createNewFile(@NonNull com.google.devtools.ksp.processing.Dependencies dependencies, @NonNull String packageName, @NonNull String fileName, @NonNull String extensionName = "kt");
    method @NonNull public java.io.OutputStream createNewFileByPath(@NonNull com.google.devtools.ksp.processing.Dependencies dependencies, @NonNull String path, @NonNull String extensionName = "kt");
    method @NonNull public java.util.Collection<java.io.File> getGeneratedFile();
    property @NonNull public abstract java.util.Collection<java.io.File> generatedFile;
  }

  public final class Dependencies {
    ctor public Dependencies(boolean aggregating, @NonNull com.google.devtools.ksp.symbol.KSFile... sources);
    method public boolean getAggregating();
    method @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSFile> getOriginatingFiles();
    method public boolean isAllSources();
    property public final boolean aggregating;
    property public final boolean isAllSources;
    property @NonNull public final java.util.List<com.google.devtools.ksp.symbol.KSFile> originatingFiles;
    field @NonNull public static final com.google.devtools.ksp.processing.Dependencies.Companion Companion;
  }

  public static final class Dependencies.Companion {
    method @NonNull public com.google.devtools.ksp.processing.Dependencies getALL_FILES();
    property @NonNull public final com.google.devtools.ksp.processing.Dependencies ALL_FILES;
  }

  public enum ExitCode {
    method @NonNull public static com.google.devtools.ksp.processing.ExitCode valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method @NonNull public static com.google.devtools.ksp.processing.ExitCode[] values();
    enum_constant public static final com.google.devtools.ksp.processing.ExitCode OK;
    enum_constant public static final com.google.devtools.ksp.processing.ExitCode PROCESSING_ERROR;
  }

  public interface JsPlatformInfo extends com.google.devtools.ksp.processing.PlatformInfo {
  }

  public interface JvmPlatformInfo extends com.google.devtools.ksp.processing.PlatformInfo {
    method @NonNull public String getJvmDefaultMode();
    method @NonNull public String getJvmTarget();
    property @NonNull public abstract String jvmDefaultMode;
    property @NonNull public abstract String jvmTarget;
  }

  public interface KSBuiltIns {
    method @NonNull public com.google.devtools.ksp.symbol.KSType getAnnotationType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getAnyType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getArrayType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getBooleanType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getByteType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getCharType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getDoubleType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getFloatType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getIntType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getIterableType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getLongType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getNothingType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getNumberType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getShortType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getStringType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType getUnitType();
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType annotationType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType anyType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType arrayType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType booleanType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType byteType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType charType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType doubleType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType floatType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType intType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType iterableType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType longType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType nothingType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType numberType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType shortType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType stringType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSType unitType;
  }

  public interface KSPLogger {
    method public void error(@NonNull String message, @Nullable com.google.devtools.ksp.symbol.KSNode symbol = null);
    method public void exception(@NonNull Throwable e);
    method public void info(@NonNull String message, @Nullable com.google.devtools.ksp.symbol.KSNode symbol = null);
    method public void logging(@NonNull String message, @Nullable com.google.devtools.ksp.symbol.KSNode symbol = null);
    method public void warn(@NonNull String message, @Nullable com.google.devtools.ksp.symbol.KSNode symbol = null);
  }

  public interface NativePlatformInfo extends com.google.devtools.ksp.processing.PlatformInfo {
    method @NonNull public String getTargetName();
    property @NonNull public abstract String targetName;
  }

  public interface PlatformInfo {
    method @NonNull public String getPlatformName();
    property @NonNull public abstract String platformName;
  }

  public interface Resolver {
    method @NonNull public com.google.devtools.ksp.symbol.KSTypeReference createKSTypeReferenceFromKSType(@NonNull com.google.devtools.ksp.symbol.KSType type);
    method @NonNull @com.google.devtools.ksp.KspExperimental public java.util.Set<com.google.devtools.ksp.symbol.Modifier> effectiveJavaModifiers(@NonNull com.google.devtools.ksp.symbol.KSDeclaration declaration);
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSFile> getAllFiles();
    method @NonNull public com.google.devtools.ksp.processing.KSBuiltIns getBuiltIns();
    method @Nullable public com.google.devtools.ksp.symbol.KSClassDeclaration getClassDeclarationByName(@NonNull com.google.devtools.ksp.symbol.KSName name);
    method @NonNull @com.google.devtools.ksp.KspExperimental public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSDeclaration> getDeclarationsFromPackage(@NonNull String packageName);
    method @NonNull @com.google.devtools.ksp.KspExperimental public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSDeclaration> getDeclarationsInSourceOrder(@NonNull com.google.devtools.ksp.symbol.KSDeclarationContainer container);
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSFunctionDeclaration> getFunctionDeclarationsByName(@NonNull com.google.devtools.ksp.symbol.KSName name, boolean includeTopLevel = false);
    method @NonNull @com.google.devtools.ksp.KspExperimental public com.google.devtools.ksp.symbol.KSTypeReference getJavaWildcard(@NonNull com.google.devtools.ksp.symbol.KSTypeReference reference);
    method @NonNull @com.google.devtools.ksp.KspExperimental public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSType> getJvmCheckedException(@NonNull com.google.devtools.ksp.symbol.KSFunctionDeclaration function);
    method @NonNull @com.google.devtools.ksp.KspExperimental public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSType> getJvmCheckedException(@NonNull com.google.devtools.ksp.symbol.KSPropertyAccessor accessor);
    method @Nullable @com.google.devtools.ksp.KspExperimental public String getJvmName(@NonNull com.google.devtools.ksp.symbol.KSFunctionDeclaration declaration);
    method @Nullable @com.google.devtools.ksp.KspExperimental public String getJvmName(@NonNull com.google.devtools.ksp.symbol.KSPropertyAccessor accessor);
    method @NonNull public com.google.devtools.ksp.symbol.KSName getKSNameFromString(@NonNull String name);
    method @NonNull @com.google.devtools.ksp.KspExperimental public com.google.devtools.ksp.symbol.KSName getModuleName();
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSFile> getNewFiles();
    method @Nullable @com.google.devtools.ksp.KspExperimental public String getOwnerJvmClassName(@NonNull com.google.devtools.ksp.symbol.KSFunctionDeclaration declaration);
    method @Nullable @com.google.devtools.ksp.KspExperimental public String getOwnerJvmClassName(@NonNull com.google.devtools.ksp.symbol.KSPropertyDeclaration declaration);
    method @NonNull @com.google.devtools.ksp.KspExperimental public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSAnnotation> getPackageAnnotations(@NonNull String packageName);
    method @NonNull @com.google.devtools.ksp.KspExperimental public kotlin.sequences.Sequence<java.lang.String> getPackagesWithAnnotation(@NonNull String annotationName);
    method @Nullable public com.google.devtools.ksp.symbol.KSPropertyDeclaration getPropertyDeclarationByName(@NonNull com.google.devtools.ksp.symbol.KSName name, boolean includeTopLevel = false);
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSAnnotated> getSymbolsWithAnnotation(@NonNull String annotationName, boolean inDepth = false);
    method @NonNull public com.google.devtools.ksp.symbol.KSTypeArgument getTypeArgument(@NonNull com.google.devtools.ksp.symbol.KSTypeReference typeRef, @NonNull com.google.devtools.ksp.symbol.Variance variance);
    method @com.google.devtools.ksp.KspExperimental public boolean isJavaRawType(@NonNull com.google.devtools.ksp.symbol.KSType type);
    method @Nullable @com.google.devtools.ksp.KspExperimental public com.google.devtools.ksp.symbol.KSName mapJavaNameToKotlin(@NonNull com.google.devtools.ksp.symbol.KSName javaName);
    method @Nullable @com.google.devtools.ksp.KspExperimental public com.google.devtools.ksp.symbol.KSName mapKotlinNameToJava(@NonNull com.google.devtools.ksp.symbol.KSName kotlinName);
    method @Nullable @com.google.devtools.ksp.KspExperimental public String mapToJvmSignature(@NonNull com.google.devtools.ksp.symbol.KSDeclaration declaration);
    method public boolean overrides(@NonNull com.google.devtools.ksp.symbol.KSDeclaration overrider, @NonNull com.google.devtools.ksp.symbol.KSDeclaration overridee);
    method public boolean overrides(@NonNull com.google.devtools.ksp.symbol.KSDeclaration overrider, @NonNull com.google.devtools.ksp.symbol.KSDeclaration overridee, @NonNull com.google.devtools.ksp.symbol.KSClassDeclaration containingClass);
    property @NonNull public abstract com.google.devtools.ksp.processing.KSBuiltIns builtIns;
  }

  public interface SymbolProcessor {
    method public default void finish();
    method public default void onError();
    method @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSAnnotated> process(@NonNull com.google.devtools.ksp.processing.Resolver resolver);
  }

  public final class SymbolProcessorEnvironment {
    ctor public SymbolProcessorEnvironment(@NonNull java.util.Map<java.lang.String,java.lang.String> options, @NonNull kotlin.KotlinVersion kotlinVersion, @NonNull com.google.devtools.ksp.processing.CodeGenerator codeGenerator, @NonNull com.google.devtools.ksp.processing.KSPLogger logger);
    ctor public SymbolProcessorEnvironment(@NonNull java.util.Map<java.lang.String,java.lang.String> options, @NonNull kotlin.KotlinVersion kotlinVersion, @NonNull com.google.devtools.ksp.processing.CodeGenerator codeGenerator, @NonNull com.google.devtools.ksp.processing.KSPLogger logger, @NonNull kotlin.KotlinVersion apiVersion, @NonNull kotlin.KotlinVersion compilerVersion, @NonNull java.util.List<? extends com.google.devtools.ksp.processing.PlatformInfo> platforms);
    ctor public SymbolProcessorEnvironment(@NonNull java.util.Map<java.lang.String,java.lang.String> options, @NonNull kotlin.KotlinVersion kotlinVersion, @NonNull com.google.devtools.ksp.processing.CodeGenerator codeGenerator, @NonNull com.google.devtools.ksp.processing.KSPLogger logger, @NonNull kotlin.KotlinVersion apiVersion, @NonNull kotlin.KotlinVersion compilerVersion, @NonNull java.util.List<? extends com.google.devtools.ksp.processing.PlatformInfo> platforms, @NonNull kotlin.KotlinVersion kspVersion);
    method @NonNull public kotlin.KotlinVersion getApiVersion();
    method @NonNull public com.google.devtools.ksp.processing.CodeGenerator getCodeGenerator();
    method @NonNull public kotlin.KotlinVersion getCompilerVersion();
    method @NonNull public kotlin.KotlinVersion getKotlinVersion();
    method @NonNull public kotlin.KotlinVersion getKspVersion();
    method @NonNull public com.google.devtools.ksp.processing.KSPLogger getLogger();
    method @NonNull public java.util.Map<java.lang.String,java.lang.String> getOptions();
    method @NonNull public java.util.List<com.google.devtools.ksp.processing.PlatformInfo> getPlatforms();
    property @NonNull public final kotlin.KotlinVersion apiVersion;
    property @NonNull public final com.google.devtools.ksp.processing.CodeGenerator codeGenerator;
    property @NonNull public final kotlin.KotlinVersion compilerVersion;
    property @NonNull public final kotlin.KotlinVersion kotlinVersion;
    property @NonNull public final kotlin.KotlinVersion kspVersion;
    property @NonNull public final com.google.devtools.ksp.processing.KSPLogger logger;
    property @NonNull public final java.util.Map<java.lang.String,java.lang.String> options;
    property @NonNull public final java.util.List<com.google.devtools.ksp.processing.PlatformInfo> platforms;
  }

  public fun interface SymbolProcessorProvider {
    method @NonNull public com.google.devtools.ksp.processing.SymbolProcessor create(@NonNull com.google.devtools.ksp.processing.SymbolProcessorEnvironment environment);
  }

  public interface UnknownPlatformInfo extends com.google.devtools.ksp.processing.PlatformInfo {
  }

}

package com.google.devtools.ksp.symbol {

  public enum AnnotationUseSiteTarget {
    method @NonNull public static com.google.devtools.ksp.symbol.AnnotationUseSiteTarget valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method @NonNull public static com.google.devtools.ksp.symbol.AnnotationUseSiteTarget[] values();
    enum_constant public static final com.google.devtools.ksp.symbol.AnnotationUseSiteTarget DELEGATE;
    enum_constant public static final com.google.devtools.ksp.symbol.AnnotationUseSiteTarget FIELD;
    enum_constant public static final com.google.devtools.ksp.symbol.AnnotationUseSiteTarget FILE;
    enum_constant public static final com.google.devtools.ksp.symbol.AnnotationUseSiteTarget GET;
    enum_constant public static final com.google.devtools.ksp.symbol.AnnotationUseSiteTarget PARAM;
    enum_constant public static final com.google.devtools.ksp.symbol.AnnotationUseSiteTarget PROPERTY;
    enum_constant public static final com.google.devtools.ksp.symbol.AnnotationUseSiteTarget RECEIVER;
    enum_constant public static final com.google.devtools.ksp.symbol.AnnotationUseSiteTarget SET;
    enum_constant public static final com.google.devtools.ksp.symbol.AnnotationUseSiteTarget SETPARAM;
  }

  public enum ClassKind {
    method public final String getType();
    method @NonNull public static com.google.devtools.ksp.symbol.ClassKind valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method @NonNull public static com.google.devtools.ksp.symbol.ClassKind[] values();
    property public final String type;
    enum_constant public static final com.google.devtools.ksp.symbol.ClassKind ANNOTATION_CLASS;
    enum_constant public static final com.google.devtools.ksp.symbol.ClassKind CLASS;
    enum_constant public static final com.google.devtools.ksp.symbol.ClassKind ENUM_CLASS;
    enum_constant public static final com.google.devtools.ksp.symbol.ClassKind ENUM_ENTRY;
    enum_constant public static final com.google.devtools.ksp.symbol.ClassKind INTERFACE;
    enum_constant public static final com.google.devtools.ksp.symbol.ClassKind OBJECT;
  }

  public final class FileLocation extends com.google.devtools.ksp.symbol.Location {
    ctor public FileLocation(@NonNull String filePath, int lineNumber);
    method @NonNull public String component1();
    method public int component2();
    method @NonNull public com.google.devtools.ksp.symbol.FileLocation copy(@NonNull String filePath, int lineNumber);
    method @NonNull public String getFilePath();
    method public int getLineNumber();
    property @NonNull public final String filePath;
    property public final int lineNumber;
  }

  public enum FunctionKind {
    method @NonNull public static com.google.devtools.ksp.symbol.FunctionKind valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method @NonNull public static com.google.devtools.ksp.symbol.FunctionKind[] values();
    enum_constant public static final com.google.devtools.ksp.symbol.FunctionKind ANONYMOUS;
    enum_constant public static final com.google.devtools.ksp.symbol.FunctionKind LAMBDA;
    enum_constant public static final com.google.devtools.ksp.symbol.FunctionKind MEMBER;
    enum_constant public static final com.google.devtools.ksp.symbol.FunctionKind STATIC;
    enum_constant public static final com.google.devtools.ksp.symbol.FunctionKind TOP_LEVEL;
  }

  public interface KSAnnotated extends com.google.devtools.ksp.symbol.KSNode {
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSAnnotation> getAnnotations();
    property @NonNull public abstract kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSAnnotation> annotations;
  }

  public interface KSAnnotation extends com.google.devtools.ksp.symbol.KSNode {
    method @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getAnnotationType();
    method @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSValueArgument> getArguments();
    method @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSValueArgument> getDefaultArguments();
    method @NonNull public com.google.devtools.ksp.symbol.KSName getShortName();
    method @Nullable public com.google.devtools.ksp.symbol.AnnotationUseSiteTarget getUseSiteTarget();
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSTypeReference annotationType;
    property @NonNull public abstract java.util.List<com.google.devtools.ksp.symbol.KSValueArgument> arguments;
    property @NonNull public abstract java.util.List<com.google.devtools.ksp.symbol.KSValueArgument> defaultArguments;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSName shortName;
    property @Nullable public abstract com.google.devtools.ksp.symbol.AnnotationUseSiteTarget useSiteTarget;
  }

  public interface KSCallableReference extends com.google.devtools.ksp.symbol.KSReferenceElement {
    method public default <D, R> R accept(@NonNull com.google.devtools.ksp.symbol.KSVisitor<D,R> visitor, D data);
    method @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSValueParameter> getFunctionParameters();
    method @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getReceiverType();
    method @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getReturnType();
    property @NonNull public abstract java.util.List<com.google.devtools.ksp.symbol.KSValueParameter> functionParameters;
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSTypeReference receiverType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSTypeReference returnType;
  }

  public interface KSClassDeclaration extends com.google.devtools.ksp.symbol.KSDeclaration com.google.devtools.ksp.symbol.KSDeclarationContainer {
    method @NonNull public com.google.devtools.ksp.symbol.KSType asStarProjectedType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType asType(@NonNull java.util.List<? extends com.google.devtools.ksp.symbol.KSTypeArgument> typeArguments);
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSFunctionDeclaration> getAllFunctions();
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSPropertyDeclaration> getAllProperties();
    method @NonNull public com.google.devtools.ksp.symbol.ClassKind getClassKind();
    method @Nullable public com.google.devtools.ksp.symbol.KSFunctionDeclaration getPrimaryConstructor();
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSClassDeclaration> getSealedSubclasses();
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSTypeReference> getSuperTypes();
    method public boolean isCompanionObject();
    property @NonNull public abstract com.google.devtools.ksp.symbol.ClassKind classKind;
    property public abstract boolean isCompanionObject;
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSFunctionDeclaration primaryConstructor;
    property @NonNull public abstract kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSTypeReference> superTypes;
  }

  public interface KSClassifierReference extends com.google.devtools.ksp.symbol.KSReferenceElement {
    method public default <D, R> R accept(@NonNull com.google.devtools.ksp.symbol.KSVisitor<D,R> visitor, D data);
    method @Nullable public com.google.devtools.ksp.symbol.KSClassifierReference getQualifier();
    method @NonNull public String referencedName();
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSClassifierReference qualifier;
  }

  public interface KSDeclaration extends com.google.devtools.ksp.symbol.KSModifierListOwner com.google.devtools.ksp.symbol.KSAnnotated com.google.devtools.ksp.symbol.KSExpectActual {
    method @Nullable public com.google.devtools.ksp.symbol.KSFile getContainingFile();
    method @Nullable public String getDocString();
    method @NonNull public com.google.devtools.ksp.symbol.KSName getPackageName();
    method @Nullable public com.google.devtools.ksp.symbol.KSDeclaration getParentDeclaration();
    method @Nullable public com.google.devtools.ksp.symbol.KSName getQualifiedName();
    method @NonNull public com.google.devtools.ksp.symbol.KSName getSimpleName();
    method @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSTypeParameter> getTypeParameters();
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSFile containingFile;
    property @Nullable public abstract String docString;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSName packageName;
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSDeclaration parentDeclaration;
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSName qualifiedName;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSName simpleName;
    property @NonNull public abstract java.util.List<com.google.devtools.ksp.symbol.KSTypeParameter> typeParameters;
  }

  public interface KSDeclarationContainer extends com.google.devtools.ksp.symbol.KSNode {
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSDeclaration> getDeclarations();
    property @NonNull public abstract kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSDeclaration> declarations;
  }

  public interface KSDefNonNullReference extends com.google.devtools.ksp.symbol.KSReferenceElement {
    method public default <D, R> R accept(@NonNull com.google.devtools.ksp.symbol.KSVisitor<D,R> visitor, D data);
    method @NonNull public com.google.devtools.ksp.symbol.KSClassifierReference getEnclosedType();
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSClassifierReference enclosedType;
  }

  public interface KSDynamicReference extends com.google.devtools.ksp.symbol.KSReferenceElement {
  }

  public interface KSExpectActual {
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSDeclaration> findActuals();
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSDeclaration> findExpects();
    method public boolean isActual();
    method public boolean isExpect();
    property public abstract boolean isActual;
    property public abstract boolean isExpect;
  }

  public interface KSFile extends com.google.devtools.ksp.symbol.KSDeclarationContainer com.google.devtools.ksp.symbol.KSAnnotated {
    method @NonNull public String getFileName();
    method @NonNull public String getFilePath();
    method @NonNull public com.google.devtools.ksp.symbol.KSName getPackageName();
    property @NonNull public abstract String fileName;
    property @NonNull public abstract String filePath;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSName packageName;
  }

  public interface KSFunction {
    method @Nullable public com.google.devtools.ksp.symbol.KSType getExtensionReceiverType();
    method @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSType> getParameterTypes();
    method @Nullable public com.google.devtools.ksp.symbol.KSType getReturnType();
    method @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSTypeParameter> getTypeParameters();
    method public boolean isError();
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSType extensionReceiverType;
    property public abstract boolean isError;
    property @NonNull public abstract java.util.List<com.google.devtools.ksp.symbol.KSType> parameterTypes;
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSType returnType;
    property @NonNull public abstract java.util.List<com.google.devtools.ksp.symbol.KSTypeParameter> typeParameters;
  }

  public interface KSFunctionDeclaration extends com.google.devtools.ksp.symbol.KSDeclaration com.google.devtools.ksp.symbol.KSDeclarationContainer {
    method @NonNull public com.google.devtools.ksp.symbol.KSFunction asMemberOf(@NonNull com.google.devtools.ksp.symbol.KSType containing);
    method @Nullable public com.google.devtools.ksp.symbol.KSDeclaration findOverridee();
    method @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getExtensionReceiver();
    method @NonNull public com.google.devtools.ksp.symbol.FunctionKind getFunctionKind();
    method @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSValueParameter> getParameters();
    method @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getReturnType();
    method public boolean isAbstract();
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSTypeReference extensionReceiver;
    property @NonNull public abstract com.google.devtools.ksp.symbol.FunctionKind functionKind;
    property public abstract boolean isAbstract;
    property @NonNull public abstract java.util.List<com.google.devtools.ksp.symbol.KSValueParameter> parameters;
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSTypeReference returnType;
  }

  public interface KSModifierListOwner extends com.google.devtools.ksp.symbol.KSNode {
    method @NonNull public java.util.Set<com.google.devtools.ksp.symbol.Modifier> getModifiers();
    property @NonNull public abstract java.util.Set<com.google.devtools.ksp.symbol.Modifier> modifiers;
  }

  public interface KSName {
    method @NonNull public String asString();
    method @NonNull public String getQualifier();
    method @NonNull public String getShortName();
  }

  public interface KSNode {
    method public <D, R> R accept(@NonNull com.google.devtools.ksp.symbol.KSVisitor<D,R> visitor, D data);
    method @NonNull public com.google.devtools.ksp.symbol.Location getLocation();
    method @NonNull public com.google.devtools.ksp.symbol.Origin getOrigin();
    method @Nullable public com.google.devtools.ksp.symbol.KSNode getParent();
    property @NonNull public abstract com.google.devtools.ksp.symbol.Location location;
    property @NonNull public abstract com.google.devtools.ksp.symbol.Origin origin;
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSNode parent;
  }

  public interface KSParenthesizedReference extends com.google.devtools.ksp.symbol.KSReferenceElement {
    method @NonNull public com.google.devtools.ksp.symbol.KSReferenceElement getElement();
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSReferenceElement element;
  }

  public interface KSPropertyAccessor extends com.google.devtools.ksp.symbol.KSDeclarationContainer com.google.devtools.ksp.symbol.KSAnnotated com.google.devtools.ksp.symbol.KSModifierListOwner {
    method @NonNull public com.google.devtools.ksp.symbol.KSPropertyDeclaration getReceiver();
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSPropertyDeclaration receiver;
  }

  public interface KSPropertyDeclaration extends com.google.devtools.ksp.symbol.KSDeclaration {
    method @NonNull public com.google.devtools.ksp.symbol.KSType asMemberOf(@NonNull com.google.devtools.ksp.symbol.KSType containing);
    method @Nullable public com.google.devtools.ksp.symbol.KSPropertyDeclaration findOverridee();
    method @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getExtensionReceiver();
    method @Nullable public com.google.devtools.ksp.symbol.KSPropertyGetter getGetter();
    method public boolean getHasBackingField();
    method @Nullable public com.google.devtools.ksp.symbol.KSPropertySetter getSetter();
    method @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getType();
    method public boolean isDelegated();
    method public boolean isMutable();
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSTypeReference extensionReceiver;
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSPropertyGetter getter;
    property public abstract boolean hasBackingField;
    property public abstract boolean isMutable;
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSPropertySetter setter;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSTypeReference type;
  }

  public interface KSPropertyGetter extends com.google.devtools.ksp.symbol.KSPropertyAccessor {
    method @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getReturnType();
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSTypeReference returnType;
  }

  public interface KSPropertySetter extends com.google.devtools.ksp.symbol.KSPropertyAccessor {
    method @NonNull public com.google.devtools.ksp.symbol.KSValueParameter getParameter();
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSValueParameter parameter;
  }

  public interface KSReferenceElement extends com.google.devtools.ksp.symbol.KSNode {
    method @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSTypeArgument> getTypeArguments();
    property @NonNull public abstract java.util.List<com.google.devtools.ksp.symbol.KSTypeArgument> typeArguments;
  }

  public interface KSType {
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSAnnotation> getAnnotations();
    method @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSTypeArgument> getArguments();
    method @NonNull public com.google.devtools.ksp.symbol.KSDeclaration getDeclaration();
    method @NonNull public com.google.devtools.ksp.symbol.Nullability getNullability();
    method public boolean isAssignableFrom(@NonNull com.google.devtools.ksp.symbol.KSType that);
    method public boolean isCovarianceFlexible();
    method public boolean isError();
    method public boolean isFunctionType();
    method public boolean isMarkedNullable();
    method public boolean isMutabilityFlexible();
    method public boolean isSuspendFunctionType();
    method @NonNull public com.google.devtools.ksp.symbol.KSType makeNotNullable();
    method @NonNull public com.google.devtools.ksp.symbol.KSType makeNullable();
    method @NonNull public com.google.devtools.ksp.symbol.KSType replace(@NonNull java.util.List<? extends com.google.devtools.ksp.symbol.KSTypeArgument> arguments);
    method @NonNull public com.google.devtools.ksp.symbol.KSType starProjection();
    property @NonNull public abstract kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSAnnotation> annotations;
    property @NonNull public abstract java.util.List<com.google.devtools.ksp.symbol.KSTypeArgument> arguments;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSDeclaration declaration;
    property public abstract boolean isError;
    property public abstract boolean isFunctionType;
    property public abstract boolean isMarkedNullable;
    property public abstract boolean isSuspendFunctionType;
    property @NonNull public abstract com.google.devtools.ksp.symbol.Nullability nullability;
  }

  public interface KSTypeAlias extends com.google.devtools.ksp.symbol.KSDeclaration {
    method @NonNull public com.google.devtools.ksp.symbol.KSName getName();
    method @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getType();
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSName name;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSTypeReference type;
  }

  public interface KSTypeArgument extends com.google.devtools.ksp.symbol.KSAnnotated {
    method @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getType();
    method @NonNull public com.google.devtools.ksp.symbol.Variance getVariance();
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSTypeReference type;
    property @NonNull public abstract com.google.devtools.ksp.symbol.Variance variance;
  }

  public interface KSTypeParameter extends com.google.devtools.ksp.symbol.KSDeclaration {
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSTypeReference> getBounds();
    method @NonNull public com.google.devtools.ksp.symbol.KSName getName();
    method @NonNull public com.google.devtools.ksp.symbol.Variance getVariance();
    method public boolean isReified();
    property @NonNull public abstract kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSTypeReference> bounds;
    property public abstract boolean isReified;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSName name;
    property @NonNull public abstract com.google.devtools.ksp.symbol.Variance variance;
  }

  public interface KSTypeReference extends com.google.devtools.ksp.symbol.KSAnnotated com.google.devtools.ksp.symbol.KSModifierListOwner {
    method @Nullable public com.google.devtools.ksp.symbol.KSReferenceElement getElement();
    method @NonNull public com.google.devtools.ksp.symbol.KSType resolve();
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSReferenceElement element;
  }

  public interface KSValueArgument extends com.google.devtools.ksp.symbol.KSAnnotated {
    method @Nullable public com.google.devtools.ksp.symbol.KSName getName();
    method @Nullable public Object getValue();
    method public boolean isSpread();
    property public abstract boolean isSpread;
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSName name;
    property @Nullable public abstract Object value;
  }

  public interface KSValueParameter extends com.google.devtools.ksp.symbol.KSAnnotated {
    method public boolean getHasDefault();
    method @Nullable public com.google.devtools.ksp.symbol.KSName getName();
    method @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getType();
    method public boolean isCrossInline();
    method public boolean isNoInline();
    method public boolean isVal();
    method public boolean isVar();
    method public boolean isVararg();
    property public abstract boolean hasDefault;
    property public abstract boolean isCrossInline;
    property public abstract boolean isNoInline;
    property public abstract boolean isVal;
    property public abstract boolean isVar;
    property public abstract boolean isVararg;
    property @Nullable public abstract com.google.devtools.ksp.symbol.KSName name;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSTypeReference type;
  }

  public interface KSVisitor<D, R> {
    method public R visitAnnotated(@NonNull com.google.devtools.ksp.symbol.KSAnnotated annotated, D data);
    method public R visitAnnotation(@NonNull com.google.devtools.ksp.symbol.KSAnnotation annotation, D data);
    method public R visitCallableReference(@NonNull com.google.devtools.ksp.symbol.KSCallableReference reference, D data);
    method public R visitClassDeclaration(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration classDeclaration, D data);
    method public R visitClassifierReference(@NonNull com.google.devtools.ksp.symbol.KSClassifierReference reference, D data);
    method public R visitDeclaration(@NonNull com.google.devtools.ksp.symbol.KSDeclaration declaration, D data);
    method public R visitDeclarationContainer(@NonNull com.google.devtools.ksp.symbol.KSDeclarationContainer declarationContainer, D data);
    method public R visitDefNonNullReference(@NonNull com.google.devtools.ksp.symbol.KSDefNonNullReference reference, D data);
    method public R visitDynamicReference(@NonNull com.google.devtools.ksp.symbol.KSDynamicReference reference, D data);
    method public R visitFile(@NonNull com.google.devtools.ksp.symbol.KSFile file, D data);
    method public R visitFunctionDeclaration(@NonNull com.google.devtools.ksp.symbol.KSFunctionDeclaration function, D data);
    method public R visitModifierListOwner(@NonNull com.google.devtools.ksp.symbol.KSModifierListOwner modifierListOwner, D data);
    method public R visitNode(@NonNull com.google.devtools.ksp.symbol.KSNode node, D data);
    method public R visitParenthesizedReference(@NonNull com.google.devtools.ksp.symbol.KSParenthesizedReference reference, D data);
    method public R visitPropertyAccessor(@NonNull com.google.devtools.ksp.symbol.KSPropertyAccessor accessor, D data);
    method public R visitPropertyDeclaration(@NonNull com.google.devtools.ksp.symbol.KSPropertyDeclaration property, D data);
    method public R visitPropertyGetter(@NonNull com.google.devtools.ksp.symbol.KSPropertyGetter getter, D data);
    method public R visitPropertySetter(@NonNull com.google.devtools.ksp.symbol.KSPropertySetter setter, D data);
    method public R visitReferenceElement(@NonNull com.google.devtools.ksp.symbol.KSReferenceElement element, D data);
    method public R visitTypeAlias(@NonNull com.google.devtools.ksp.symbol.KSTypeAlias typeAlias, D data);
    method public R visitTypeArgument(@NonNull com.google.devtools.ksp.symbol.KSTypeArgument typeArgument, D data);
    method public R visitTypeParameter(@NonNull com.google.devtools.ksp.symbol.KSTypeParameter typeParameter, D data);
    method public R visitTypeReference(@NonNull com.google.devtools.ksp.symbol.KSTypeReference typeReference, D data);
    method public R visitValueArgument(@NonNull com.google.devtools.ksp.symbol.KSValueArgument valueArgument, D data);
    method public R visitValueParameter(@NonNull com.google.devtools.ksp.symbol.KSValueParameter valueParameter, D data);
  }

  public class KSVisitorVoid implements com.google.devtools.ksp.symbol.KSVisitor<kotlin.Unit,kotlin.Unit> {
    ctor public KSVisitorVoid();
    method public void visitAnnotated(@NonNull com.google.devtools.ksp.symbol.KSAnnotated annotated, @NonNull kotlin.Unit data);
    method public void visitAnnotation(@NonNull com.google.devtools.ksp.symbol.KSAnnotation annotation, @NonNull kotlin.Unit data);
    method public void visitCallableReference(@NonNull com.google.devtools.ksp.symbol.KSCallableReference reference, @NonNull kotlin.Unit data);
    method public void visitClassDeclaration(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration classDeclaration, @NonNull kotlin.Unit data);
    method public void visitClassifierReference(@NonNull com.google.devtools.ksp.symbol.KSClassifierReference reference, @NonNull kotlin.Unit data);
    method public void visitDeclaration(@NonNull com.google.devtools.ksp.symbol.KSDeclaration declaration, @NonNull kotlin.Unit data);
    method public void visitDeclarationContainer(@NonNull com.google.devtools.ksp.symbol.KSDeclarationContainer declarationContainer, @NonNull kotlin.Unit data);
    method public void visitDefNonNullReference(@NonNull com.google.devtools.ksp.symbol.KSDefNonNullReference reference, @NonNull kotlin.Unit data);
    method public void visitDynamicReference(@NonNull com.google.devtools.ksp.symbol.KSDynamicReference reference, @NonNull kotlin.Unit data);
    method public void visitFile(@NonNull com.google.devtools.ksp.symbol.KSFile file, @NonNull kotlin.Unit data);
    method public void visitFunctionDeclaration(@NonNull com.google.devtools.ksp.symbol.KSFunctionDeclaration function, @NonNull kotlin.Unit data);
    method public void visitModifierListOwner(@NonNull com.google.devtools.ksp.symbol.KSModifierListOwner modifierListOwner, @NonNull kotlin.Unit data);
    method public void visitNode(@NonNull com.google.devtools.ksp.symbol.KSNode node, @NonNull kotlin.Unit data);
    method public void visitParenthesizedReference(@NonNull com.google.devtools.ksp.symbol.KSParenthesizedReference reference, @NonNull kotlin.Unit data);
    method public void visitPropertyAccessor(@NonNull com.google.devtools.ksp.symbol.KSPropertyAccessor accessor, @NonNull kotlin.Unit data);
    method public void visitPropertyDeclaration(@NonNull com.google.devtools.ksp.symbol.KSPropertyDeclaration property, @NonNull kotlin.Unit data);
    method public void visitPropertyGetter(@NonNull com.google.devtools.ksp.symbol.KSPropertyGetter getter, @NonNull kotlin.Unit data);
    method public void visitPropertySetter(@NonNull com.google.devtools.ksp.symbol.KSPropertySetter setter, @NonNull kotlin.Unit data);
    method public void visitReferenceElement(@NonNull com.google.devtools.ksp.symbol.KSReferenceElement element, @NonNull kotlin.Unit data);
    method public void visitTypeAlias(@NonNull com.google.devtools.ksp.symbol.KSTypeAlias typeAlias, @NonNull kotlin.Unit data);
    method public void visitTypeArgument(@NonNull com.google.devtools.ksp.symbol.KSTypeArgument typeArgument, @NonNull kotlin.Unit data);
    method public void visitTypeParameter(@NonNull com.google.devtools.ksp.symbol.KSTypeParameter typeParameter, @NonNull kotlin.Unit data);
    method public void visitTypeReference(@NonNull com.google.devtools.ksp.symbol.KSTypeReference typeReference, @NonNull kotlin.Unit data);
    method public void visitValueArgument(@NonNull com.google.devtools.ksp.symbol.KSValueArgument valueArgument, @NonNull kotlin.Unit data);
    method public void visitValueParameter(@NonNull com.google.devtools.ksp.symbol.KSValueParameter valueParameter, @NonNull kotlin.Unit data);
  }

  public abstract sealed class Location {
  }

  public enum Modifier {
    method @NonNull public static com.google.devtools.ksp.symbol.Modifier valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method @NonNull public static com.google.devtools.ksp.symbol.Modifier[] values();
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier ABSTRACT;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier ACTUAL;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier ANNOTATION;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier CONST;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier CROSSINLINE;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier DATA;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier ENUM;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier EXPECT;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier EXTERNAL;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier FINAL;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier FUN;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier IN;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier INFIX;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier INLINE;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier INNER;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier INTERNAL;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_DEFAULT;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_NATIVE;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_STATIC;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_STRICT;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_SYNCHRONIZED;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_TRANSIENT;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_VOLATILE;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier LATEINIT;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier NOINLINE;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier OPEN;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier OPERATOR;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier OUT;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier OVERRIDE;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier PRIVATE;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier PROTECTED;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier PUBLIC;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier REIFIED;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier SEALED;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier SUSPEND;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier TAILREC;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier VALUE;
    enum_constant public static final com.google.devtools.ksp.symbol.Modifier VARARG;
  }

  public final class NonExistLocation extends com.google.devtools.ksp.symbol.Location {
    field @NonNull public static final com.google.devtools.ksp.symbol.NonExistLocation INSTANCE;
  }

  public enum Nullability {
    method @NonNull public static com.google.devtools.ksp.symbol.Nullability valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method @NonNull public static com.google.devtools.ksp.symbol.Nullability[] values();
    enum_constant public static final com.google.devtools.ksp.symbol.Nullability NOT_NULL;
    enum_constant public static final com.google.devtools.ksp.symbol.Nullability NULLABLE;
    enum_constant public static final com.google.devtools.ksp.symbol.Nullability PLATFORM;
  }

  public enum Origin {
    method @NonNull public static com.google.devtools.ksp.symbol.Origin valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method @NonNull public static com.google.devtools.ksp.symbol.Origin[] values();
    enum_constant public static final com.google.devtools.ksp.symbol.Origin JAVA;
    enum_constant public static final com.google.devtools.ksp.symbol.Origin JAVA_LIB;
    enum_constant public static final com.google.devtools.ksp.symbol.Origin KOTLIN;
    enum_constant public static final com.google.devtools.ksp.symbol.Origin KOTLIN_LIB;
    enum_constant public static final com.google.devtools.ksp.symbol.Origin SYNTHETIC;
  }

  public enum Variance {
    method public final String getLabel();
    method @NonNull public static com.google.devtools.ksp.symbol.Variance valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method @NonNull public static com.google.devtools.ksp.symbol.Variance[] values();
    property public final String label;
    enum_constant public static final com.google.devtools.ksp.symbol.Variance CONTRAVARIANT;
    enum_constant public static final com.google.devtools.ksp.symbol.Variance COVARIANT;
    enum_constant public static final com.google.devtools.ksp.symbol.Variance INVARIANT;
    enum_constant public static final com.google.devtools.ksp.symbol.Variance STAR;
  }

  public enum Visibility {
    method @NonNull public static com.google.devtools.ksp.symbol.Visibility valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;
    method @NonNull public static com.google.devtools.ksp.symbol.Visibility[] values();
    enum_constant public static final com.google.devtools.ksp.symbol.Visibility INTERNAL;
    enum_constant public static final com.google.devtools.ksp.symbol.Visibility JAVA_PACKAGE;
    enum_constant public static final com.google.devtools.ksp.symbol.Visibility LOCAL;
    enum_constant public static final com.google.devtools.ksp.symbol.Visibility PRIVATE;
    enum_constant public static final com.google.devtools.ksp.symbol.Visibility PROTECTED;
    enum_constant public static final com.google.devtools.ksp.symbol.Visibility PUBLIC;
  }

}

package com.google.devtools.ksp.visitor {

  public abstract class KSDefaultVisitor<D, R> extends com.google.devtools.ksp.visitor.KSEmptyVisitor<D,R> {
    ctor public KSDefaultVisitor();
  }

  public abstract class KSEmptyVisitor<D, R> implements com.google.devtools.ksp.symbol.KSVisitor<D,R> {
    ctor public KSEmptyVisitor();
    method public abstract R defaultHandler(@NonNull com.google.devtools.ksp.symbol.KSNode node, D data);
    method public R visitAnnotated(@NonNull com.google.devtools.ksp.symbol.KSAnnotated annotated, D data);
    method public R visitAnnotation(@NonNull com.google.devtools.ksp.symbol.KSAnnotation annotation, D data);
    method public R visitCallableReference(@NonNull com.google.devtools.ksp.symbol.KSCallableReference reference, D data);
    method public R visitClassDeclaration(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration classDeclaration, D data);
    method public R visitClassifierReference(@NonNull com.google.devtools.ksp.symbol.KSClassifierReference reference, D data);
    method public R visitDeclaration(@NonNull com.google.devtools.ksp.symbol.KSDeclaration declaration, D data);
    method public R visitDeclarationContainer(@NonNull com.google.devtools.ksp.symbol.KSDeclarationContainer declarationContainer, D data);
    method public R visitDefNonNullReference(@NonNull com.google.devtools.ksp.symbol.KSDefNonNullReference reference, D data);
    method public R visitDynamicReference(@NonNull com.google.devtools.ksp.symbol.KSDynamicReference reference, D data);
    method public R visitFile(@NonNull com.google.devtools.ksp.symbol.KSFile file, D data);
    method public R visitFunctionDeclaration(@NonNull com.google.devtools.ksp.symbol.KSFunctionDeclaration function, D data);
    method public R visitModifierListOwner(@NonNull com.google.devtools.ksp.symbol.KSModifierListOwner modifierListOwner, D data);
    method public R visitNode(@NonNull com.google.devtools.ksp.symbol.KSNode node, D data);
    method public R visitParenthesizedReference(@NonNull com.google.devtools.ksp.symbol.KSParenthesizedReference reference, D data);
    method public R visitPropertyAccessor(@NonNull com.google.devtools.ksp.symbol.KSPropertyAccessor accessor, D data);
    method public R visitPropertyDeclaration(@NonNull com.google.devtools.ksp.symbol.KSPropertyDeclaration property, D data);
    method public R visitPropertyGetter(@NonNull com.google.devtools.ksp.symbol.KSPropertyGetter getter, D data);
    method public R visitPropertySetter(@NonNull com.google.devtools.ksp.symbol.KSPropertySetter setter, D data);
    method public R visitReferenceElement(@NonNull com.google.devtools.ksp.symbol.KSReferenceElement element, D data);
    method public R visitTypeAlias(@NonNull com.google.devtools.ksp.symbol.KSTypeAlias typeAlias, D data);
    method public R visitTypeArgument(@NonNull com.google.devtools.ksp.symbol.KSTypeArgument typeArgument, D data);
    method public R visitTypeParameter(@NonNull com.google.devtools.ksp.symbol.KSTypeParameter typeParameter, D data);
    method public R visitTypeReference(@NonNull com.google.devtools.ksp.symbol.KSTypeReference typeReference, D data);
    method public R visitValueArgument(@NonNull com.google.devtools.ksp.symbol.KSValueArgument valueArgument, D data);
    method public R visitValueParameter(@NonNull com.google.devtools.ksp.symbol.KSValueParameter valueParameter, D data);
  }

  public abstract class KSTopDownVisitor<D, R> extends com.google.devtools.ksp.visitor.KSDefaultVisitor<D,R> {
    ctor public KSTopDownVisitor();
  }

  public class KSValidateVisitor extends com.google.devtools.ksp.visitor.KSDefaultVisitor<com.google.devtools.ksp.symbol.KSNode,java.lang.Boolean> {
    ctor public KSValidateVisitor(@NonNull kotlin.jvm.functions.Function2<? super com.google.devtools.ksp.symbol.KSNode,? super com.google.devtools.ksp.symbol.KSNode,java.lang.Boolean> predicate);
    method @NonNull public Boolean defaultHandler(@NonNull com.google.devtools.ksp.symbol.KSNode node, @Nullable com.google.devtools.ksp.symbol.KSNode data);
    method @NonNull public Boolean visitAnnotated(@NonNull com.google.devtools.ksp.symbol.KSAnnotated annotated, @Nullable com.google.devtools.ksp.symbol.KSNode data);
    method @NonNull public Boolean visitAnnotation(@NonNull com.google.devtools.ksp.symbol.KSAnnotation annotation, @Nullable com.google.devtools.ksp.symbol.KSNode data);
    method @NonNull public Boolean visitClassDeclaration(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration classDeclaration, @Nullable com.google.devtools.ksp.symbol.KSNode data);
    method @NonNull public Boolean visitDeclaration(@NonNull com.google.devtools.ksp.symbol.KSDeclaration declaration, @Nullable com.google.devtools.ksp.symbol.KSNode data);
    method @NonNull public Boolean visitDeclarationContainer(@NonNull com.google.devtools.ksp.symbol.KSDeclarationContainer declarationContainer, @Nullable com.google.devtools.ksp.symbol.KSNode data);
    method @NonNull public Boolean visitFunctionDeclaration(@NonNull com.google.devtools.ksp.symbol.KSFunctionDeclaration function, @Nullable com.google.devtools.ksp.symbol.KSNode data);
    method @NonNull public Boolean visitPropertyDeclaration(@NonNull com.google.devtools.ksp.symbol.KSPropertyDeclaration property, @Nullable com.google.devtools.ksp.symbol.KSNode data);
    method @NonNull public Boolean visitTypeParameter(@NonNull com.google.devtools.ksp.symbol.KSTypeParameter typeParameter, @Nullable com.google.devtools.ksp.symbol.KSNode data);
    method @NonNull public Boolean visitTypeReference(@NonNull com.google.devtools.ksp.symbol.KSTypeReference typeReference, @Nullable com.google.devtools.ksp.symbol.KSNode data);
    method @NonNull public Boolean visitValueArgument(@NonNull com.google.devtools.ksp.symbol.KSValueArgument valueArgument, @Nullable com.google.devtools.ksp.symbol.KSNode data);
    method @NonNull public Boolean visitValueParameter(@NonNull com.google.devtools.ksp.symbol.KSValueParameter valueParameter, @Nullable com.google.devtools.ksp.symbol.KSNode data);
  }

}

