compilation
Validates compilation of generated Fakt fakes and diagnoses build failures — where fakes are generated, which path produced them, error classification, and root cause analysis. Use when compilation fa
SKILL.md.claude/skills/compilation/SKILL.md
GitHubCompilation Validator & Error Analyzer
Validates that generated fakes compile and diagnoses failures when they don't.
Instructions
1. Publish the Plugin First
Samples consume the plugin from Maven Local, so a stale publish is the most common cause of "my change had no effect":
make publish-local
2. Build and Capture Output
Samples are separate Gradle builds, not subprojects of the root build:
./gradlew -p samples/jvm-single-module build 2>&1 | tee compilation.log
./gradlew -p samples/android-single-module build 2>&1 | tee -a compilation.log
./gradlew -p samples/kmp-single-module compileKotlinJvm --no-build-cache 2>&1 | tee -a compilation.log
./gradlew -p samples/kmp-multi-module build 2>&1 | tee -a compilation.log
make test-sample runs the KMP single-module sample end to end.
3. Know Which Path Generated the Fakes
- Default (cache-correct):
faktGenerate<Target><Compilation>tasks (FaktGenerateTask) run an embedded K2 compiler in a Gradle worker; FIR checkers emit the fakes (compiler/.../fir/generation/). - Legacy in-process: compilations the task can't drive (
LEGACY), or any build with-Pfakt.useExperimentalGenerateTask=false. Generation runs insidecompileKotlin*viaUnifiedFaktIrGenerationExtension.
Routing lives in FaktGradleSubplugin.kt (CacheCorrectDecision). If a failure only reproduces on one path, compare with the other by toggling the property above.
4. Validate Generated Files
Generated sources land in each sample's own build directory:
find samples/<name>/build/generated/fakt -name "Fake*.kt"
Per @Fake type, expect FakeXxxImpl, the fakeXxx {} factory, and FakeXxxConfig.
If nothing was generated, check:
- The plugin is applied and
fakt { enabled }isn't set tofalse - The type is annotated with
@Fakein a main source set (main/commonMain) - The
faktGenerate*task ran:./gradlew -p samples/<name> tasks --all | grep faktGenerate - Logs: set
fakt { logLevel.set(LogLevel.DEBUG) }, or runmake debug
5. Check Generated Code Against the Source
- Parameter, return, nullable and generic types (class-level, method-level, bounded) match the source; all are supported, so a mismatch is a bug
suspendis preserved on overrides and behavior lambdas- Defaults follow
codegen/strategy/: primitives0/""/false, nullablenull, collectionsempty*(),Flow→emptyFlow(),Result<T>→Result.success(default),Unit→Unit; any other type gets a behavior that throws "requires explicit configuration" FakeXxxConfigholds behaviors as nullableinternal vars; the fake is immutable after construction unless mutable fakes are enabled
6. Classify the Error
| Category | Indicators | Where to look |
|---|---|---|
| Plugin loading | CompilerPluginRegistrar / ServiceLoader errors |
make publish-local; compiler/src/main/resources/META-INF/services/ |
| FIR emission (default) | faktGenerate* task or worker failure, fake missing |
compiler/.../fir/generation/ (FirFakeEmitter, FirToFakeDeclarationTranslator) |
| IR generation (legacy) | IrGenerationExtension stack traces |
ir/generation/UnifiedFaktIrGenerationExtension.kt |
| FIR detection | @Fake validation diagnostics |
fir/FaktFirExtensionRegistrar.kt, fir/checkers/ |
| Generated code | Errors in build/generated/fakt/... |
Read the file; fix the generator in codegen-runtime/ |
| Imports / cross-module | Unresolved reference in generated code |
compiler/.../core/context/ImportResolver.kt; type must be visible to the test source set |
| Kotlin version | NoSuchMethodError / NoClassDefFoundError on compiler classes |
A compiler API missing in an older supported Kotlin — see kotlin-api-consultant |
Before filing a limitation as a bug, check docs/user-guide/known-issues.md.
7. Report
COMPILATION VALIDATION REPORT
Path: {default FaktGenerateTask | legacy in-process}
Generation: {count} files generated
Compilation: {Success/Failed} ({error_count} errors)
ERRORS:
1. [{category}] {description} — File: {path}:{line} — Fix: {solution}
Related Skills
bdd-test-runner— Run tests after successful validationkotlin-api-consultant— Compiler API differences across supported Kotlin versionscodegen— Fix the generator behind a bad generated file