Skip to content

Commit e18abd3

Browse files
Give a compile time error when defining an anonymous mappie object (#238)
* 237 give a more specific error when defining an anonymous mappie object * 237 Added changelog
1 parent 74cc36d commit e18abd3

File tree

5 files changed

+79
-0
lines changed

5 files changed

+79
-0
lines changed

compiler-plugin/src/main/kotlin/tech/mappie/fir/MappieAdditionalCheckersExtension.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package tech.mappie.fir
22

33
import org.jetbrains.kotlin.fir.FirSession
4+
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers
5+
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirAnonymousObjectChecker
46
import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers
57
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirFunctionCallChecker
68
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
@@ -21,4 +23,10 @@ class MappieAdditionalCheckersExtension(session: FirSession) : FirAdditionalChec
2123
ToCallChecker(),
2224
)
2325
}
26+
27+
override val declarationCheckers: DeclarationCheckers = object : DeclarationCheckers() {
28+
override val anonymousObjectCheckers: Set<FirAnonymousObjectChecker> = setOf(
29+
AnonymousMappieObjectChecker()
30+
)
31+
}
2432
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package tech.mappie.fir.analysis
2+
3+
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
4+
import org.jetbrains.kotlin.diagnostics.SourceElementPositioningStrategies.WHOLE_ELEMENT
5+
import org.jetbrains.kotlin.diagnostics.error1
6+
import org.jetbrains.kotlin.diagnostics.reportOn
7+
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
8+
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
9+
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirAnonymousObjectChecker
10+
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
11+
import org.jetbrains.kotlin.psi.KtElement
12+
import tech.mappie.fir.util.isSubclassOfAnMappie
13+
14+
class AnonymousMappieObjectChecker : FirAnonymousObjectChecker(MppCheckerKind.Common) {
15+
16+
context(context: CheckerContext, reporter: DiagnosticReporter)
17+
override fun check(declaration: FirAnonymousObject) {
18+
if (declaration.symbol.isSubclassOfAnMappie()) {
19+
reporter.reportOn(declaration.source, INVALID_ANONYMOUS_OBJECT, INVALID_ANONYMOUS_OBJECT_MESSAGE)
20+
}
21+
}
22+
23+
companion object {
24+
private val INVALID_ANONYMOUS_OBJECT by error1<KtElement, String>(WHOLE_ELEMENT)
25+
private const val INVALID_ANONYMOUS_OBJECT_MESSAGE = "Anonymous Mappie objects are not supported"
26+
}
27+
}

compiler-plugin/src/main/kotlin/tech/mappie/fir/util/Util.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ context(context: CheckerContext)
4646
internal fun FirClassSymbol<*>.isSubclassOfAnObjectMappie() =
4747
isSubclassOfObjectMappie() || isSubclassOfObjectMappie2() || isSubclassOfObjectMappie3() || isSubclassOfObjectMappie4() || isSubclassOfObjectMappie5()
4848

49+
context(context: CheckerContext)
50+
internal fun FirClassSymbol<*>.isSubclassOfAnMappie() =
51+
isSubclassOfAnObjectMappie() || isSubclassOfEnumMappie()
52+
53+
4954
@OptIn(SymbolInternals::class)
5055
context (context: CheckerContext)
5156
fun FirExpression.toConstant(): FirLiteralExpression? =
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package tech.mappie.testing
2+
3+
import org.junit.jupiter.api.Test
4+
import org.junit.jupiter.api.io.TempDir
5+
import tech.mappie.testing.compilation.compile
6+
7+
import java.io.File
8+
9+
class AnonymousMappieObjectTest {
10+
11+
data class Input(val text: String)
12+
data class Output(val text: String)
13+
14+
@TempDir
15+
lateinit var directory: File
16+
17+
@Test
18+
fun `anonymous mappie object should fail`() {
19+
compile(directory) {
20+
file("Test.kt",
21+
"""
22+
import tech.mappie.api.ObjectMappie
23+
import tech.mappie.testing.AnonymousMappieObjectTest.*
24+
25+
fun test() {
26+
val x = object : ObjectMappie<Int, String>() { }
27+
}
28+
"""
29+
)
30+
} satisfies {
31+
isCompilationError()
32+
hasErrorMessage(5, "Anonymous Mappie objects are not supported")
33+
}
34+
}
35+
}

website/src/changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
title: "Changelog"
33
layout: "layouts/changelog.html"
44
changelog:
5+
- date: "tbd"
6+
title: "v2.2.0-1.5.0"
7+
items:
8+
- "[#237](https://github.com/Mr-Mappie/mappie/issues/237) Added compile time error when defining anonymous mappie objects."
59
- date: "2025-08-11"
610
title: "v2.2.0-1.4-1"
711
items:

0 commit comments

Comments
 (0)