Skip to content

Commit ac0f533

Browse files
authored
Rewrite NoComposableFileChecker logic (#205)
* Cleanup * Rewrite NoComposableFileChecker logics
1 parent 153b201 commit ac0f533

File tree

3 files changed

+35
-24
lines changed

3 files changed

+35
-24
lines changed

compiler/src/main/kotlin/land/sungbin/composeinvestigator/compiler/frontend/InvalidationTraceTableInstantiationValidator.kt

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,29 @@
77

88
package land.sungbin.composeinvestigator.compiler.frontend
99

10-
import androidx.compose.compiler.plugins.kotlin.k2.ComposableFunction
1110
import androidx.compose.compiler.plugins.kotlin.k2.hasComposableAnnotation
11+
import androidx.compose.compiler.plugins.kotlin.lower.fastForEach
1212
import land.sungbin.composeinvestigator.compiler.NO_INVESTIGATION_FQN
1313
import land.sungbin.composeinvestigator.compiler.lower.unsafeLazy
1414
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
1515
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
16+
import org.jetbrains.kotlin.fir.FirElement
1617
import org.jetbrains.kotlin.fir.FirSession
1718
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
1819
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
1920
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers
2021
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirFileChecker
2122
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
2223
import org.jetbrains.kotlin.fir.declarations.FirFile
23-
import org.jetbrains.kotlin.fir.declarations.FirFunction
2424
import org.jetbrains.kotlin.fir.declarations.validate
25+
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
2526
import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotation
2627
import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyAnnotationArgumentMapping
28+
import org.jetbrains.kotlin.fir.references.toResolvedFunctionSymbol
2729
import org.jetbrains.kotlin.fir.smartPlus
2830
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
29-
import org.jetbrains.kotlin.fir.types.coneType
3031
import org.jetbrains.kotlin.fir.types.constructClassLikeType
31-
import org.jetbrains.kotlin.fir.types.functionTypeKind
32+
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid
3233
import org.jetbrains.kotlin.name.ClassId
3334

3435
public class InvalidationTraceTableInstantiationValidator(session: FirSession) : FirAdditionalCheckersExtension(session) {
@@ -45,27 +46,38 @@ private object NoComposableFileChecker : FirFileChecker(MppCheckerKind.Common) {
4546
}
4647

4748
override fun check(declaration: FirFile, context: CheckerContext, reporter: DiagnosticReporter) {
48-
if (
49-
declaration.declarations.none { element ->
50-
element.hasComposableAnnotation(context.session) ||
51-
(
52-
element is FirFunction &&
53-
element.valueParameters.any { parameter ->
54-
parameter.returnTypeRef.coneType.functionTypeKind(context.session) === ComposableFunction
55-
}
56-
)
49+
var hasComposable = false
50+
51+
val composableCallVisitor = object : FirDefaultVisitorVoid() {
52+
override fun visitElement(element: FirElement) {
53+
if (hasComposable) return
54+
element.acceptChildren(this)
5755
}
58-
) {
59-
val noInvestigationAnnotation = buildAnnotation {
60-
useSiteTarget = AnnotationUseSiteTarget.FILE
61-
annotationTypeRef = noInvestigationType
62-
argumentMapping = FirEmptyAnnotationArgumentMapping
56+
57+
override fun visitFunctionCall(functionCall: FirFunctionCall) {
58+
if (functionCall.calleeReference.toResolvedFunctionSymbol()!!.hasComposableAnnotation(context.session))
59+
hasComposable = true
60+
61+
if (hasComposable) return
62+
super.visitFunctionCall(functionCall)
6363
}
64+
}
6465

65-
declaration.replaceAnnotations(declaration.annotations.smartPlus(listOf(noInvestigationAnnotation)))
66+
declaration.declarations.fastForEach { element ->
67+
element.acceptChildren(composableCallVisitor)
68+
}
69+
70+
if (hasComposable) return
6671

67-
// Validate that the new annotations do not break the file.
68-
declaration.validate()
72+
val noInvestigationAnnotation = buildAnnotation {
73+
useSiteTarget = AnnotationUseSiteTarget.FILE
74+
annotationTypeRef = noInvestigationType
75+
argumentMapping = FirEmptyAnnotationArgumentMapping
6976
}
77+
78+
declaration.replaceAnnotations(declaration.annotations.smartPlus(listOf(noInvestigationAnnotation)))
79+
80+
// Validate that the new annotations do not break the file.
81+
declaration.validate()
7082
}
7183
}

runtime/src/main/kotlin/land/sungbin/composeinvestigator/runtime/ComposableInvalidationTraceTable.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,8 @@ public class ComposableInvalidationTraceTable @ComposeInvestigatorCompilerApi pu
9898
* [Compose compiler's implementation](https://github.com/JetBrains/kotlin/blob/ede0373c4e5c0506b1491c6eb4c8bc0660ef7d21/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/DurableKeyTransformer.kt#L74)
9999
* of the AOSP.
100100
*/
101-
@property:ComposableScope
102101
public val currentComposableKeyName: String
103-
@[Stable JvmSynthetic] get() = throw IntrinsicImplementedError()
102+
@[Stable ComposableScope JvmSynthetic] get() = throw IntrinsicImplementedError()
104103

105104
/**
106105
* Returns all arguments that were affected by the value change. This is useful for debugging and

runtime/src/main/kotlin/land/sungbin/composeinvestigator/runtime/ComposableScope.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ package land.sungbin.composeinvestigator.runtime
1010
/** APIs annotated with this should only be used within Composable functions. */
1111
@MustBeDocumented
1212
@Retention(AnnotationRetention.SOURCE)
13-
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY)
13+
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.PROPERTY_GETTER)
1414
public annotation class ComposableScope

0 commit comments

Comments
 (0)