// 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 @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getKsType();
    property @NonNull public 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 @InaccessibleFromKotlin @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSType> getKsTypes();
    property @NonNull public 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 @KotlinOnly public static inline <reified T> com.google.devtools.ksp.symbol.KSClassDeclaration getClassDeclarationByName(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 @InaccessibleFromKotlin @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);
    method @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @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);
    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);
    property public static String ExceptionMessage;
    property @Nullable public static com.google.devtools.ksp.symbol.KSFile com.google.devtools.ksp.symbol.KSNode.containingFile;
    property @NonNull public static java.util.List<com.google.devtools.ksp.symbol.KSTypeArgument> com.google.devtools.ksp.symbol.KSType.innerArguments;
    property @Nullable public static com.google.devtools.ksp.symbol.KSType com.google.devtools.ksp.symbol.KSType.outerType;
    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);
    method public void associateByPath(@NonNull java.util.List<? extends com.google.devtools.ksp.symbol.KSFile> sources, @NonNull String path, @NonNull String extensionName);
    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);
    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);
    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);
    method @NonNull public java.io.OutputStream createNewFile(@NonNull com.google.devtools.ksp.processing.Dependencies dependencies, @NonNull String packageName, @NonNull String fileName, @NonNull String extensionName);
    method @NonNull public java.io.OutputStream createNewFileByPath(@NonNull com.google.devtools.ksp.processing.Dependencies dependencies, @NonNull String path, @NonNull String extensionName);
    method @InaccessibleFromKotlin @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, com.google.devtools.ksp.symbol.KSFile... sources);
    method @InaccessibleFromKotlin public boolean getAggregating();
    method @InaccessibleFromKotlin @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSFile> getOriginatingFiles();
    method @InaccessibleFromKotlin public boolean isAllSources();
    property public boolean aggregating;
    property public boolean isAllSources;
    property @NonNull public 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 @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.processing.Dependencies getALL_FILES();
    property @NonNull public com.google.devtools.ksp.processing.Dependencies ALL_FILES;
  }

  public enum ExitCode {
    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 @InaccessibleFromKotlin @NonNull public String getJvmDefaultMode();
    method @InaccessibleFromKotlin @NonNull public String getJvmTarget();
    property @NonNull public abstract String jvmDefaultMode;
    property @NonNull public abstract String jvmTarget;
  }

  public interface KSBuiltIns {
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getAnnotationType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getAnyType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getArrayType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getBooleanType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getByteType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getCharType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getDoubleType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getFloatType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getIntType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getIterableType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getLongType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getNothingType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getNumberType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getShortType();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSType getStringType();
    method @InaccessibleFromKotlin @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);
    method public void exception(@NonNull Throwable e);
    method public void info(@NonNull String message, @Nullable com.google.devtools.ksp.symbol.KSNode symbol);
    method public void logging(@NonNull String message, @Nullable com.google.devtools.ksp.symbol.KSNode symbol);
    method public void warn(@NonNull String message, @Nullable com.google.devtools.ksp.symbol.KSNode symbol);
  }

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

  public interface PlatformInfo {
    method @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @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);
    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);
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSAnnotated> getSymbolsWithAnnotation(@NonNull String annotationName, boolean inDepth);
    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 @InaccessibleFromKotlin @NonNull public kotlin.KotlinVersion getApiVersion();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.processing.CodeGenerator getCodeGenerator();
    method @InaccessibleFromKotlin @NonNull public kotlin.KotlinVersion getCompilerVersion();
    method @InaccessibleFromKotlin @NonNull public kotlin.KotlinVersion getKotlinVersion();
    method @InaccessibleFromKotlin @NonNull public kotlin.KotlinVersion getKspVersion();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.processing.KSPLogger getLogger();
    method @InaccessibleFromKotlin @NonNull public java.util.Map<java.lang.String,java.lang.String> getOptions();
    method @InaccessibleFromKotlin @NonNull public java.util.List<com.google.devtools.ksp.processing.PlatformInfo> getPlatforms();
    property @NonNull public kotlin.KotlinVersion apiVersion;
    property @NonNull public com.google.devtools.ksp.processing.CodeGenerator codeGenerator;
    property @NonNull public kotlin.KotlinVersion compilerVersion;
    property @NonNull public kotlin.KotlinVersion kotlinVersion;
    property @NonNull public kotlin.KotlinVersion kspVersion;
    property @NonNull public com.google.devtools.ksp.processing.KSPLogger logger;
    property @NonNull public java.util.Map<java.lang.String,java.lang.String> options;
    property @NonNull public 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 {
    enum_constant public static final com.google.devtools.ksp.symbol.AnnotationUseSiteTarget ALL;
    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 @InaccessibleFromKotlin @NonNull public String getType();
    property @NonNull public 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 @InaccessibleFromKotlin @NonNull public String getFilePath();
    method @InaccessibleFromKotlin public int getLineNumber();
    property @NonNull public String filePath;
    property public int lineNumber;
  }

  public enum FunctionKind {
    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 @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getAnnotationType();
    method @InaccessibleFromKotlin @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSValueArgument> getArguments();
    method @InaccessibleFromKotlin @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSValueArgument> getDefaultArguments();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSName getShortName();
    method @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSValueParameter> getFunctionParameters();
    method @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getReceiverType();
    method @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.ClassKind getClassKind();
    method @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSFunctionDeclaration getPrimaryConstructor();
    method @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSClassDeclaration> getSealedSubclasses();
    method @InaccessibleFromKotlin @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSTypeReference> getSuperTypes();
    method @InaccessibleFromKotlin 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 @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSFile getContainingFile();
    method @InaccessibleFromKotlin @Nullable public String getDocString();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSName getPackageName();
    method @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSDeclaration getParentDeclaration();
    method @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSName getQualifiedName();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSName getSimpleName();
    method @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @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 @InaccessibleFromKotlin public boolean isActual();
    method @InaccessibleFromKotlin 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 @InaccessibleFromKotlin @NonNull public String getFileName();
    method @InaccessibleFromKotlin @NonNull public String getFilePath();
    method @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSType getExtensionReceiverType();
    method @InaccessibleFromKotlin @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSType> getParameterTypes();
    method @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSType getReturnType();
    method @InaccessibleFromKotlin @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSTypeParameter> getTypeParameters();
    method @InaccessibleFromKotlin 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 @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getExtensionReceiver();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.FunctionKind getFunctionKind();
    method @InaccessibleFromKotlin @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSValueParameter> getParameters();
    method @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getReturnType();
    method @InaccessibleFromKotlin 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 @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.Location getLocation();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.Origin getOrigin();
    method @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getExtensionReceiver();
    method @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSPropertyGetter getGetter();
    method @InaccessibleFromKotlin public boolean getHasBackingField();
    method @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSPropertySetter getSetter();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getType();
    method public boolean isDelegated();
    method @InaccessibleFromKotlin 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 @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSAnnotation> getAnnotations();
    method @InaccessibleFromKotlin @NonNull public java.util.List<com.google.devtools.ksp.symbol.KSTypeArgument> getArguments();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSDeclaration getDeclaration();
    method @InaccessibleFromKotlin @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 @InaccessibleFromKotlin public boolean isError();
    method @InaccessibleFromKotlin public boolean isFunctionType();
    method @InaccessibleFromKotlin public boolean isMarkedNullable();
    method public boolean isMutabilityFlexible();
    method @InaccessibleFromKotlin 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 @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSName getName();
    method @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getType();
    method @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @NonNull public kotlin.sequences.Sequence<com.google.devtools.ksp.symbol.KSTypeReference> getBounds();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSName getName();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.Variance getVariance();
    method @InaccessibleFromKotlin 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 @InaccessibleFromKotlin @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 @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSName getName();
    method @InaccessibleFromKotlin @Nullable public Object getValue();
    method @InaccessibleFromKotlin 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 @InaccessibleFromKotlin public boolean getHasDefault();
    method @InaccessibleFromKotlin @Nullable public com.google.devtools.ksp.symbol.KSName getName();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getType();
    method @InaccessibleFromKotlin public boolean isCrossInline();
    method @InaccessibleFromKotlin public boolean isNoInline();
    method @InaccessibleFromKotlin public boolean isVal();
    method @InaccessibleFromKotlin public boolean isVar();
    method @InaccessibleFromKotlin 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 exhaustive class Location {
  }

  public enum Modifier {
    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 {
    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 {
    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 @InaccessibleFromKotlin @NonNull public String getLabel();
    property @NonNull public 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 {
    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);
  }

}

