// 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 KSBackingField extends com.google.devtools.ksp.symbol.KSDeclaration {
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSPropertyDeclaration getProperty();
    method @InaccessibleFromKotlin @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getType();
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSPropertyDeclaration property;
    property @NonNull public abstract com.google.devtools.ksp.symbol.KSTypeReference type;
  }

  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 default com.google.devtools.ksp.symbol.KSBackingField getBackingField();
    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 default com.google.devtools.ksp.symbol.KSBackingField backingField;
    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);
  }

}

