diff --git a/plugins/kotlin/kotlin.lombok.tests/BUILD.bazel b/plugins/kotlin/kotlin.lombok.tests/BUILD.bazel index e44ad66ec9d9..dcdbd8beaa3b 100644 --- a/plugins/kotlin/kotlin.lombok.tests/BUILD.bazel +++ b/plugins/kotlin/kotlin.lombok.tests/BUILD.bazel @@ -23,6 +23,7 @@ jvm_library( "//plugins/kotlin/base/test:kotlin-base-test_test_lib", "//plugins/kotlin/base/plugin:kotlin-base-plugin", "//plugins/kotlin/base/plugin:kotlin-base-plugin_test_lib", + "//java/openapi:java", ] ) diff --git a/plugins/kotlin/kotlin.lombok.tests/kotlin.k2.lombok.tests.iml b/plugins/kotlin/kotlin.lombok.tests/kotlin.k2.lombok.tests.iml index b7454057e141..f7b45e2b2520 100644 --- a/plugins/kotlin/kotlin.lombok.tests/kotlin.k2.lombok.tests.iml +++ b/plugins/kotlin/kotlin.lombok.tests/kotlin.k2.lombok.tests.iml @@ -15,5 +15,6 @@ + \ No newline at end of file diff --git a/plugins/kotlin/kotlin.lombok.tests/test/org/jetbrains/kotlin/highlighter/KotlinWithLombokHighlighting.kt b/plugins/kotlin/kotlin.lombok.tests/test/org/jetbrains/kotlin/highlighter/KotlinWithLombokHighlighting.kt new file mode 100644 index 000000000000..76fa9452f50c --- /dev/null +++ b/plugins/kotlin/kotlin.lombok.tests/test/org/jetbrains/kotlin/highlighter/KotlinWithLombokHighlighting.kt @@ -0,0 +1,115 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.highlighter + +import com.intellij.openapi.module.JavaModuleType +import com.intellij.openapi.projectRoots.Sdk +import com.intellij.openapi.roots.DependencyScope +import com.intellij.openapi.roots.ModuleRootModificationUtil +import com.intellij.testFramework.PsiTestUtil +import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase +import com.intellij.testFramework.fixtures.MavenDependencyUtil +import de.plushnikov.intellij.plugin.LombokTestUtil +import org.intellij.lang.annotations.Language +import org.jetbrains.kotlin.idea.base.plugin.KotlinPluginMode +import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil +import org.jetbrains.kotlin.idea.test.ExpectedPluginModeProvider +import org.jetbrains.kotlin.idea.test.setUpWithKotlinPlugin + +internal class KotlinWithLombokHighlighting : JavaCodeInsightFixtureTestCase(), ExpectedPluginModeProvider { + override val pluginMode: KotlinPluginMode + get() = KotlinPluginMode.K2 + + private val sdk: Sdk + get() = LombokTestUtil.LOMBOK_DESCRIPTOR.sdk ?: error("Lombok SDK is not found") + + override fun setUp() { + setUpWithKotlinPlugin(testRootDisposable) { super.setUp() } + LombokTestUtil.LOMBOK_DESCRIPTOR.registerSdk(testRootDisposable) + } + + fun `test using lombok classes from java module in kotlin module without lombok compiler plugin`() { + val javaWithLombokModule = PsiTestUtil.addModule( + project, + JavaModuleType.getModuleType(), + "javaWithLombokModule", + myFixture.tempDirFixture.findOrCreateDir("javaWithLombokModule"), + ) + + @Language("JAVA") + val javaDataClassText = """ + package lib; + + import lombok.Data; + import lombok.AllArgsConstructor; + import lombok.Builder; + + @Data + @AllArgsConstructor + @Builder + public class UserDataClass { + private String name; + private int age; + } + """.trimIndent() + + val javaDataClass = myFixture.addFileToProject( + "javaWithLombokModule/lib/UserDataClass.java", + javaDataClassText, + ) + + myFixture.allowTreeAccessForFile(javaDataClass.virtualFile) + + ConfigLibraryUtil.configureSdk(javaWithLombokModule, sdk) + ModuleRootModificationUtil.modifyModel(javaWithLombokModule) { model -> + MavenDependencyUtil.addFromMaven( + model, + LombokTestUtil.LOMBOK_MAVEN_COORDINATES, + /* includeTransitiveDependencies = */ true, + DependencyScope.PROVIDED, + ) + true + } + + val kotlinModule = PsiTestUtil.addModule( + project, + JavaModuleType.getModuleType(), + "kotlinModule", + myFixture.tempDirFixture.findOrCreateDir("kotlinModule"), + ) + + @Language("kotlin") + val kotlinMainText = """ + package main + + import lib.UserDataClass + + fun useConstructor() { + UserDataClass("hello", 10) + } + + fun useProperties(user: UserDataClass) { + println(user.name) + println(user.age) + } + + fun createBuilder(): UserDataClass { + return UserDataClass.builder().name("hello").age(10).build() + } + + fun useBuilder(userBuilder: UserDataClass.UserDataClassBuilder): UserDataClass { + return userBuilder.name("hello").age(10).build() + } + """.trimIndent() + + val kotlinMainFile = myFixture.addFileToProject( + "kotlinModule/Main.kt", + kotlinMainText, + ) + + ConfigLibraryUtil.configureKotlinRuntimeAndSdk(kotlinModule, sdk) + ModuleRootModificationUtil.addDependency(kotlinModule, javaWithLombokModule) + + myFixture.openFileInEditor(kotlinMainFile.virtualFile) + myFixture.checkHighlighting() + } +} \ No newline at end of file