Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dokka Gradle Plugin: Implement Gradle Worker Daemon for Dokka generation #2740

Open
wants to merge 74 commits into
base: master
Choose a base branch
from

Conversation

aSemy
Copy link
Contributor

@aSemy aSemy commented Nov 4, 2022

Refactor the way dokka-gradle executes a Dokka generation task to use a Gradle Worker Daemon. The Worker is configured to use the same classpath as the existing reflection-based process.

Using a Worker Daemon completely replaces the existing 'reflection magic'. I think this is a lot more simple and easier to understand than the previous method of using reflection to create an instance.

This PR is a further improvement upon #2709, which required a main method. Using the Gradle Worker API means the dokka-core code can be called idiomatically. However, I am not sure about the compatibility with Gradle versions. #2709 might be more compatible...

Benefits:

  • idiomatic Kotlin
  • idiomatic Gradle
  • no reflection magic
  • easier to configure/debug/test
  • no API changes for users - this should 'just work'

I haven't tested extensively so there might be some breaking changes. Of particular note:

  • is the logging output still present and as expected
  • is the Worker API compatible with the versions of Gradle that Dokka must support?

This PR includes

@qwwdfsad
Copy link
Member

Thanks!
The contribution indeed looks very promising (reflection magic is something we strive to get away from), but unfortunately I can build neither coroutines nor Ktor with this change:

> A failure occurred while executing org.jetbrains.dokka.gradle.workers.DokkaGeneratorWorker
   > org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment$Companion.createForProduction(Lcom/intellij/openapi/Disposable;Lorg/jetbrains/kotlin/config/CompilerConfiguration;Lorg/jetbrains/kotlin/cli/jvm/compiler/EnvironmentConfigFiles;)Lorg/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment;

I've also verified that without your patch, coroutines can be built with Dokka from master branch. Could you please take a look?

@qwwdfsad
Copy link
Member

It seems like Gradle Worker is missing some dependencies

@aSemy
Copy link
Contributor Author

aSemy commented Nov 28, 2022

Thanks for trying it! Yes it's possible that dependencies might be missing now that the Dokka worker executes in a separate process. It should be easy to add them back in though.

(Missing dependencies isn't a big problem, even if it's annoying. Since Dokka creates a Gradle Configuration anyone would be able to fix this themselves, should a similar problem arise.)

It's been a while since I've looked at this.. I can try figuring out what's missing. Do you have the full stack trace? Are there any clues in there?

UPDATE: Ah I see, it's in the GitHub Actions

@qwwdfsad
Copy link
Member

I've checked it manually

Stacktrace:

Caused by: java.lang.NoSuchMethodError: org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment$Companion.createForProduction(Lcom/intellij/openapi/Disposable;Lorg/jetbrains/kotlin/config/CompilerConfiguration;Lorg/jetbrains/kotlin/cli/jvm/compiler/EnvironmentConfigFiles;)Lorg/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment;
        at org.jetbrains.dokka.analysis.AnalysisEnvironment.createCoreEnvironment(AnalysisEnvironment.kt:107)
        at org.jetbrains.dokka.analysis.EnvironmentAndFacadeKt.createEnvironmentAndFacade(EnvironmentAndFacade.kt:30)
        at org.jetbrains.dokka.analysis.KotlinAnalysisKt.KotlinAnalysis(KotlinAnalysis.kt:13)
        at org.jetbrains.dokka.analysis.KotlinAnalysisKt.KotlinAnalysis$default(KotlinAnalysis.kt:11)
        at org.jetbrains.dokka.base.DokkaBase$defaultKotlinAnalysis$2$1.invoke(DokkaBase.kt:191)
        at org.jetbrains.dokka.base.DokkaBase$defaultKotlinAnalysis$2$1.invoke(DokkaBase.kt:43)
        at org.jetbrains.dokka.plugability.LazyEvaluated.get$core(LazyEvaluated.kt:8)
        at org.jetbrains.dokka.plugability.DokkaContextConfigurationImpl.single(DokkaContext.kt:159)
        at org.jetbrains.dokka.base.translators.psi.DefaultPsiToDocumentableTranslator.<init>(DefaultPsiToDocumentableTranslator.kt:818)
        at org.jetbrains.dokka.base.DokkaBase$psiToDocumentableTranslator$2$1.invoke(DokkaBase.kt:69)
        at org.jetbrains.dokka.base.DokkaBase$psiToDocumentableTranslator$2$1.invoke(DokkaBase.kt:43)
        at org.jetbrains.dokka.plugability.LazyEvaluated.get$core(LazyEvaluated.kt:8)
        at org.jetbrains.dokka.plugability.DokkaContextConfigurationImpl.actions(DokkaContext.kt:164)
        at org.jetbrains.dokka.plugability.DokkaContextConfigurationImpl.get(DokkaContext.kt:147)
        at org.jetbrains.dokka.base.generation.SingleModuleGeneration.translateSources(SingleModuleGeneration.kt:113)
        at org.jetbrains.dokka.base.generation.SingleModuleGeneration.access$translateSources(SingleModuleGeneration.kt:21)
        at org.jetbrains.dokka.base.generation.SingleModuleGeneration$createDocumentationModels$1$invokeSuspend$$inlined$parallelMap$1$1.invokeSuspend(parallelCollectionOperations.kt:17)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)

Coroutines branch (note: Dokka is published locally via ./gradlew publishToMavenLocal with the corresponding version): https://github.com/Kotlin/kotlinx.coroutines/tree/dokka-update, command: ./gradlew cleanDokkaHtmlMultiModule dokkaHtmlMultiModule --no-daemon --stacktrace

Dokka is published from your PR, with two changes -- version for publishing and commented out Dispatchers.shutdown

@aSemy
Copy link
Contributor Author

aSemy commented Nov 28, 2022

I get an error when looking at AnalysisEnvironment about missing dependencies...

image

I am very confused why this might be. I don't think this PR changes the dependencies.

UPDATE: This error is confusing, but unrelated. I think it's caused by the kotlin-analysis subproject only depending on the 'shadow' configuration, which does not expose the API dependencies. The error would probably go away if I did a full rebuild, then the shadowed jar would contain the missing dependencies.

api(project("compiler-dependency", configuration = "shadow"))

@aSemy
Copy link
Contributor Author

aSemy commented Nov 28, 2022

@qwwdfsad I think it's fixed now, can you try again please?

The problem was that I didn't add the Dokka plugins to the worker's classpath.
c829043

@qwwdfsad
Copy link
Member

The error would probably go away if I did a full rebuild, then the shadowed jar would contain the missing dependencies.

Yeah, you have to explicitly reimport your project into IDEA

@IgnatBeresnev IgnatBeresnev added the runner: Gradle plugin An issue/PR related to Dokka's Gradle plugin label Jan 25, 2023
…ckage' into feat/remove_property_by_setter

# Conflicts:
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/DokkaConfigurationSerializableTest.kt
…orker_daemon

# Conflicts:
#	core/api/core.api
#	core/src/main/kotlin/DokkaBootstrapImpl.kt
#	runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/AbstractDokkaTask.kt
…' into feat/expose_finalizeCoroutines_in_gradle

# Conflicts:
#	runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/AbstractDokkaTask.kt
…es_in_gradle' into feat/gradle_dokka_worker_daemon

# Conflicts:
#	.github/workflows/qodana.yml
…y_by_setter-original

# Conflicts:
#	runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/GradleDokkaSourceSetBuilder.kt
#	runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/sourceSetKotlinGistConfiguration.kt
#	runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/utils.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/DokkaConfigurationJsonTest.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/DokkaConfigurationSerializableTest.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/DokkaMultiModuleFileLayoutTest.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/GradleDokkaSourceSetBuilderTest.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/KotlinDslDokkaTaskConfigurationTest.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/tasks/DokkaCollectorTaskTest.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/tasks/DokkaMultiModuleTaskTest.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/tasks/DokkaTaskTest.kt
…sl_plugin

# Conflicts:
#	runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/utils.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/DokkaCollectorTaskTest.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/DokkaConfigurationJsonTest.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/DokkaConfigurationSerializableTest.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/DokkaTaskTest.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/GradleDokkaSourceSetBuilderTest.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/KotlinDslDokkaTaskConfigurationTest.kt
…_task_package

# Conflicts:
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/DokkaConfigurationJsonTest.kt
…le_dokka_worker_daemon

# Conflicts:
#	core/src/main/kotlin/DokkaBootstrapImpl.kt
#	runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/tasks/AbstractDokkaTask.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/tasks/DokkaCollectorTaskTest.kt
…dle_utils_with_kotlin_dsl

# Conflicts:
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/DokkaConfigurationJsonTest.kt
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/DokkaConfigurationSerializableTest.kt
…h_kotlin_dsl' into feat/gradle_dokka_worker_daemon

# Conflicts:
#	runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/tasks/AbstractDokkaTask.kt
#	runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/tasks/DokkaCollectorTask.kt
#	runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/tasks/DokkaTask.kt
#	runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/tasks/DokkaTaskPartial.kt
# Conflicts:
#	runners/gradle-plugin/src/test/kotlin/org/jetbrains/dokka/gradle/tasks/AbstractDokkaParentTaskTest.kt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
runner: Gradle plugin An issue/PR related to Dokka's Gradle plugin
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants