diff --git a/.github/workflows/auto-merge.yml b/.github/workflows/auto-merge.yml index cbad96f0d1..fa014d7bb9 100644 --- a/.github/workflows/auto-merge.yml +++ b/.github/workflows/auto-merge.yml @@ -22,7 +22,7 @@ jobs: - uses: actions/checkout@v2 with: fetch-depth: 0 - ref: 2.0.3-release + ref: 2.0.4-release - name: merge commits from main to release branch run: | @@ -40,7 +40,7 @@ jobs: VERSION_BUMPS=$(git log $MERGE_BASE..origin/main --pretty=%H --grep UPDATE_KOTLIN_VERSION) TO_PICK=$(grep -Fxv -f <(echo "$PICKED"; echo "$VERSION_BUMPS"; echo "$DONT_PICK") <(echo "$CANDIDATES") | awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }') echo Picking $TO_PICK - if [ -n "$TO_PICK" ]; then git cherry-pick -x $TO_PICK; fi + if [ -n "$TO_PICK" ]; then git cherry-pick -x --allow-empty $TO_PICK; fi - name: Setup Java 17 uses: actions/setup-java@v1.4.3 diff --git a/api/api.base b/api/api.base deleted file mode 100644 index 06f85c6b4a..0000000000 --- a/api/api.base +++ /dev/null @@ -1,762 +0,0 @@ -// Signature format: 2.0 -package com.google.devtools.ksp { - - @com.google.devtools.ksp.KspExperimental public final class KSTypeNotPresentException extends java.lang.RuntimeException { - ctor public KSTypeNotPresentException(@NonNull com.google.devtools.ksp.symbol.KSType ksType, @NonNull Throwable cause); - method @NonNull public com.google.devtools.ksp.symbol.KSType getKsType(); - property @NonNull public final com.google.devtools.ksp.symbol.KSType ksType; - } - - @com.google.devtools.ksp.KspExperimental public final class KSTypesNotPresentException extends java.lang.RuntimeException { - ctor public KSTypesNotPresentException(@NonNull java.util.List ksTypes, @NonNull Throwable cause); - method @NonNull public java.util.List getKsTypes(); - property @NonNull public final java.util.List 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 getAllSuperTypes(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration); - method @NonNull @com.google.devtools.ksp.KspExperimental public static kotlin.sequences.Sequence getAnnotationsByType(@NonNull com.google.devtools.ksp.symbol.KSAnnotated, @NonNull kotlin.reflect.KClass annotationKClass); - method @Nullable public static inline com.google.devtools.ksp.symbol.KSClassDeclaration getClassDeclarationByName(@NonNull com.google.devtools.ksp.processing.Resolver); - method @Nullable public static com.google.devtools.ksp.symbol.KSClassDeclaration getClassDeclarationByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull String name); - method @NonNull public static kotlin.sequences.Sequence getConstructors(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration); - method @Nullable public static com.google.devtools.ksp.symbol.KSFile getContainingFile(@NonNull com.google.devtools.ksp.symbol.KSNode); - method @NonNull public static kotlin.sequences.Sequence getDeclaredFunctions(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration); - method @NonNull public static kotlin.sequences.Sequence getDeclaredProperties(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration); - method @NonNull public static kotlin.sequences.Sequence getFunctionDeclarationsByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull String name, boolean includeTopLevel = false); - method @NonNull public static java.util.List getInnerArguments(@NonNull com.google.devtools.ksp.symbol.KSType); - method @Nullable @com.google.devtools.ksp.KspExperimental public static com.google.devtools.ksp.symbol.KSClassDeclaration getJavaClassByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull com.google.devtools.ksp.symbol.KSName name); - method @Nullable @com.google.devtools.ksp.KspExperimental public static com.google.devtools.ksp.symbol.KSClassDeclaration getJavaClassByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull String name); - method @Nullable @com.google.devtools.ksp.KspExperimental public static com.google.devtools.ksp.symbol.KSClassDeclaration getKotlinClassByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull com.google.devtools.ksp.symbol.KSName name); - method @Nullable @com.google.devtools.ksp.KspExperimental public static com.google.devtools.ksp.symbol.KSClassDeclaration getKotlinClassByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull String name); - method @Nullable public static com.google.devtools.ksp.symbol.KSType getOuterType(@NonNull com.google.devtools.ksp.symbol.KSType); - method @Nullable public static com.google.devtools.ksp.symbol.KSPropertyDeclaration getPropertyDeclarationByName(@NonNull com.google.devtools.ksp.processing.Resolver, @NonNull String name, boolean includeTopLevel = false); - method @NonNull public static com.google.devtools.ksp.symbol.Visibility getVisibility(@NonNull com.google.devtools.ksp.symbol.KSDeclaration); - method public static boolean isAbstract(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration); - method public static boolean isAbstract(@NonNull com.google.devtools.ksp.symbol.KSPropertyDeclaration); - method @com.google.devtools.ksp.KspExperimental public static boolean isAnnotationPresent(@NonNull com.google.devtools.ksp.symbol.KSAnnotated, @NonNull kotlin.reflect.KClass 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 predicate = { _, _ -> return true }); - field @NonNull public static final String ExceptionMessage = "please file a bug at https://github.com/google/ksp/issues/new"; - } - -} - -package com.google.devtools.ksp.processing { - - public interface CodeGenerator { - method public void associate(@NonNull java.util.List sources, @NonNull String packageName, @NonNull String fileName, @NonNull String extensionName = "kt"); - method public void associateByPath(@NonNull java.util.List sources, @NonNull String path, @NonNull String extensionName = "kt"); - method public void associateWithClasses(@NonNull java.util.List classes, @NonNull String packageName, @NonNull String fileName, @NonNull String extensionName = "kt"); - method public default void associateWithFunctions(@NonNull java.util.List functions, @NonNull String packageName, @NonNull String fileName, @NonNull String extensionName = "kt"); - method public default void associateWithProperties(@NonNull java.util.List properties, @NonNull String packageName, @NonNull String fileName, @NonNull String extensionName = "kt"); - method @NonNull public java.io.OutputStream createNewFile(@NonNull com.google.devtools.ksp.processing.Dependencies dependencies, @NonNull String packageName, @NonNull String fileName, @NonNull String extensionName = "kt"); - method @NonNull public java.io.OutputStream createNewFileByPath(@NonNull com.google.devtools.ksp.processing.Dependencies dependencies, @NonNull String path, @NonNull String extensionName = "kt"); - method @NonNull public java.util.Collection getGeneratedFile(); - property @NonNull public abstract java.util.Collection generatedFile; - } - - public final class Dependencies { - ctor public Dependencies(boolean aggregating, @NonNull com.google.devtools.ksp.symbol.KSFile... sources); - method public boolean getAggregating(); - method @NonNull public java.util.List getOriginatingFiles(); - method public boolean isAllSources(); - property public final boolean aggregating; - property public final boolean isAllSources; - property @NonNull public final java.util.List originatingFiles; - field @NonNull public static final com.google.devtools.ksp.processing.Dependencies.Companion Companion; - } - - public static final class Dependencies.Companion { - method @NonNull public com.google.devtools.ksp.processing.Dependencies getALL_FILES(); - property @NonNull public final com.google.devtools.ksp.processing.Dependencies ALL_FILES; - } - - public enum ExitCode { - method @NonNull public static com.google.devtools.ksp.processing.ExitCode valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException; - method @NonNull public static com.google.devtools.ksp.processing.ExitCode[] values(); - enum_constant public static final com.google.devtools.ksp.processing.ExitCode OK; - enum_constant public static final com.google.devtools.ksp.processing.ExitCode PROCESSING_ERROR; - } - - public interface JsPlatformInfo extends com.google.devtools.ksp.processing.PlatformInfo { - } - - public interface JvmPlatformInfo extends com.google.devtools.ksp.processing.PlatformInfo { - method @NonNull public String getJvmDefaultMode(); - method @NonNull public String getJvmTarget(); - property @NonNull public abstract String jvmDefaultMode; - property @NonNull public abstract String jvmTarget; - } - - public interface KSBuiltIns { - method @NonNull public com.google.devtools.ksp.symbol.KSType getAnnotationType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getAnyType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getArrayType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getBooleanType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getByteType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getCharType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getDoubleType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getFloatType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getIntType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getIterableType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getLongType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getNothingType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getNumberType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getShortType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getStringType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType getUnitType(); - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType annotationType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType anyType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType arrayType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType booleanType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType byteType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType charType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType doubleType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType floatType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType intType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType iterableType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType longType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType nothingType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType numberType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType shortType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType stringType; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSType unitType; - } - - public interface KSPLogger { - method public void error(@NonNull String message, @Nullable com.google.devtools.ksp.symbol.KSNode symbol = null); - method public void exception(@NonNull Throwable e); - method public void info(@NonNull String message, @Nullable com.google.devtools.ksp.symbol.KSNode symbol = null); - method public void logging(@NonNull String message, @Nullable com.google.devtools.ksp.symbol.KSNode symbol = null); - method public void warn(@NonNull String message, @Nullable com.google.devtools.ksp.symbol.KSNode symbol = null); - } - - public interface NativePlatformInfo extends com.google.devtools.ksp.processing.PlatformInfo { - method @NonNull public String getTargetName(); - property @NonNull public abstract String targetName; - } - - public interface PlatformInfo { - method @NonNull public String getPlatformName(); - property @NonNull public abstract String platformName; - } - - public interface Resolver { - method @NonNull public com.google.devtools.ksp.symbol.KSTypeReference createKSTypeReferenceFromKSType(@NonNull com.google.devtools.ksp.symbol.KSType type); - method @NonNull @com.google.devtools.ksp.KspExperimental public java.util.Set effectiveJavaModifiers(@NonNull com.google.devtools.ksp.symbol.KSDeclaration declaration); - method @NonNull public kotlin.sequences.Sequence getAllFiles(); - method @NonNull public com.google.devtools.ksp.processing.KSBuiltIns getBuiltIns(); - method @Nullable public com.google.devtools.ksp.symbol.KSClassDeclaration getClassDeclarationByName(@NonNull com.google.devtools.ksp.symbol.KSName name); - method @NonNull @com.google.devtools.ksp.KspExperimental public kotlin.sequences.Sequence getDeclarationsFromPackage(@NonNull String packageName); - method @NonNull @com.google.devtools.ksp.KspExperimental public kotlin.sequences.Sequence getDeclarationsInSourceOrder(@NonNull com.google.devtools.ksp.symbol.KSDeclarationContainer container); - method @NonNull public kotlin.sequences.Sequence getFunctionDeclarationsByName(@NonNull com.google.devtools.ksp.symbol.KSName name, boolean includeTopLevel = false); - method @NonNull @com.google.devtools.ksp.KspExperimental public com.google.devtools.ksp.symbol.KSTypeReference getJavaWildcard(@NonNull com.google.devtools.ksp.symbol.KSTypeReference reference); - method @NonNull @com.google.devtools.ksp.KspExperimental public kotlin.sequences.Sequence getJvmCheckedException(@NonNull com.google.devtools.ksp.symbol.KSFunctionDeclaration function); - method @NonNull @com.google.devtools.ksp.KspExperimental public kotlin.sequences.Sequence 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 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 getPackageAnnotations(@NonNull String packageName); - method @NonNull @com.google.devtools.ksp.KspExperimental public kotlin.sequences.Sequence getPackagesWithAnnotation(@NonNull String annotationName); - method @Nullable public com.google.devtools.ksp.symbol.KSPropertyDeclaration getPropertyDeclarationByName(@NonNull com.google.devtools.ksp.symbol.KSName name, boolean includeTopLevel = false); - method @NonNull public kotlin.sequences.Sequence getSymbolsWithAnnotation(@NonNull String annotationName, boolean inDepth = false); - method @NonNull public com.google.devtools.ksp.symbol.KSTypeArgument getTypeArgument(@NonNull com.google.devtools.ksp.symbol.KSTypeReference typeRef, @NonNull com.google.devtools.ksp.symbol.Variance variance); - method @com.google.devtools.ksp.KspExperimental public boolean isJavaRawType(@NonNull com.google.devtools.ksp.symbol.KSType type); - method @Nullable @com.google.devtools.ksp.KspExperimental public com.google.devtools.ksp.symbol.KSName mapJavaNameToKotlin(@NonNull com.google.devtools.ksp.symbol.KSName javaName); - method @Nullable @com.google.devtools.ksp.KspExperimental public com.google.devtools.ksp.symbol.KSName mapKotlinNameToJava(@NonNull com.google.devtools.ksp.symbol.KSName kotlinName); - method @Nullable @com.google.devtools.ksp.KspExperimental public String mapToJvmSignature(@NonNull com.google.devtools.ksp.symbol.KSDeclaration declaration); - method public boolean overrides(@NonNull com.google.devtools.ksp.symbol.KSDeclaration overrider, @NonNull com.google.devtools.ksp.symbol.KSDeclaration overridee); - method public boolean overrides(@NonNull com.google.devtools.ksp.symbol.KSDeclaration overrider, @NonNull com.google.devtools.ksp.symbol.KSDeclaration overridee, @NonNull com.google.devtools.ksp.symbol.KSClassDeclaration containingClass); - property @NonNull public abstract com.google.devtools.ksp.processing.KSBuiltIns builtIns; - } - - public interface SymbolProcessor { - method public default void finish(); - method public default void onError(); - method @NonNull public java.util.List process(@NonNull com.google.devtools.ksp.processing.Resolver resolver); - } - - public final class SymbolProcessorEnvironment { - ctor public SymbolProcessorEnvironment(@NonNull java.util.Map 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 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 platforms); - ctor public SymbolProcessorEnvironment(@NonNull java.util.Map 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 platforms, @NonNull kotlin.KotlinVersion kspVersion); - method @NonNull public kotlin.KotlinVersion getApiVersion(); - method @NonNull public com.google.devtools.ksp.processing.CodeGenerator getCodeGenerator(); - method @NonNull public kotlin.KotlinVersion getCompilerVersion(); - method @NonNull public kotlin.KotlinVersion getKotlinVersion(); - method @NonNull public kotlin.KotlinVersion getKspVersion(); - method @NonNull public com.google.devtools.ksp.processing.KSPLogger getLogger(); - method @NonNull public java.util.Map getOptions(); - method @NonNull public java.util.List getPlatforms(); - property @NonNull public final kotlin.KotlinVersion apiVersion; - property @NonNull public final com.google.devtools.ksp.processing.CodeGenerator codeGenerator; - property @NonNull public final kotlin.KotlinVersion compilerVersion; - property @NonNull public final kotlin.KotlinVersion kotlinVersion; - property @NonNull public final kotlin.KotlinVersion kspVersion; - property @NonNull public final com.google.devtools.ksp.processing.KSPLogger logger; - property @NonNull public final java.util.Map options; - property @NonNull public final java.util.List platforms; - } - - public fun interface SymbolProcessorProvider { - method @NonNull public com.google.devtools.ksp.processing.SymbolProcessor create(@NonNull com.google.devtools.ksp.processing.SymbolProcessorEnvironment environment); - } - - public interface UnknownPlatformInfo extends com.google.devtools.ksp.processing.PlatformInfo { - } - -} - -package com.google.devtools.ksp.symbol { - - public enum AnnotationUseSiteTarget { - method @NonNull public static com.google.devtools.ksp.symbol.AnnotationUseSiteTarget valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException; - method @NonNull public static com.google.devtools.ksp.symbol.AnnotationUseSiteTarget[] values(); - enum_constant public static final com.google.devtools.ksp.symbol.AnnotationUseSiteTarget 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 public final String getType(); - method @NonNull public static com.google.devtools.ksp.symbol.ClassKind valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException; - method @NonNull public static com.google.devtools.ksp.symbol.ClassKind[] values(); - property public final String type; - enum_constant public static final com.google.devtools.ksp.symbol.ClassKind ANNOTATION_CLASS; - enum_constant public static final com.google.devtools.ksp.symbol.ClassKind CLASS; - enum_constant public static final com.google.devtools.ksp.symbol.ClassKind ENUM_CLASS; - enum_constant public static final com.google.devtools.ksp.symbol.ClassKind ENUM_ENTRY; - enum_constant public static final com.google.devtools.ksp.symbol.ClassKind INTERFACE; - enum_constant public static final com.google.devtools.ksp.symbol.ClassKind OBJECT; - } - - public final class FileLocation extends com.google.devtools.ksp.symbol.Location { - ctor public FileLocation(@NonNull String filePath, int lineNumber); - method @NonNull public String component1(); - method public int component2(); - method @NonNull public com.google.devtools.ksp.symbol.FileLocation copy(@NonNull String filePath, int lineNumber); - method @NonNull public String getFilePath(); - method public int getLineNumber(); - property @NonNull public final String filePath; - property public final int lineNumber; - } - - public enum FunctionKind { - method @NonNull public static com.google.devtools.ksp.symbol.FunctionKind valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException; - method @NonNull public static com.google.devtools.ksp.symbol.FunctionKind[] values(); - enum_constant public static final com.google.devtools.ksp.symbol.FunctionKind ANONYMOUS; - enum_constant public static final com.google.devtools.ksp.symbol.FunctionKind LAMBDA; - enum_constant public static final com.google.devtools.ksp.symbol.FunctionKind MEMBER; - enum_constant public static final com.google.devtools.ksp.symbol.FunctionKind STATIC; - enum_constant public static final com.google.devtools.ksp.symbol.FunctionKind TOP_LEVEL; - } - - public interface KSAnnotated extends com.google.devtools.ksp.symbol.KSNode { - method @NonNull public kotlin.sequences.Sequence getAnnotations(); - property @NonNull public abstract kotlin.sequences.Sequence annotations; - } - - public interface KSAnnotation extends com.google.devtools.ksp.symbol.KSNode { - method @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getAnnotationType(); - method @NonNull public java.util.List getArguments(); - method @NonNull public java.util.List getDefaultArguments(); - method @NonNull public com.google.devtools.ksp.symbol.KSName getShortName(); - method @Nullable public com.google.devtools.ksp.symbol.AnnotationUseSiteTarget getUseSiteTarget(); - property @NonNull public abstract com.google.devtools.ksp.symbol.KSTypeReference annotationType; - property @NonNull public abstract java.util.List arguments; - property @NonNull public abstract java.util.List 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 R accept(@NonNull com.google.devtools.ksp.symbol.KSVisitor visitor, D data); - method @NonNull public java.util.List getFunctionParameters(); - method @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getReceiverType(); - method @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getReturnType(); - property @NonNull public abstract java.util.List 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 typeArguments); - method @NonNull public kotlin.sequences.Sequence getAllFunctions(); - method @NonNull public kotlin.sequences.Sequence getAllProperties(); - method @NonNull public com.google.devtools.ksp.symbol.ClassKind getClassKind(); - method @Nullable public com.google.devtools.ksp.symbol.KSFunctionDeclaration getPrimaryConstructor(); - method @NonNull public kotlin.sequences.Sequence getSealedSubclasses(); - method @NonNull public kotlin.sequences.Sequence getSuperTypes(); - method public boolean isCompanionObject(); - property @NonNull public abstract com.google.devtools.ksp.symbol.ClassKind classKind; - property public abstract boolean isCompanionObject; - property @Nullable public abstract com.google.devtools.ksp.symbol.KSFunctionDeclaration primaryConstructor; - property @NonNull public abstract kotlin.sequences.Sequence superTypes; - } - - public interface KSClassifierReference extends com.google.devtools.ksp.symbol.KSReferenceElement { - method public default R accept(@NonNull com.google.devtools.ksp.symbol.KSVisitor visitor, D data); - method @Nullable public com.google.devtools.ksp.symbol.KSClassifierReference getQualifier(); - method @NonNull public String referencedName(); - property @Nullable public abstract com.google.devtools.ksp.symbol.KSClassifierReference qualifier; - } - - public interface KSDeclaration extends com.google.devtools.ksp.symbol.KSModifierListOwner com.google.devtools.ksp.symbol.KSAnnotated com.google.devtools.ksp.symbol.KSExpectActual { - method @Nullable public com.google.devtools.ksp.symbol.KSFile getContainingFile(); - method @Nullable public String getDocString(); - method @NonNull public com.google.devtools.ksp.symbol.KSName getPackageName(); - method @Nullable public com.google.devtools.ksp.symbol.KSDeclaration getParentDeclaration(); - method @Nullable public com.google.devtools.ksp.symbol.KSName getQualifiedName(); - method @NonNull public com.google.devtools.ksp.symbol.KSName getSimpleName(); - method @NonNull public java.util.List 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 typeParameters; - } - - public interface KSDeclarationContainer extends com.google.devtools.ksp.symbol.KSNode { - method @NonNull public kotlin.sequences.Sequence getDeclarations(); - property @NonNull public abstract kotlin.sequences.Sequence declarations; - } - - public interface KSDefNonNullReference extends com.google.devtools.ksp.symbol.KSReferenceElement { - method public default R accept(@NonNull com.google.devtools.ksp.symbol.KSVisitor visitor, D data); - method @NonNull public com.google.devtools.ksp.symbol.KSClassifierReference getEnclosedType(); - property @NonNull public abstract com.google.devtools.ksp.symbol.KSClassifierReference enclosedType; - } - - public interface KSDynamicReference extends com.google.devtools.ksp.symbol.KSReferenceElement { - } - - public interface KSExpectActual { - method @NonNull public kotlin.sequences.Sequence findActuals(); - method @NonNull public kotlin.sequences.Sequence findExpects(); - method public boolean isActual(); - method public boolean isExpect(); - property public abstract boolean isActual; - property public abstract boolean isExpect; - } - - public interface KSFile extends com.google.devtools.ksp.symbol.KSDeclarationContainer com.google.devtools.ksp.symbol.KSAnnotated { - method @NonNull public String getFileName(); - method @NonNull public String getFilePath(); - method @NonNull public com.google.devtools.ksp.symbol.KSName getPackageName(); - property @NonNull public abstract String fileName; - property @NonNull public abstract String filePath; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSName packageName; - } - - public interface KSFunction { - method @Nullable public com.google.devtools.ksp.symbol.KSType getExtensionReceiverType(); - method @NonNull public java.util.List getParameterTypes(); - method @Nullable public com.google.devtools.ksp.symbol.KSType getReturnType(); - method @NonNull public java.util.List getTypeParameters(); - method public boolean isError(); - property @Nullable public abstract com.google.devtools.ksp.symbol.KSType extensionReceiverType; - property public abstract boolean isError; - property @NonNull public abstract java.util.List parameterTypes; - property @Nullable public abstract com.google.devtools.ksp.symbol.KSType returnType; - property @NonNull public abstract java.util.List typeParameters; - } - - public interface KSFunctionDeclaration extends com.google.devtools.ksp.symbol.KSDeclaration com.google.devtools.ksp.symbol.KSDeclarationContainer { - method @NonNull public com.google.devtools.ksp.symbol.KSFunction asMemberOf(@NonNull com.google.devtools.ksp.symbol.KSType containing); - method @Nullable public com.google.devtools.ksp.symbol.KSDeclaration findOverridee(); - method @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getExtensionReceiver(); - method @NonNull public com.google.devtools.ksp.symbol.FunctionKind getFunctionKind(); - method @NonNull public java.util.List getParameters(); - method @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getReturnType(); - method public boolean isAbstract(); - property @Nullable public abstract com.google.devtools.ksp.symbol.KSTypeReference extensionReceiver; - property @NonNull public abstract com.google.devtools.ksp.symbol.FunctionKind functionKind; - property public abstract boolean isAbstract; - property @NonNull public abstract java.util.List parameters; - property @Nullable public abstract com.google.devtools.ksp.symbol.KSTypeReference returnType; - } - - public interface KSModifierListOwner extends com.google.devtools.ksp.symbol.KSNode { - method @NonNull public java.util.Set getModifiers(); - property @NonNull public abstract java.util.Set modifiers; - } - - public interface KSName { - method @NonNull public String asString(); - method @NonNull public String getQualifier(); - method @NonNull public String getShortName(); - } - - public interface KSNode { - method public R accept(@NonNull com.google.devtools.ksp.symbol.KSVisitor visitor, D data); - method @NonNull public com.google.devtools.ksp.symbol.Location getLocation(); - method @NonNull public com.google.devtools.ksp.symbol.Origin getOrigin(); - method @Nullable public com.google.devtools.ksp.symbol.KSNode getParent(); - property @NonNull public abstract com.google.devtools.ksp.symbol.Location location; - property @NonNull public abstract com.google.devtools.ksp.symbol.Origin origin; - property @Nullable public abstract com.google.devtools.ksp.symbol.KSNode parent; - } - - public interface KSParenthesizedReference extends com.google.devtools.ksp.symbol.KSReferenceElement { - method @NonNull public com.google.devtools.ksp.symbol.KSReferenceElement getElement(); - property @NonNull public abstract com.google.devtools.ksp.symbol.KSReferenceElement element; - } - - public interface KSPropertyAccessor extends com.google.devtools.ksp.symbol.KSDeclarationContainer com.google.devtools.ksp.symbol.KSAnnotated com.google.devtools.ksp.symbol.KSModifierListOwner { - method @NonNull public com.google.devtools.ksp.symbol.KSPropertyDeclaration getReceiver(); - property @NonNull public abstract com.google.devtools.ksp.symbol.KSPropertyDeclaration receiver; - } - - public interface KSPropertyDeclaration extends com.google.devtools.ksp.symbol.KSDeclaration { - method @NonNull public com.google.devtools.ksp.symbol.KSType asMemberOf(@NonNull com.google.devtools.ksp.symbol.KSType containing); - method @Nullable public com.google.devtools.ksp.symbol.KSPropertyDeclaration findOverridee(); - method @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getExtensionReceiver(); - method @Nullable public com.google.devtools.ksp.symbol.KSPropertyGetter getGetter(); - method public boolean getHasBackingField(); - method @Nullable public com.google.devtools.ksp.symbol.KSPropertySetter getSetter(); - method @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getType(); - method public boolean isDelegated(); - method public boolean isMutable(); - property @Nullable public abstract com.google.devtools.ksp.symbol.KSTypeReference extensionReceiver; - property @Nullable public abstract com.google.devtools.ksp.symbol.KSPropertyGetter getter; - property public abstract boolean hasBackingField; - property public abstract boolean isMutable; - property @Nullable public abstract com.google.devtools.ksp.symbol.KSPropertySetter setter; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSTypeReference type; - } - - public interface KSPropertyGetter extends com.google.devtools.ksp.symbol.KSPropertyAccessor { - method @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getReturnType(); - property @Nullable public abstract com.google.devtools.ksp.symbol.KSTypeReference returnType; - } - - public interface KSPropertySetter extends com.google.devtools.ksp.symbol.KSPropertyAccessor { - method @NonNull public com.google.devtools.ksp.symbol.KSValueParameter getParameter(); - property @NonNull public abstract com.google.devtools.ksp.symbol.KSValueParameter parameter; - } - - public interface KSReferenceElement extends com.google.devtools.ksp.symbol.KSNode { - method @NonNull public java.util.List getTypeArguments(); - property @NonNull public abstract java.util.List typeArguments; - } - - public interface KSType { - method @NonNull public kotlin.sequences.Sequence getAnnotations(); - method @NonNull public java.util.List getArguments(); - method @NonNull public com.google.devtools.ksp.symbol.KSDeclaration getDeclaration(); - method @NonNull public com.google.devtools.ksp.symbol.Nullability getNullability(); - method public boolean isAssignableFrom(@NonNull com.google.devtools.ksp.symbol.KSType that); - method public boolean isCovarianceFlexible(); - method public boolean isError(); - method public boolean isFunctionType(); - method public boolean isMarkedNullable(); - method public boolean isMutabilityFlexible(); - method public boolean isSuspendFunctionType(); - method @NonNull public com.google.devtools.ksp.symbol.KSType makeNotNullable(); - method @NonNull public com.google.devtools.ksp.symbol.KSType makeNullable(); - method @NonNull public com.google.devtools.ksp.symbol.KSType replace(@NonNull java.util.List arguments); - method @NonNull public com.google.devtools.ksp.symbol.KSType starProjection(); - property @NonNull public abstract kotlin.sequences.Sequence annotations; - property @NonNull public abstract java.util.List arguments; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSDeclaration declaration; - property public abstract boolean isError; - property public abstract boolean isFunctionType; - property public abstract boolean isMarkedNullable; - property public abstract boolean isSuspendFunctionType; - property @NonNull public abstract com.google.devtools.ksp.symbol.Nullability nullability; - } - - public interface KSTypeAlias extends com.google.devtools.ksp.symbol.KSDeclaration { - method @NonNull public com.google.devtools.ksp.symbol.KSName getName(); - method @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getType(); - property @NonNull public abstract com.google.devtools.ksp.symbol.KSName name; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSTypeReference type; - } - - public interface KSTypeArgument extends com.google.devtools.ksp.symbol.KSAnnotated { - method @Nullable public com.google.devtools.ksp.symbol.KSTypeReference getType(); - method @NonNull public com.google.devtools.ksp.symbol.Variance getVariance(); - property @Nullable public abstract com.google.devtools.ksp.symbol.KSTypeReference type; - property @NonNull public abstract com.google.devtools.ksp.symbol.Variance variance; - } - - public interface KSTypeParameter extends com.google.devtools.ksp.symbol.KSDeclaration { - method @NonNull public kotlin.sequences.Sequence getBounds(); - method @NonNull public com.google.devtools.ksp.symbol.KSName getName(); - method @NonNull public com.google.devtools.ksp.symbol.Variance getVariance(); - method public boolean isReified(); - property @NonNull public abstract kotlin.sequences.Sequence bounds; - property public abstract boolean isReified; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSName name; - property @NonNull public abstract com.google.devtools.ksp.symbol.Variance variance; - } - - public interface KSTypeReference extends com.google.devtools.ksp.symbol.KSAnnotated com.google.devtools.ksp.symbol.KSModifierListOwner { - method @Nullable public com.google.devtools.ksp.symbol.KSReferenceElement getElement(); - method @NonNull public com.google.devtools.ksp.symbol.KSType resolve(); - property @Nullable public abstract com.google.devtools.ksp.symbol.KSReferenceElement element; - } - - public interface KSValueArgument extends com.google.devtools.ksp.symbol.KSAnnotated { - method @Nullable public com.google.devtools.ksp.symbol.KSName getName(); - method @Nullable public Object getValue(); - method public boolean isSpread(); - property public abstract boolean isSpread; - property @Nullable public abstract com.google.devtools.ksp.symbol.KSName name; - property @Nullable public abstract Object value; - } - - public interface KSValueParameter extends com.google.devtools.ksp.symbol.KSAnnotated { - method public boolean getHasDefault(); - method @Nullable public com.google.devtools.ksp.symbol.KSName getName(); - method @NonNull public com.google.devtools.ksp.symbol.KSTypeReference getType(); - method public boolean isCrossInline(); - method public boolean isNoInline(); - method public boolean isVal(); - method public boolean isVar(); - method public boolean isVararg(); - property public abstract boolean hasDefault; - property public abstract boolean isCrossInline; - property public abstract boolean isNoInline; - property public abstract boolean isVal; - property public abstract boolean isVar; - property public abstract boolean isVararg; - property @Nullable public abstract com.google.devtools.ksp.symbol.KSName name; - property @NonNull public abstract com.google.devtools.ksp.symbol.KSTypeReference type; - } - - public interface KSVisitor { - 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 { - ctor public KSVisitorVoid(); - method public void visitAnnotated(@NonNull com.google.devtools.ksp.symbol.KSAnnotated annotated, @NonNull kotlin.Unit data); - method public void visitAnnotation(@NonNull com.google.devtools.ksp.symbol.KSAnnotation annotation, @NonNull kotlin.Unit data); - method public void visitCallableReference(@NonNull com.google.devtools.ksp.symbol.KSCallableReference reference, @NonNull kotlin.Unit data); - method public void visitClassDeclaration(@NonNull com.google.devtools.ksp.symbol.KSClassDeclaration classDeclaration, @NonNull kotlin.Unit data); - method public void visitClassifierReference(@NonNull com.google.devtools.ksp.symbol.KSClassifierReference reference, @NonNull kotlin.Unit data); - method public void visitDeclaration(@NonNull com.google.devtools.ksp.symbol.KSDeclaration declaration, @NonNull kotlin.Unit data); - method public void visitDeclarationContainer(@NonNull com.google.devtools.ksp.symbol.KSDeclarationContainer declarationContainer, @NonNull kotlin.Unit data); - method public void visitDefNonNullReference(@NonNull com.google.devtools.ksp.symbol.KSDefNonNullReference reference, @NonNull kotlin.Unit data); - method public void visitDynamicReference(@NonNull com.google.devtools.ksp.symbol.KSDynamicReference reference, @NonNull kotlin.Unit data); - method public void visitFile(@NonNull com.google.devtools.ksp.symbol.KSFile file, @NonNull kotlin.Unit data); - method public void visitFunctionDeclaration(@NonNull com.google.devtools.ksp.symbol.KSFunctionDeclaration function, @NonNull kotlin.Unit data); - method public void visitModifierListOwner(@NonNull com.google.devtools.ksp.symbol.KSModifierListOwner modifierListOwner, @NonNull kotlin.Unit data); - method public void visitNode(@NonNull com.google.devtools.ksp.symbol.KSNode node, @NonNull kotlin.Unit data); - method public void visitParenthesizedReference(@NonNull com.google.devtools.ksp.symbol.KSParenthesizedReference reference, @NonNull kotlin.Unit data); - method public void visitPropertyAccessor(@NonNull com.google.devtools.ksp.symbol.KSPropertyAccessor accessor, @NonNull kotlin.Unit data); - method public void visitPropertyDeclaration(@NonNull com.google.devtools.ksp.symbol.KSPropertyDeclaration property, @NonNull kotlin.Unit data); - method public void visitPropertyGetter(@NonNull com.google.devtools.ksp.symbol.KSPropertyGetter getter, @NonNull kotlin.Unit data); - method public void visitPropertySetter(@NonNull com.google.devtools.ksp.symbol.KSPropertySetter setter, @NonNull kotlin.Unit data); - method public void visitReferenceElement(@NonNull com.google.devtools.ksp.symbol.KSReferenceElement element, @NonNull kotlin.Unit data); - method public void visitTypeAlias(@NonNull com.google.devtools.ksp.symbol.KSTypeAlias typeAlias, @NonNull kotlin.Unit data); - method public void visitTypeArgument(@NonNull com.google.devtools.ksp.symbol.KSTypeArgument typeArgument, @NonNull kotlin.Unit data); - method public void visitTypeParameter(@NonNull com.google.devtools.ksp.symbol.KSTypeParameter typeParameter, @NonNull kotlin.Unit data); - method public void visitTypeReference(@NonNull com.google.devtools.ksp.symbol.KSTypeReference typeReference, @NonNull kotlin.Unit data); - method public void visitValueArgument(@NonNull com.google.devtools.ksp.symbol.KSValueArgument valueArgument, @NonNull kotlin.Unit data); - method public void visitValueParameter(@NonNull com.google.devtools.ksp.symbol.KSValueParameter valueParameter, @NonNull kotlin.Unit data); - } - - public abstract sealed class Location { - } - - public enum Modifier { - method @NonNull public static com.google.devtools.ksp.symbol.Modifier valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException; - method @NonNull public static com.google.devtools.ksp.symbol.Modifier[] values(); - enum_constant public static final com.google.devtools.ksp.symbol.Modifier ABSTRACT; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier ACTUAL; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier ANNOTATION; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier CONST; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier CROSSINLINE; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier DATA; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier ENUM; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier EXPECT; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier EXTERNAL; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier FINAL; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier FUN; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier IN; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier INFIX; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier INLINE; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier INNER; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier INTERNAL; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_DEFAULT; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_NATIVE; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_STATIC; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_STRICT; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_SYNCHRONIZED; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_TRANSIENT; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier JAVA_VOLATILE; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier LATEINIT; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier NOINLINE; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier OPEN; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier OPERATOR; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier OUT; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier OVERRIDE; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier PRIVATE; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier PROTECTED; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier PUBLIC; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier REIFIED; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier SEALED; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier SUSPEND; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier TAILREC; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier VALUE; - enum_constant public static final com.google.devtools.ksp.symbol.Modifier VARARG; - } - - public final class NonExistLocation extends com.google.devtools.ksp.symbol.Location { - field @NonNull public static final com.google.devtools.ksp.symbol.NonExistLocation INSTANCE; - } - - public enum Nullability { - method @NonNull public static com.google.devtools.ksp.symbol.Nullability valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException; - method @NonNull public static com.google.devtools.ksp.symbol.Nullability[] values(); - enum_constant public static final com.google.devtools.ksp.symbol.Nullability NOT_NULL; - enum_constant public static final com.google.devtools.ksp.symbol.Nullability NULLABLE; - enum_constant public static final com.google.devtools.ksp.symbol.Nullability PLATFORM; - } - - public enum Origin { - method @NonNull public static com.google.devtools.ksp.symbol.Origin valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException; - method @NonNull public static com.google.devtools.ksp.symbol.Origin[] values(); - enum_constant public static final com.google.devtools.ksp.symbol.Origin JAVA; - enum_constant public static final com.google.devtools.ksp.symbol.Origin JAVA_LIB; - enum_constant public static final com.google.devtools.ksp.symbol.Origin KOTLIN; - enum_constant public static final com.google.devtools.ksp.symbol.Origin KOTLIN_LIB; - enum_constant public static final com.google.devtools.ksp.symbol.Origin SYNTHETIC; - } - - public enum Variance { - method public final String getLabel(); - method @NonNull public static com.google.devtools.ksp.symbol.Variance valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException; - method @NonNull public static com.google.devtools.ksp.symbol.Variance[] values(); - property public final String label; - enum_constant public static final com.google.devtools.ksp.symbol.Variance CONTRAVARIANT; - enum_constant public static final com.google.devtools.ksp.symbol.Variance COVARIANT; - enum_constant public static final com.google.devtools.ksp.symbol.Variance INVARIANT; - enum_constant public static final com.google.devtools.ksp.symbol.Variance STAR; - } - - public enum Visibility { - method @NonNull public static com.google.devtools.ksp.symbol.Visibility valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException; - method @NonNull public static com.google.devtools.ksp.symbol.Visibility[] values(); - enum_constant public static final com.google.devtools.ksp.symbol.Visibility INTERNAL; - enum_constant public static final com.google.devtools.ksp.symbol.Visibility JAVA_PACKAGE; - enum_constant public static final com.google.devtools.ksp.symbol.Visibility LOCAL; - enum_constant public static final com.google.devtools.ksp.symbol.Visibility PRIVATE; - enum_constant public static final com.google.devtools.ksp.symbol.Visibility PROTECTED; - enum_constant public static final com.google.devtools.ksp.symbol.Visibility PUBLIC; - } - -} - -package com.google.devtools.ksp.visitor { - - public abstract class KSDefaultVisitor extends com.google.devtools.ksp.visitor.KSEmptyVisitor { - ctor public KSDefaultVisitor(); - } - - public abstract class KSEmptyVisitor implements com.google.devtools.ksp.symbol.KSVisitor { - 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 extends com.google.devtools.ksp.visitor.KSDefaultVisitor { - ctor public KSTopDownVisitor(); - } - - public class KSValidateVisitor extends com.google.devtools.ksp.visitor.KSDefaultVisitor { - ctor public KSValidateVisitor(@NonNull kotlin.jvm.functions.Function2 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); - } - -} - diff --git a/compiler-plugin/build.gradle.kts b/compiler-plugin/build.gradle.kts index 6caa43952f..1596393985 100644 --- a/compiler-plugin/build.gradle.kts +++ b/compiler-plugin/build.gradle.kts @@ -1,3 +1,4 @@ +import com.google.devtools.ksp.RelativizingInternalPathProvider import com.google.devtools.ksp.RelativizingPathProvider evaluationDependsOn(":common-util") @@ -116,5 +117,5 @@ tasks.test.configure { .asFile .apply { if (!exists()) mkdirs() } jvmArgumentProviders.add(RelativizingPathProvider("idea.home.path", ideaHomeDir)) - jvmArgumentProviders.add(RelativizingPathProvider("java.io.tmpdir", temporaryDir)) + jvmArgumentProviders.add(RelativizingInternalPathProvider("java.io.tmpdir", temporaryDir)) } diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt index f143518d8a..4e185a21f9 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/AndroidPluginIntegration.kt @@ -63,9 +63,7 @@ object AndroidPluginIntegration { } fun getCompilationSourceSets(kotlinCompilation: KotlinJvmAndroidCompilation): List { - return kotlinCompilation.androidVariant - .sourceSets - .map { it.name } + return kotlinCompilation.androidVariant?.sourceSets?.map { it.name } ?: emptyList() } /** @@ -81,36 +79,33 @@ object AndroidPluginIntegration { val kaptProvider: TaskProvider? = project.locateTask(kotlinCompilation.compileTaskProvider.kaptTaskName) - val useLegacyApi = project.useLegacyVariantApi() - if (useLegacyApi) { - val sources = kotlinCompilation.androidVariant.getSourceFolders(SourceKind.JAVA) - kspTaskProvider.configure { task -> - // this is workaround for KAPT generator that prevents circular dependency - val filteredSources = Callable { - val destinationProperty = (kaptProvider?.get() as? KaptTask)?.destinationDir - val dir = destinationProperty?.get()?.asFile - sources.filter { dir?.isParentOf(it.dir) != true } - } - when (task) { - is KspTaskJvm -> { task.source(filteredSources) } - is KspAATask -> { task.kspConfig.javaSourceRoots.from(filteredSources) } - else -> Unit - } + val androidVariant = kotlinCompilation.androidVariant + if (androidVariant == null) { + throw RuntimeException( + "KSP is not compatible with Android Gradle Plugin's built-in Kotlin. " + + "Please disable by adding android.builtInKotlin=false to gradle.properties " + + "and apply kotlin(\"android\") plugin" + ) + } + val sources = androidVariant.getSourceFolders(SourceKind.JAVA) + + kspTaskProvider.configure { task -> + // this is workaround for KAPT generator that prevents circular dependency + val filteredSources = Callable { + val destinationProperty = (kaptProvider?.get() as? KaptTask)?.destinationDir + val dir = destinationProperty?.get()?.asFile + sources.filter { dir?.isParentOf(it.dir) != true } } - } else { - kspTaskProvider.configure { task -> - val sources = androidComponent?.sources?.java?.static - // this is workaround for KAPT generator that prevents circular dependency - val filteredSources = Callable { - val destinationProperty = (kaptProvider?.get() as? KaptTask)?.destinationDir - val dir = destinationProperty?.get()?.asFile - sources?.map { it.filter { dir?.isParentOf(it.asFile) != true } } + when (task) { + is KspTaskJvm -> { + task.source(filteredSources) } - when (task) { - is KspTaskJvm -> { task.source(filteredSources) } - is KspAATask -> { task.kspConfig.javaSourceRoots.from(filteredSources) } - else -> Unit + + is KspAATask -> { + task.kspConfig.javaSourceRoots.from(filteredSources) } + + else -> Unit } } } @@ -135,14 +130,14 @@ object AndroidPluginIntegration { classOutputDir: Provider, resourcesOutputDir: Provider, androidComponent: Component?, + useKsp2: Boolean, ) { - if (androidComponent != null && kspTaskProvider.isKspAATask() && - project.canUseAddGeneratedSourceDirectoriesApi() - ) { + if (androidComponent != null && useKsp2 && project.canUseAddGeneratedSourceDirectoriesApi()) { androidComponent.sources.java?.addGeneratedSourceDirectory( taskProvider = kspTaskProvider, wiredWith = { task -> (task as KspAATask).kspConfig.javaOutputDir } ) + androidComponent.sources.java?.addGeneratedSourceDirectory( taskProvider = kspTaskProvider, wiredWith = { task -> (task as KspAATask).kspConfig.kotlinOutputDir } @@ -180,18 +175,16 @@ object AndroidPluginIntegration { kspKotlinOutput.include("**/*.kt") kspClassOutput.include("**/*.class") - kotlinCompilation.androidVariant.addJavaSourceFoldersToModel(kspKotlinOutput.dir) - kotlinCompilation.androidVariant.registerExternalAptJavaOutput(kspJavaOutput) - kotlinCompilation.androidVariant.registerPostJavacGeneratedBytecode(resourcesOutput) + kotlinCompilation.androidVariant?.addJavaSourceFoldersToModel(kspKotlinOutput.dir) + kotlinCompilation.androidVariant?.registerExternalAptJavaOutput(kspJavaOutput) + kotlinCompilation.androidVariant?.registerPostJavacGeneratedBytecode(resourcesOutput) if (project.isAgpBuiltInKotlinUsed().not()) { // This API leads to circular dependency with AGP + Built in kotlin - kotlinCompilation.androidVariant.registerPreJavacGeneratedBytecode(kspClassOutput) + kotlinCompilation.androidVariant?.registerPreJavacGeneratedBytecode(kspClassOutput) } } } - fun TaskProvider<*>.isKspAATask(): Boolean = map { it is KspAATask }.getOrElse(false) - fun syncSourceSets( project: Project, kotlinCompilation: KotlinJvmAndroidCompilation, @@ -200,7 +193,8 @@ object AndroidPluginIntegration { kotlinOutputDir: Provider, classOutputDir: Provider, resourcesOutputDir: Provider, - androidComponent: Component? + androidComponent: Component?, + useKsp2: Boolean, ) { // Order is important here as we update task with AGP generated sources and // then update AGP with source that KSP will generate. @@ -215,7 +209,8 @@ object AndroidPluginIntegration { kotlinOutputDir, classOutputDir, resourcesOutputDir, - androidComponent + androidComponent, + useKsp2 ) } diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KotlinFactories.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KotlinFactories.kt index f89b01f3ac..513821aedc 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KotlinFactories.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KotlinFactories.kt @@ -38,7 +38,6 @@ import org.gradle.api.tasks.PathSensitivity import org.gradle.api.tasks.SkipWhenEmpty import org.gradle.api.tasks.TaskProvider import org.gradle.process.CommandLineArgumentProvider -import org.gradle.process.ExecOperations import org.gradle.work.Incremental import org.gradle.work.InputChanges import org.gradle.work.NormalizeLineEndings @@ -308,13 +307,11 @@ abstract class KspTaskNative @Inject internal constructor( compilation: KotlinCompilationInfo, objectFactory: ObjectFactory, providerFactory: ProviderFactory, - execOperations: ExecOperations ) : KotlinNativeCompile( compilation, objectFactory.newInstance(KotlinNativeCompilerOptionsDefault::class.java), objectFactory, providerFactory, - execOperations ), KspTask diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspAATask.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspAATask.kt index 2c59feb80e..12212f22e5 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspAATask.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspAATask.kt @@ -17,7 +17,6 @@ package com.google.devtools.ksp.gradle -import com.google.devtools.ksp.gradle.AndroidPluginIntegration.canUseAddGeneratedSourceDirectoriesApi import com.google.devtools.ksp.impl.KotlinSymbolProcessing import com.google.devtools.ksp.processing.ExitCode import com.google.devtools.ksp.processing.KSPCommonConfig @@ -207,13 +206,9 @@ abstract class KspAATask @Inject constructor( } cfg.sourceRoots.from(filtered) cfg.javaSourceRoots.from(filtered) - if (kotlinCompilation.platformType != KotlinPlatformType.androidJvm && - project.canUseAddGeneratedSourceDirectoriesApi() - ) { - kspAATask.dependsOn( - sourceSet.kotlin.nonSelfDeps(kspTaskName).filter { it.name !in filteredTasks } - ) - } + kspAATask.dependsOn( + sourceSet.kotlin.nonSelfDeps(kspTaskName).filter { it.name !in filteredTasks } + ) } if (kotlinCompilation is KotlinCommonCompilation) { cfg.commonSourceRoots.from(kotlinCompilation.defaultSourceSet.kotlin) diff --git a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt index d6d160d723..b2b3848d36 100644 --- a/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt +++ b/gradle-plugin/src/main/kotlin/com/google/devtools/ksp/gradle/KspSubplugin.kt @@ -680,6 +680,7 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool classOutputDir = classOutputDir, resourcesOutputDir = resourceOutputDir, androidComponent = component, + useKsp2 = useKSP2 ) } diff --git a/gradle.properties b/gradle.properties index a325573f99..19a0bb5e55 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ # Copied from kotlinc org.gradle.jvmargs=-Duser.country=US -Dkotlin.daemon.jvm.options=-Xmx4096m -Dfile.encoding=UTF-8 -kotlinBaseVersion=2.2.20-dev-5774 +kotlinBaseVersion=2.2.20 agpBaseVersion=8.13.0-rc01 intellijVersion=241.19416.19 junitVersion=4.13.1 diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP900IT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP900IT.kt index c8f99949d2..79ba9b45a7 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP900IT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AGP900IT.kt @@ -19,8 +19,10 @@ class AGP900IT(useKSP2: Boolean) { fun testRunsKSP() { val gradleRunner = GradleRunner.create().withProjectDir(project.root).withGradleVersion("9.0.0") - File(project.root, "gradle.properties").appendText("\nagpVersion=9.0.0-alpha03") + File(project.root, "gradle.properties").appendText("\nagpVersion=9.0.0-alpha05") File(project.root, "gradle.properties").appendText("\nandroid.builtInKotlin=false") + File(project.root, "gradle.properties").appendText("\nandroid.newDsl=false") + gradleRunner.withArguments(":workload:compileDebugKotlin").build().let { result -> Assert.assertEquals(TaskOutcome.SUCCESS, result.task(":workload:kspDebugKotlin")?.outcome) } diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt index 0350aa5a2b..65cc15c448 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidBuiltInKotlinIT.kt @@ -33,4 +33,23 @@ class AndroidBuiltInKotlinIT { assert("w: [ksp] [workload_release] Mangled name for internalFun: internalFun\$workload_release" in outputs) } } + + @Test + fun testPlaygroundAndroidWithBuiltInKotlinAGP90() { + val gradleRunner = GradleRunner.create().withProjectDir(project.root).withGradleVersion("9.0.0") + + File(project.root, "gradle.properties").appendText("\nagpVersion=9.0.0-alpha05") + + gradleRunner.withArguments( + "clean", "build", "minifyReleaseWithR8", "--configuration-cache", "--info", "--stacktrace" + ).buildAndFail().let { result -> + Assert.assertTrue( + result.output.contains( + "KSP is not compatible with Android Gradle Plugin's built-in Kotlin. " + + "Please disable by adding android.builtInKotlin=false to gradle.properties " + + "and apply kotlin(\"android\") plugin" + ) + ) + } + } } diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidDataBindingIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidDataBindingIT.kt new file mode 100644 index 0000000000..e0ba688b8b --- /dev/null +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidDataBindingIT.kt @@ -0,0 +1,42 @@ +package com.google.devtools.ksp.test + +import org.gradle.testkit.runner.GradleRunner +import org.junit.Assert +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized + +@RunWith(Parameterized::class) +class AndroidDataBindingIT(useKSP2: Boolean) { + @Rule + @JvmField + val project: TemporaryTestProject = TemporaryTestProject("android-data-binding", useKSP2 = useKSP2) + + @Test + fun testPlaygroundAndroid() { + val gradleRunner = GradleRunner.create().withProjectDir(project.root) + + // Disabling configuration cache. See https://github.com/google/ksp/issues/299 for details + gradleRunner.withArguments( + "clean", + ":app:assemble", + "--configuration-cache-problems=warn", + "--info", + "--stacktrace" + ) + .build().let { result -> + val output = result.output.lines() + val kspTask = output.filter { + it.contains(":app:kspDebugKotlin") + } + Assert.assertTrue(kspTask.isNotEmpty()) + } + } + + companion object { + @JvmStatic + @Parameterized.Parameters(name = "KSP2={0}") + fun params() = listOf(arrayOf(true), arrayOf(false)) + } +} diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidViewBindingIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidViewBindingIT.kt index 614456fc34..3159f215a7 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidViewBindingIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/AndroidViewBindingIT.kt @@ -11,7 +11,7 @@ import org.junit.runners.Parameterized class AndroidViewBindingIT(useKSP2: Boolean) { @Rule @JvmField - val project: TemporaryTestProject = TemporaryTestProject("android-view-binding", "playground", useKSP2) + val project: TemporaryTestProject = TemporaryTestProject("android-view-binding", useKSP2 = useKSP2) @Test fun testPlaygroundAndroid() { @@ -20,7 +20,7 @@ class AndroidViewBindingIT(useKSP2: Boolean) { // Disabling configuration cache. See https://github.com/google/ksp/issues/299 for details gradleRunner.withArguments( "clean", - ":app:testDebugUnitTest", + ":app:assemble", "--configuration-cache-problems=warn", "--info", "--stacktrace" diff --git a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSrcsIncIT.kt b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSrcsIncIT.kt index ba9559cc15..0bab5ba1c9 100644 --- a/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSrcsIncIT.kt +++ b/integration-tests/src/test/kotlin/com/google/devtools/ksp/test/GeneratedSrcsIncIT.kt @@ -19,19 +19,26 @@ class GeneratedSrcsIncIT(useKSP2: Boolean) { val gradleRunner = GradleRunner.create().withProjectDir(project.root) val expected = listOf( - "w: [ksp] 1: [File: Bar.kt, File: Baz.kt]", - "w: [ksp] 2: [File: Foo.kt]", + "w: [ksp] 1: [File: A.kt, File: Bar.kt, File: Baz.kt, File: MyJavaClass.java, File: MyKotlinClass.kt]", + "w: [ksp] 2: [File: Foo.kt, File: MyJavaClassBuilder.kt, File: MyKotlinClassBuilder.kt]", "w: [ksp] 3: [File: FooBar.kt, File: FooBaz.kt]" ) gradleRunner.withArguments("assemble").build().let { result -> - val outputs = result.output.lines().filter { it.startsWith("w: [ksp]") } + val outputs = result.output.lines().filter { it.startsWith("w: [ksp]") }.distinct() Assert.assertEquals(expected, outputs) } + + val expected2 = listOf( + "w: [ksp] 1: [File: Bar.kt, File: Baz.kt, File: MyJavaClass.java, File: MyKotlinClass.kt]", + "w: [ksp] 2: [File: Foo.kt, File: MyJavaClassBuilder.kt, File: MyKotlinClassBuilder.kt]", + "w: [ksp] 3: [File: FooBar.kt, File: FooBaz.kt]" + ) + File(project.root, "workload/src/main/kotlin/com/example/Baz.kt").appendText(System.lineSeparator()) gradleRunner.withArguments("assemble").build().let { result -> - val outputs = result.output.lines().filter { it.startsWith("w: [ksp]") } - Assert.assertEquals(expected, outputs) + val outputs = result.output.lines().filter { it.startsWith("w: [ksp]") }.distinct() + Assert.assertEquals(expected2, outputs) } } diff --git a/integration-tests/src/test/resources/android-data-binding/app/build.gradle.kts b/integration-tests/src/test/resources/android-data-binding/app/build.gradle.kts new file mode 100644 index 0000000000..de6868176e --- /dev/null +++ b/integration-tests/src/test/resources/android-data-binding/app/build.gradle.kts @@ -0,0 +1,52 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + id("com.android.application") + id("com.google.dagger.hilt.android") version "2.57.1" + id("com.google.devtools.ksp") + kotlin("android") +} + +dependencies { + implementation("androidx.activity:activity:1.11.0") + implementation("com.google.dagger:hilt-android:2.57.1") + ksp("com.google.dagger:hilt-compiler:2.57.1") +} + +android { + namespace = "com.example.databinding" + compileSdk = 36 + + defaultConfig { + applicationId = "com.example.databinding" + minSdk = 24 + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + } + + buildFeatures { + dataBinding = true + } + + dataBinding { + enable = true + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} + +kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_11 + } +} + +hilt { + enableAggregatingTask = false +} + + diff --git a/integration-tests/src/test/resources/android-data-binding/app/src/main/AndroidManifest.xml b/integration-tests/src/test/resources/android-data-binding/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..f10f89ecc5 --- /dev/null +++ b/integration-tests/src/test/resources/android-data-binding/app/src/main/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/integration-tests/src/test/resources/android-data-binding/app/src/main/kotlin/A.kt b/integration-tests/src/test/resources/android-data-binding/app/src/main/kotlin/A.kt new file mode 100644 index 0000000000..0abd30d1ff --- /dev/null +++ b/integration-tests/src/test/resources/android-data-binding/app/src/main/kotlin/A.kt @@ -0,0 +1,8 @@ +package com.example.databinding + +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton class A @Inject constructor() { + val string = "a" +} diff --git a/integration-tests/src/test/resources/android-data-binding/app/src/main/kotlin/App.kt b/integration-tests/src/test/resources/android-data-binding/app/src/main/kotlin/App.kt new file mode 100644 index 0000000000..bb89bea434 --- /dev/null +++ b/integration-tests/src/test/resources/android-data-binding/app/src/main/kotlin/App.kt @@ -0,0 +1,7 @@ +package com.example.databinding + +import android.app.Application +import dagger.hilt.android.HiltAndroidApp + +@HiltAndroidApp +class App : Application() diff --git a/integration-tests/src/test/resources/android-data-binding/app/src/main/kotlin/BindingActivity.kt b/integration-tests/src/test/resources/android-data-binding/app/src/main/kotlin/BindingActivity.kt new file mode 100644 index 0000000000..a2d69318f2 --- /dev/null +++ b/integration-tests/src/test/resources/android-data-binding/app/src/main/kotlin/BindingActivity.kt @@ -0,0 +1,20 @@ +package com.example.databinding + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.annotation.CallSuper +import androidx.annotation.LayoutRes +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding + +abstract class BindingActivity( + @get:LayoutRes private val layoutId: Int, +) : ComponentActivity() { + protected lateinit var binding: T + private set + + @CallSuper override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, layoutId) + } +} diff --git a/integration-tests/src/test/resources/android-data-binding/app/src/main/kotlin/MainActivity.kt b/integration-tests/src/test/resources/android-data-binding/app/src/main/kotlin/MainActivity.kt new file mode 100644 index 0000000000..4a89581a70 --- /dev/null +++ b/integration-tests/src/test/resources/android-data-binding/app/src/main/kotlin/MainActivity.kt @@ -0,0 +1,16 @@ +package com.example.databinding + +import android.os.Bundle +import com.example.databinding.databinding.ActivityMainBinding +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +@AndroidEntryPoint +class MainActivity : BindingActivity(R.layout.activity_main) { + @Inject lateinit var a: A + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding.a = a + } +} diff --git a/integration-tests/src/test/resources/android-data-binding/app/src/main/res/layout/activity_main.xml b/integration-tests/src/test/resources/android-data-binding/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000000..2b1157cd6a --- /dev/null +++ b/integration-tests/src/test/resources/android-data-binding/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + diff --git a/integration-tests/src/test/resources/android-data-binding/build.gradle.kts b/integration-tests/src/test/resources/android-data-binding/build.gradle.kts new file mode 100644 index 0000000000..46dc822881 --- /dev/null +++ b/integration-tests/src/test/resources/android-data-binding/build.gradle.kts @@ -0,0 +1,26 @@ +buildscript { + val testRepo: String by project + + repositories { + maven(testRepo) + mavenCentral() + maven("https://redirector.kotlinlang.org/maven/bootstrap/") + google() + } +} + +plugins { + id("com.android.application") apply false + kotlin("android") apply false + id("com.google.devtools.ksp") apply false +} + +allprojects { + val testRepo: String by project + repositories { + maven(testRepo) + mavenCentral() + maven("https://redirector.kotlinlang.org/maven/bootstrap/") + google() + } +} diff --git a/integration-tests/src/test/resources/android-data-binding/settings.gradle.kts b/integration-tests/src/test/resources/android-data-binding/settings.gradle.kts new file mode 100644 index 0000000000..fa66e55963 --- /dev/null +++ b/integration-tests/src/test/resources/android-data-binding/settings.gradle.kts @@ -0,0 +1,22 @@ +pluginManagement { + val kotlinVersion: String by settings + val kspVersion: String by settings + val testRepo: String by settings + val agpVersion: String by settings + plugins { + id("com.google.devtools.ksp") version kspVersion apply false + kotlin("jvm") version kotlinVersion apply false + kotlin("android") version kotlinVersion apply false + id("com.android.application") version agpVersion apply false + id("com.android.library") version agpVersion apply false + } + repositories { + maven(testRepo) + gradlePluginPortal() + google() + mavenCentral() + maven("https://redirector.kotlinlang.org/maven/bootstrap/") + } +} + +include(":app") diff --git a/integration-tests/src/test/resources/android-view-binding/app/build.gradle.kts b/integration-tests/src/test/resources/android-view-binding/app/build.gradle.kts index c3c6cd4f35..688dfc33ed 100644 --- a/integration-tests/src/test/resources/android-view-binding/app/build.gradle.kts +++ b/integration-tests/src/test/resources/android-view-binding/app/build.gradle.kts @@ -18,4 +18,7 @@ android { buildFeatures { viewBinding = true } + viewBinding { + enable = true + } } diff --git a/integration-tests/src/test/resources/android-view-binding/build.gradle.kts b/integration-tests/src/test/resources/android-view-binding/build.gradle.kts index 69149405bd..46dc822881 100644 --- a/integration-tests/src/test/resources/android-view-binding/build.gradle.kts +++ b/integration-tests/src/test/resources/android-view-binding/build.gradle.kts @@ -10,7 +10,6 @@ buildscript { } plugins { - kotlin("jvm") apply false id("com.android.application") apply false kotlin("android") apply false id("com.google.devtools.ksp") apply false diff --git a/integration-tests/src/test/resources/android-view-binding/processor/build.gradle.kts b/integration-tests/src/test/resources/android-view-binding/processor/build.gradle.kts deleted file mode 100644 index f46e458679..0000000000 --- a/integration-tests/src/test/resources/android-view-binding/processor/build.gradle.kts +++ /dev/null @@ -1,11 +0,0 @@ -val kspVersion: String by project - -plugins { - kotlin("jvm") -} -dependencies { - implementation("com.google.devtools.ksp:symbol-processing-api:$kspVersion") - implementation(files("/Users/alexgolubev/Projects/alex-ksp/gradle-plugin/build/kotlin/compileTestKotlin/classpath-snapshot")) - implementation(files("/Users/alexgolubev/Projects/alex-ksp/gradle-plugin/build/classes/kotlin/test")) - implementation(files("/Users/alexgolubev/Projects/alex-ksp/gradle-plugin/build/kotlin/compileTestKotlin/cacheable")) -} diff --git a/integration-tests/src/test/resources/android-view-binding/settings.gradle.kts b/integration-tests/src/test/resources/android-view-binding/settings.gradle.kts index 7ee188b4d1..fa66e55963 100644 --- a/integration-tests/src/test/resources/android-view-binding/settings.gradle.kts +++ b/integration-tests/src/test/resources/android-view-binding/settings.gradle.kts @@ -20,4 +20,3 @@ pluginManagement { } include(":app") -include(":processor") diff --git a/integration-tests/src/test/resources/playground-android/settings.gradle.kts b/integration-tests/src/test/resources/playground-android/settings.gradle.kts index 3ecdc0dde2..07915a765c 100644 --- a/integration-tests/src/test/resources/playground-android/settings.gradle.kts +++ b/integration-tests/src/test/resources/playground-android/settings.gradle.kts @@ -8,6 +8,7 @@ pluginManagement { kotlin("jvm") version kotlinVersion apply false kotlin("android") version kotlinVersion apply false id("com.android.application") version agpVersion apply false + id("app.cash.sqldelight") version "2.0.2" apply false } repositories { maven(testRepo) diff --git a/integration-tests/src/test/resources/playground-android/workload/build.gradle.kts b/integration-tests/src/test/resources/playground-android/workload/build.gradle.kts index 5eb45a17c5..d6aaf3b09d 100644 --- a/integration-tests/src/test/resources/playground-android/workload/build.gradle.kts +++ b/integration-tests/src/test/resources/playground-android/workload/build.gradle.kts @@ -5,6 +5,7 @@ plugins { id("com.google.devtools.ksp") id("com.android.application") kotlin("android") + id("app.cash.sqldelight") } version = "1.0-SNAPSHOT" diff --git a/integration-tests/src/test/resources/srcs-gen/build.gradle.kts b/integration-tests/src/test/resources/srcs-gen/build.gradle.kts new file mode 100644 index 0000000000..333c8553ab --- /dev/null +++ b/integration-tests/src/test/resources/srcs-gen/build.gradle.kts @@ -0,0 +1,26 @@ +buildscript { + val testRepo: String by project + + repositories { + maven(testRepo) + mavenCentral() + maven("https://redirector.kotlinlang.org/maven/bootstrap/") + google() + } +} + +plugins { + kotlin("android") apply false + id("com.google.devtools.ksp") apply false + id("com.android.library") apply false +} + +allprojects { + val testRepo: String by project + repositories { + maven(testRepo) + mavenCentral() + maven("https://redirector.kotlinlang.org/maven/bootstrap/") + google() + } +} diff --git a/integration-tests/src/test/resources/srcs-gen/settings.gradle.kts b/integration-tests/src/test/resources/srcs-gen/settings.gradle.kts new file mode 100644 index 0000000000..db9ecc5bda --- /dev/null +++ b/integration-tests/src/test/resources/srcs-gen/settings.gradle.kts @@ -0,0 +1,24 @@ +pluginManagement { + val kotlinVersion: String by settings + val kspVersion: String by settings + val testRepo: String by settings + val agpVersion: String by settings + plugins { + id("com.google.devtools.ksp") version kspVersion apply false + kotlin("jvm") version kotlinVersion apply false + kotlin("android") version kotlinVersion apply false + id("com.android.library") version agpVersion apply false + } + repositories { + maven(testRepo) + gradlePluginPortal() + google() + mavenCentral() + maven("https://redirector.kotlinlang.org/maven/bootstrap/") + } +} + +rootProject.name = "playground" + +include(":workload") +include(":test-processor") diff --git a/integration-tests/src/test/resources/srcs-gen/test-processor/src/main/kotlin/Builder.kt b/integration-tests/src/test/resources/srcs-gen/test-processor/src/main/kotlin/Builder.kt new file mode 100644 index 0000000000..9434b3627d --- /dev/null +++ b/integration-tests/src/test/resources/srcs-gen/test-processor/src/main/kotlin/Builder.kt @@ -0,0 +1,3 @@ +package com.example.annotation + +annotation class Builder diff --git a/integration-tests/src/test/resources/srcs-gen/test-processor/src/main/kotlin/BuilderProcessor.kt b/integration-tests/src/test/resources/srcs-gen/test-processor/src/main/kotlin/BuilderProcessor.kt new file mode 100644 index 0000000000..6ee5158483 --- /dev/null +++ b/integration-tests/src/test/resources/srcs-gen/test-processor/src/main/kotlin/BuilderProcessor.kt @@ -0,0 +1,102 @@ +import com.google.devtools.ksp.getConstructors +import com.google.devtools.ksp.containingFile +import com.google.devtools.ksp.processing.* +import com.google.devtools.ksp.symbol.* +import com.google.devtools.ksp.validate +import java.io.OutputStream + +fun OutputStream.appendText(str: String) { + this.write(str.toByteArray()) +} + +class BuilderProcessor : SymbolProcessor { + lateinit var codeGenerator: CodeGenerator + lateinit var logger: KSPLogger + + fun init( + options: Map, + kotlinVersion: KotlinVersion, + codeGenerator: CodeGenerator, + logger: KSPLogger, + ) { + this.codeGenerator = codeGenerator + this.logger = logger + } + + override fun process(resolver: Resolver): List { + val symbols = resolver.getSymbolsWithAnnotation("com.example.annotation.Builder") + val ret = symbols.filter { !it.validate() } + symbols + .filter { it.validate() } + .forEach { it.accept(BuilderVisitor(), Unit) } + return ret.toList() + } + + inner class BuilderVisitor : KSVisitorVoid() { + override fun visitClassDeclaration(classDeclaration: KSClassDeclaration, data: Unit) { + val constructor = classDeclaration.primaryConstructor + ?: classDeclaration.getConstructors().maxByOrNull { it.parameters.size } + + if (constructor == null) { + logger.error("No suitable constructor found for ${classDeclaration.qualifiedName?.asString()}", classDeclaration) + return + } + + constructor.accept(this, data) + } + + override fun visitFunctionDeclaration(function: KSFunctionDeclaration, data: Unit) { + val parent = function.parentDeclaration as KSClassDeclaration + val packageName = parent.containingFile!!.packageName.asString() + val className = "${parent.simpleName.asString()}Builder" + + val file = codeGenerator.createNewFile( + Dependencies(true, function.containingFile!!), packageName, className + ) + file.appendText("package $packageName\n\n") + file.appendText("class $className{\n") + function.parameters.forEach { + val name = it.name!!.asString() + val typeName = StringBuilder(it.type.resolve().declaration.qualifiedName?.asString() ?: "") + val typeArgs = it.type.element!!.typeArguments + if (it.type.element!!.typeArguments.toList().isNotEmpty()) { + typeName.append("<") + typeName.append( + typeArgs.map { + val type = it.type?.resolve() + "${it.variance.label} ${type?.declaration?.qualifiedName?.asString() ?: "ERROR"}" + + if (type?.nullability == Nullability.NULLABLE) "?" else "" + }.joinToString(", ") + ) + typeName.append(">") + } + file.appendText(" private var $name: $typeName? = null\n") + file.appendText(" internal fun with${name.capitalize()}($name: $typeName): $className {\n") + file.appendText(" this.$name = $name\n") + file.appendText(" return this\n") + file.appendText(" }\n\n") + } + file.appendText(" internal fun build(): ${parent.qualifiedName!!.asString()} {\n") + file.appendText(" return ${parent.qualifiedName!!.asString()}(") + file.appendText( + function.parameters.map { + "${it.name!!.asString()}!!" + }.joinToString(", ") + ) + file.appendText(")\n") + file.appendText(" }\n") + file.appendText("}\n") + file.close() + } + } +} + +class TestProcessorProvider2 : SymbolProcessorProvider { + override fun create( + env: SymbolProcessorEnvironment, + ): SymbolProcessor { + return BuilderProcessor().apply { + init(env.options, env.kotlinVersion, env.codeGenerator, env.logger) + } + } +} diff --git a/integration-tests/src/test/resources/srcs-gen/test-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider b/integration-tests/src/test/resources/srcs-gen/test-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider new file mode 100644 index 0000000000..3a1528c96c --- /dev/null +++ b/integration-tests/src/test/resources/srcs-gen/test-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider @@ -0,0 +1,2 @@ +TestProcessorProvider +TestProcessorProvider2 diff --git a/integration-tests/src/test/resources/srcs-gen/workload/build.gradle.kts b/integration-tests/src/test/resources/srcs-gen/workload/build.gradle.kts new file mode 100644 index 0000000000..09b9056158 --- /dev/null +++ b/integration-tests/src/test/resources/srcs-gen/workload/build.gradle.kts @@ -0,0 +1,129 @@ +val testRepo: String by project + +plugins { + // DO NOT CHANGE THE ORDER. + id("com.google.devtools.ksp") + id("com.android.library") + kotlin("android") +} + +version = "1.0-SNAPSHOT" + +repositories { + maven(testRepo) + mavenCentral() + maven("https://redirector.kotlinlang.org/maven/bootstrap/") +} + +dependencies { + implementation(kotlin("stdlib")) + implementation(project(":test-processor")) + ksp(project(":test-processor")) +} + +android { + namespace = "com.example.mylibrary" + compileSdk = 34 + defaultConfig { + minSdk = 34 + } + lint { + targetSdk = 34 + } + + testOptions { + targetSdk = 34 + } +} + +ksp { + arg("option1", "value1") + arg("option2", "value2") +} + +androidComponents.onVariants { variant -> + val kotlinGenTaskProvider = project.tasks.register( + "generate${variant.name}KotlinSources", + KotlinSourceGeneratingTask::class.java + ) + + kotlinGenTaskProvider.configure { + this.packageName.set("com.kotlingen") + this.sourceFiles.set( + variant.sources.kotlin!!.static + ) + } + variant.sources.java!!.addGeneratedSourceDirectory( + kotlinGenTaskProvider, KotlinSourceGeneratingTask::outputDir + ) + + + val javaGenTaskProvider = project.tasks.register( + "generate${variant.name}JavaSources", + JavaSourceGeneratingTask::class.java + ) + javaGenTaskProvider.configure { + this.packageName.set("com.javagen") + this.sourceFiles.set( + variant.sources.java!!.static + ) + } + variant.sources.java!!.addGeneratedSourceDirectory( + javaGenTaskProvider, JavaSourceGeneratingTask::outputDir + ) +} + +abstract class KotlinSourceGeneratingTask: DefaultTask() { + @get:Input + abstract val packageName: Property + @get:OutputDirectory + abstract val outputDir: DirectoryProperty + @get:InputFiles + abstract val sourceFiles: ListProperty + @TaskAction + fun generate() { + val outputFolder = File(outputDir.get().asFile, packageName.get().replace('.', File.separatorChar)) + outputFolder.mkdirs() + File(outputFolder, "MyKotlinClass.kt").writeText( + """ + package ${packageName.get()} + import com.example.annotation.Builder + + @Builder + class MyKotlinClass { + fun someFunctionUsingGeneratedAPIs() { + System.err.println("Hello world !") + } + } + """.trimIndent() + ) + } +} + +abstract class JavaSourceGeneratingTask: DefaultTask() { + @get:Input + abstract val packageName: Property + @get:OutputDirectory + abstract val outputDir: DirectoryProperty + @get:InputFiles + abstract val sourceFiles: ListProperty + @TaskAction + fun generate() { + val outputFolder = File(outputDir.get().asFile, packageName.get().replace('.', File.separatorChar)) + outputFolder.mkdirs() + File(outputFolder, "MyJavaClass.java").writeText( + """ + package ${packageName.get()}; + import com.example.annotation.Builder; + + @Builder + public class MyJavaClass { + public static void someFunctionUsingGeneratedAPIs() { + System.err.println("Hello world !"); + } + } + """.trimIndent() + ) + } +} + diff --git a/integration-tests/src/test/resources/srcs-gen/workload/src/main/kotlin/com/example/A.kt b/integration-tests/src/test/resources/srcs-gen/workload/src/main/kotlin/com/example/A.kt new file mode 100644 index 0000000000..38beb9fba3 --- /dev/null +++ b/integration-tests/src/test/resources/srcs-gen/workload/src/main/kotlin/com/example/A.kt @@ -0,0 +1,14 @@ +package com.example + +import com.kotlingen.MyKotlinClassBuilder +import com.javagen.MyJavaClassBuilder + +fun main() { + val builder = MyKotlinClassBuilder() + val kotlinClass = builder.build() + println(kotlinClass) + + val builder2 = MyJavaClassBuilder() + val javaClass = builder.build() + println(javaClass) +} diff --git a/kotlin-analysis-api/build.gradle.kts b/kotlin-analysis-api/build.gradle.kts index ef96758b61..a9ac1607ae 100644 --- a/kotlin-analysis-api/build.gradle.kts +++ b/kotlin-analysis-api/build.gradle.kts @@ -1,4 +1,5 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import com.google.devtools.ksp.RelativizingInternalPathProvider import com.google.devtools.ksp.RelativizingPathProvider import java.io.ByteArrayOutputStream @@ -318,5 +319,5 @@ tasks.test { .asFile .apply { if (!exists()) mkdirs() } jvmArgumentProviders.add(RelativizingPathProvider("idea.home.path", ideaHomeDir)) - jvmArgumentProviders.add(RelativizingPathProvider("java.io.tmpdir", temporaryDir)) + jvmArgumentProviders.add(RelativizingInternalPathProvider("java.io.tmpdir", temporaryDir)) } diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt index fab86cbd1d..933f385e00 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt @@ -60,6 +60,7 @@ import com.intellij.util.ui.EDT import org.jetbrains.kotlin.analysis.api.KaExperimentalApi import org.jetbrains.kotlin.analysis.api.KaIdeApi import org.jetbrains.kotlin.analysis.api.KaImplementationDetail +import org.jetbrains.kotlin.analysis.api.fir.utils.KaFirCacheCleaner import org.jetbrains.kotlin.analysis.api.platform.KotlinMessageBusProvider import org.jetbrains.kotlin.analysis.api.platform.KotlinPlatformSettings import org.jetbrains.kotlin.analysis.api.platform.KotlinProjectMessageBusProvider @@ -357,6 +358,9 @@ class KotlinSymbolProcessing( KotlinPlatformSettings::class.java, KotlinStandalonePlatformSettings() ) + // replace KaFirStopWorldCacheCleaner with no op implementation + @OptIn(KaImplementationDetail::class) + registerService(KaFirCacheCleaner::class.java, NoOpCacheCleaner::class.java) } } @@ -684,3 +688,16 @@ private fun maybeRunInWriteAction(f: () -> R) { } } } + +/* +* NoOp implementation of the KaFirCacheCleaner +* +* The stop world cache cleaner that is registered by default [KaFirStopWorldCacheCleaner] can +* get analysis session into an invalid state which leads to build failures. +*/ +@OptIn(KaImplementationDetail::class) +class NoOpCacheCleaner : KaFirCacheCleaner { + override fun enterAnalysis() {} + override fun exitAnalysis() {} + override fun scheduleCleanup() {} +} diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ResolverAAImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ResolverAAImpl.kt index fdac145a0d..0708abfa1e 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ResolverAAImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ResolverAAImpl.kt @@ -412,7 +412,8 @@ class ResolverAAImpl( override fun getJvmCheckedException(function: KSFunctionDeclaration): Sequence { return when (function.origin) { Origin.JAVA -> { - val psi = (function as KSFunctionDeclarationImpl).ktFunctionSymbol.psi as PsiMethod + val psi = ((function as KSFunctionDeclarationImpl).ktFunctionSymbol.psi as? PsiMethod) + ?: return emptySequence() psi.throwsList.referencedTypes.asSequence().mapNotNull { analyze { it.asKaType(psi)?.let { KSTypeImpl.getCached(it) } diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt index 15da9a7dfe..b9c04819e7 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt @@ -112,7 +112,8 @@ class KSAnnotationJavaImpl private constructor(private val psi: PsiAnnotation, o ?.let { symbol -> // ClsClassImpl means psi is decompiled psi. if ( - symbol.origin == KaSymbolOrigin.JAVA_SOURCE && symbol.psi != null && symbol.psi !is ClsClassImpl + symbol.origin == KaSymbolOrigin.JAVA_SOURCE && symbol.psi != null && + symbol.psi !is ClsClassImpl && symbol.psi is PsiClass ) { (symbol.psi as PsiClass).allMethods.filterIsInstance() .mapNotNull { annoMethod -> diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/AbstractKSDeclarationImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/AbstractKSDeclarationImpl.kt index 527fadaaeb..ecb3a6f2ed 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/AbstractKSDeclarationImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/AbstractKSDeclarationImpl.kt @@ -125,7 +125,10 @@ abstract class AbstractKSDeclarationImpl(val ktDeclarationSymbol: KaDeclarationS internal open val originalAnnotations: Sequence by lazyMemoizedSequence { if (ktDeclarationSymbol.psi is KtAnnotated) { (ktDeclarationSymbol.psi as KtAnnotated).annotations(ktDeclarationSymbol, this) - } else if (ktDeclarationSymbol.origin == KaSymbolOrigin.JAVA_SOURCE && ktDeclarationSymbol.psi != null) { + } else if ( + ktDeclarationSymbol.origin == KaSymbolOrigin.JAVA_SOURCE && + ktDeclarationSymbol.psi is PsiJvmModifiersOwner + ) { (ktDeclarationSymbol.psi as PsiJvmModifiersOwner) .annotations.map { KSAnnotationJavaImpl.getCached(it, this) }.asSequence() } else { diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt index 359cfa2106..748c1425e7 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt @@ -81,7 +81,10 @@ class KSAnnotationImpl private constructor( override val defaultArguments: List by lazy { analyze { annotationApplication.classId?.toKtClassSymbol()?.let { symbol -> - if (symbol.origin == KaSymbolOrigin.JAVA_SOURCE && symbol.psi != null && symbol.psi !is ClsClassImpl) { + if ( + symbol.origin == KaSymbolOrigin.JAVA_SOURCE && symbol.psi != null && + symbol.psi !is ClsClassImpl && symbol.psi is PsiClass + ) { (symbol.psi as PsiClass).allMethods.filterIsInstance() .mapNotNull { annoMethod -> annoMethod.defaultValue?.let { value -> diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt index 722aa6a301..f7c475d399 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt @@ -78,7 +78,10 @@ class KSAnnotationResolvedImpl private constructor( override val defaultArguments: List by lazy { analyze { annotationApplication.classId?.toKtClassSymbol()?.let { symbol -> - if (symbol.origin == KaSymbolOrigin.JAVA_SOURCE && symbol.psi != null && symbol.psi !is ClsClassImpl) { + if ( + symbol.origin == KaSymbolOrigin.JAVA_SOURCE && symbol.psi != null && + symbol.psi !is ClsClassImpl && symbol.psi is PsiClass + ) { (symbol.psi as PsiClass).allMethods.filterIsInstance() .mapNotNull { annoMethod -> annoMethod.defaultValue?.let { value -> diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt index 519ed68552..1eab9f0b24 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt @@ -98,15 +98,7 @@ internal fun mapAAOrigin(ktSymbol: KaSymbol): Origin { return if (symbolOrigin == Origin.JAVA && ktSymbol.psi?.containingFile?.fileType?.isBinary == true) { Origin.JAVA_LIB } else { - if (ktSymbol.psi == null) { - if (analyze { ktSymbol.containingModule is KaLibraryModule }) { - Origin.KOTLIN_LIB - } else { - Origin.SYNTHETIC - } - } else { - symbolOrigin - } + symbolOrigin } } diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/util/BinaryUtils.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/util/BinaryUtils.kt index 8bea012752..8659a8541c 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/util/BinaryUtils.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/util/BinaryUtils.kt @@ -40,6 +40,8 @@ import org.jetbrains.org.objectweb.asm.ClassVisitor import org.jetbrains.org.objectweb.asm.FieldVisitor import org.jetbrains.org.objectweb.asm.MethodVisitor import org.jetbrains.org.objectweb.asm.Opcodes +import java.nio.ByteBuffer +import java.nio.ByteOrder import java.util.IdentityHashMap data class BinaryClassInfo( @@ -96,11 +98,25 @@ fun KSAnnotated.hasAnnotation(fqn: String): Boolean = it.annotationType.resolve().declaration.qualifiedName?.asString() == fqn } +// Validate classfile formate. May throw. +private fun validateClassfileFormat(content: ByteArray) { + if (content.size < 4) { + throw IllegalArgumentException("Invalid bytecode format") + } + val magic = ByteBuffer.wrap(content, 0, 4) + .order(ByteOrder.BIG_ENDIAN).int + if (magic != 0xCAFEBABE.toInt()) { + throw IllegalArgumentException("Invalid bytecode format: $magic") + } +} + fun Resolver.extractThrowsFromClassFile( virtualFileContent: ByteArray, jvmDesc: String?, simpleName: String? ): Sequence { + validateClassfileFormat(virtualFileContent) + val exceptionNames = mutableListOf() ClassReader(virtualFileContent).accept( object : ClassVisitor(Opcodes.API_VERSION) { diff --git a/kotlin-analysis-api/testData/libOrigins.kt b/kotlin-analysis-api/testData/libOrigins.kt index 26e7e933d6..901d9b0eef 100644 --- a/kotlin-analysis-api/testData/libOrigins.kt +++ b/kotlin-analysis-api/testData/libOrigins.kt @@ -22,12 +22,22 @@ // Validating Anno3 // Validating Anno4 // Validating Anno5 +// Validating Foo +// Validating FooProvider2 // Validating JavaLib // Validating KotlinLibClass // Exception: [KotlinLibClass, T1, Any?]: SYNTHETIC // Exception: [KotlinLibClass, T1, Any?]: SYNTHETIC // Validating kotlinLibFuntion // Validating kotlinLibProperty +// Validating File: App.java +// Exception: [File: App.java, App, foo, getFoo, Foo]: SYNTHETIC +// Exception: [File: App.java, App, foo, getFoo]: SYNTHETIC +// Validating File: FooProvider1.kt +// Exception: [File: FooProvider1.kt, FooProvider1, Any]: SYNTHETIC +// Exception: [File: FooProvider1.kt, FooProvider1, foo, foo.getter(), Foo, Foo]: SYNTHETIC +// Exception: [File: FooProvider1.kt, FooProvider1, foo, foo.getter(), Foo]: SYNTHETIC +// Exception: [File: FooProvider1.kt, FooProvider1, foo, foo.getter()]: SYNTHETIC // Validating File: JavaSrc.java // Exception: [File: JavaSrc.java, JavaSrc, synthetic constructor for JavaSrc, JavaSrc]: SYNTHETIC // Exception: [File: JavaSrc.java, JavaSrc, synthetic constructor for JavaSrc]: SYNTHETIC @@ -89,6 +99,15 @@ class JavaLib { } } +// FILE: FooProvider2.kt +package foo.bar + +interface Foo + +interface FooProvider2 { + fun getFoo(): Foo +} + // MODULE: main(module1) // FILE: KotlinSrc.kt package foo.bar @@ -103,6 +122,13 @@ class KotlinSrcClass(val q1: Set, val q2: Short) { fun g3(q6: Set): Short = 0 } +// FILE: FooProvider1.kt +package foo.bar + +interface FooProvider1 { + val foo: Foo +} + // FILE: JavaSrc.java package foo.bar; @@ -123,3 +149,8 @@ public @interface JavaAnno1 { @Anno5(p1 = 1, p2 = "a2") String value (); } + +// FILE: App.java +package foo.bar; +import foo.bar.FooProvider2; +interface App extends FooProvider1, FooProvider2 {}