[jps model] support TestModuleProperties and production-on-test dependencies in JpsModelBridge (IJPL-409)

GitOrigin-RevId: 0d4ba9e02e1880873fa6ffdca2b3a84b8935a962
This commit is contained in:
Nikolay Chashnikov
2024-06-27 17:54:27 +02:00
committed by intellij-monorepo-bot
parent fbcba43905
commit 1f2aea5493
8 changed files with 65 additions and 2 deletions

View File

@@ -9,6 +9,7 @@ import org.jetbrains.jps.model.java.JpsJavaDependencyExtension;
import org.jetbrains.jps.model.java.JpsJavaModuleExtension;
import org.jetbrains.jps.model.module.JpsDependencyElement;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.model.module.JpsTestModuleProperties;
/**
* Temporary interface which provides access to custom implementation of Java-related properties in JPS Model.
@@ -16,5 +17,10 @@ import org.jetbrains.jps.model.module.JpsModule;
@ApiStatus.Internal
public interface JpsJavaAwareProject extends JpsProject {
@Nullable JpsJavaModuleExtension getJavaModuleExtension(@NotNull JpsModule module);
@Nullable JpsJavaDependencyExtension getJavaDependencyExtension(@NotNull JpsDependencyElement element);
@Nullable JpsTestModuleProperties getTestModuleProperties(@NotNull JpsModule module);
boolean isProductionOnTestDependency(@NotNull JpsDependencyElement element);
}

View File

@@ -154,6 +154,9 @@ public class JpsJavaExtensionServiceImpl extends JpsJavaExtensionService {
@Nullable
@Override
public JpsTestModuleProperties getTestModuleProperties(@NotNull JpsModule module) {
if (module.getProject() instanceof JpsJavaAwareProject) {
return ((JpsJavaAwareProject)module.getProject()).getTestModuleProperties(module);
}
return module.getContainer().getChild(JpsTestModulePropertiesImpl.ROLE);
}

View File

@@ -62,6 +62,14 @@ internal class JpsProjectBridge(modelBridge: JpsModelBridge,
}
}
override fun getTestModuleProperties(module: JpsModule): JpsTestModuleProperties? {
return (module as? JpsModuleBridge)?.testModuleProperties
}
override fun isProductionOnTestDependency(element: JpsDependencyElement): Boolean {
return element is JpsModuleDependencyBridge && element.productionOnTest
}
override fun <P : JpsElement?, ModuleType> addModule(name: String, moduleType: ModuleType & Any): JpsModule where ModuleType : JpsModuleType<P>?, ModuleType : JpsElementTypeWithDefaultProperties<P>? {
reportModificationAttempt()
}

View File

@@ -0,0 +1,28 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.workspace.jps.bridge.impl.java
import com.intellij.platform.workspace.jps.bridge.impl.module.JpsModuleBridge
import com.intellij.platform.workspace.jps.bridge.impl.module.JpsModuleReferenceBridge
import com.intellij.platform.workspace.jps.entities.TestModulePropertiesEntity
import org.jetbrains.jps.model.ex.JpsElementBase
import org.jetbrains.jps.model.module.JpsModule
import org.jetbrains.jps.model.module.JpsModuleReference
import org.jetbrains.jps.model.module.JpsTestModuleProperties
internal class JpsTestModulePropertiesBridge(private val testModulePropertiesEntity: TestModulePropertiesEntity, parentElement: JpsModuleBridge)
: JpsElementBase<JpsTestModulePropertiesBridge>(), JpsTestModuleProperties {
private val reference by lazy(LazyThreadSafetyMode.PUBLICATION) {
JpsModuleReferenceBridge(testModulePropertiesEntity.productionModuleId.name)
}
private val resolved by lazy(LazyThreadSafetyMode.PUBLICATION) {
productionModuleReference.resolve()
}
init {
parent = parentElement
}
override fun getProductionModuleReference(): JpsModuleReference = reference
override fun getProductionModule(): JpsModule? = resolved
}

View File

@@ -35,6 +35,8 @@ internal class JpsModuleDependencyBridge(private val dependency: ModuleDependenc
val javaExtension by lazy(LazyThreadSafetyMode.PUBLICATION) {
JpsJavaDependencyExtensionBridge(dependency.exported, dependency.scope, this)
}
val productionOnTest: Boolean
get() = dependency.productionOnTest
override fun getModuleReference(): JpsModuleReference = moduleReference

View File

@@ -5,6 +5,7 @@ import com.intellij.java.workspace.entities.javaSettings
import com.intellij.platform.workspace.jps.bridge.impl.JpsProjectBridge
import com.intellij.platform.workspace.jps.bridge.impl.JpsUrlListBridge
import com.intellij.platform.workspace.jps.bridge.impl.java.JpsJavaModuleExtensionBridge
import com.intellij.platform.workspace.jps.bridge.impl.java.JpsTestModulePropertiesBridge
import com.intellij.platform.workspace.jps.bridge.impl.reportModificationAttempt
import com.intellij.platform.workspace.jps.entities.*
import org.jetbrains.jps.model.*
@@ -49,10 +50,13 @@ internal class JpsModuleBridge(private val project: JpsProjectBridge,
//todo store content of custom components from *.iml file in workspace model and use them here (it's also needed for IJPL-16008)
getSerializer(entity.type?.name).loadProperties(null)
}
val javaModuleExtension by lazy(LazyThreadSafetyMode.PUBLICATION) {
val javaModuleExtension: JpsJavaModuleExtensionBridge? by lazy(LazyThreadSafetyMode.PUBLICATION) {
entity.javaSettings?.let { JpsJavaModuleExtensionBridge(it, this) }
}
val testModuleProperties: JpsTestModuleProperties? by lazy(LazyThreadSafetyMode.PUBLICATION) {
entity.testProperties?.let { JpsTestModulePropertiesBridge(it, this) }
}
override fun getContentRootsList(): JpsUrlList = contentRoots
override fun getExcludeRootsList(): JpsUrlList = excludeRoots

View File

@@ -15,8 +15,10 @@ import org.jetbrains.jps.incremental.resources.ResourcesBuilder;
import org.jetbrains.jps.incremental.resources.StandardResourceBuilderEnabler;
import org.jetbrains.jps.model.JpsElementChildRole;
import org.jetbrains.jps.model.JpsElementFactory;
import org.jetbrains.jps.model.JpsProject;
import org.jetbrains.jps.model.JpsSimpleElement;
import org.jetbrains.jps.model.ex.JpsElementChildRoleBase;
import org.jetbrains.jps.model.java.impl.JpsJavaAwareProject;
import org.jetbrains.jps.model.module.JpsDependencyElement;
import org.jetbrains.jps.model.module.JpsModule;
@@ -72,6 +74,10 @@ public final class JpsGradleExtensionServiceImpl extends JpsGradleExtensionServi
@Override
public boolean isProductionOnTestDependency(@NotNull JpsDependencyElement dependency) {
JpsProject project = dependency.getContainingModule().getProject();
if (project instanceof JpsJavaAwareProject) {
return ((JpsJavaAwareProject)project).isProductionOnTestDependency(dependency);
}
JpsSimpleElement<Boolean> child = dependency.getContainer().getChild(PRODUCTION_ON_TEST_ROLE);
return child != null && child.getData();
}

View File

@@ -15,8 +15,10 @@ import org.jetbrains.jps.maven.model.JpsMavenExtensionService;
import org.jetbrains.jps.maven.model.JpsMavenModuleExtension;
import org.jetbrains.jps.model.JpsElementChildRole;
import org.jetbrains.jps.model.JpsElementFactory;
import org.jetbrains.jps.model.JpsProject;
import org.jetbrains.jps.model.JpsSimpleElement;
import org.jetbrains.jps.model.ex.JpsElementChildRoleBase;
import org.jetbrains.jps.model.java.impl.JpsJavaAwareProject;
import org.jetbrains.jps.model.module.JpsDependencyElement;
import org.jetbrains.jps.model.module.JpsModule;
@@ -69,6 +71,10 @@ public final class JpsMavenExtensionServiceImpl extends JpsMavenExtensionService
@Override
public boolean isProductionOnTestDependency(@NotNull JpsDependencyElement dependency) {
JpsProject project = dependency.getContainingModule().getProject();
if (project instanceof JpsJavaAwareProject) {
return ((JpsJavaAwareProject)project).isProductionOnTestDependency(dependency);
}
JpsSimpleElement<Boolean> child = dependency.getContainer().getChild(PRODUCTION_ON_TEST_ROLE);
return child != null && child.getData();
}