[java] IDEA-372997 JavaFeature: create two versions of the Structured Concurrency to reflect reality in JEPs

see discussion in IJ-MR-167068

GitOrigin-RevId: 6d36cb4375f8f6a6d7d7b603de037c2c7a5255a8
This commit is contained in:
Bartek Pacia
2025-06-30 13:03:38 +00:00
committed by intellij-monorepo-bot
parent 90549f68a6
commit 2e30b4d2c4
5 changed files with 22 additions and 18 deletions
@@ -1196,9 +1196,9 @@
<liveTemplateContext contextId="JAVA_NORMAL_CLASS_DECLARATION_WITH_INSTANCE_MAIN" baseContextId="JAVA_CODE"
implementation="com.intellij.codeInsight.template.JavaCodeContextType$NormalClassDeclarationAfterShortMainMethod"/>
<liveTemplateContext contextId="JAVA_STATEMENT_WITH_STRUCTURED_CONCURRENCY_AVAILABLE_24" baseContextId="JAVA_CODE"
implementation="com.intellij.codeInsight.template.JavaCodeContextType$Java24StructuredConcurrency" />
implementation="com.intellij.codeInsight.template.JavaCodeContextType$JavaStructuredConcurrencyConstructors" />
<liveTemplateContext contextId="JAVA_STATEMENT_WITH_STRUCTURED_CONCURRENCY_AVAILABLE_25" baseContextId="JAVA_CODE"
implementation="com.intellij.codeInsight.template.JavaCodeContextType$Java25StructuredConcurrency" />
implementation="com.intellij.codeInsight.template.JavaCodeContextType$JavaStructuredConcurrencyStaticFactoryMethods" />
<liveTemplateContext contextId="JAVA_COMMENT" baseContextId="JAVA_CODE"
implementation="com.intellij.codeInsight.template.JavaCommentContextType"/>
<liveTemplateContext contextId="JAVA_STRING" baseContextId="JAVA_CODE"
@@ -12,7 +12,6 @@ import com.intellij.openapi.fileTypes.SyntaxHighlighter;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.pom.java.JavaFeature;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
@@ -311,34 +310,32 @@ public abstract class JavaCodeContextType extends TemplateContextType {
}
}
public static final class Java24StructuredConcurrency extends JavaCodeContextType {
public static final class JavaStructuredConcurrencyConstructors extends JavaCodeContextType {
private final JavaCodeContextType statementContext = new Statement();
Java24StructuredConcurrency() {
super(JavaBundle.message("live.template.context.statement.java.structured.concurrency.24"));
JavaStructuredConcurrencyConstructors() {
super(JavaBundle.message("live.template.context.statement.java.structured.concurrency.constructors"));
}
@Override
protected boolean isInContext(@NotNull PsiElement element) {
return statementContext.isInContext(element) &&
PsiUtil.isAvailable(JavaFeature.STRUCTURED_CONCURRENCY, element) &&
PsiUtil.getLanguageLevel(element).equals(LanguageLevel.JDK_24_PREVIEW);
PsiUtil.isAvailable(JavaFeature.STRUCTURED_CONCURRENCY_TASK_SCOPE_CONSTRUCTORS, element);
}
}
public static final class Java25StructuredConcurrency extends JavaCodeContextType {
public static final class JavaStructuredConcurrencyStaticFactoryMethods extends JavaCodeContextType {
private final JavaCodeContextType statementContext = new Statement();
Java25StructuredConcurrency() {
super(JavaBundle.message("live.template.context.statement.java.structured.concurrency.25"));
JavaStructuredConcurrencyStaticFactoryMethods() {
super(JavaBundle.message("live.template.context.statement.java.structured.concurrency.static.factory.methods"));
}
@Override
protected boolean isInContext(@NotNull PsiElement element) {
return statementContext.isInContext(element) &&
PsiUtil.isAvailable(JavaFeature.STRUCTURED_CONCURRENCY, element) &&
PsiUtil.getLanguageLevel(element).equals(LanguageLevel.JDK_25_PREVIEW);
PsiUtil.isAvailable(JavaFeature.STRUCTURED_CONCURRENCY_TASK_SCOPE_STATIC_FACTORY_METHODS, element);
}
}
}
@@ -67,7 +67,8 @@ feature.implicit.class.name.out.of.scope=The name of an implicitly declared clas
feature.instance.main.method=Instance main method
feature.inherited.static.main.method=Inherited static main method
feature.scoped.values=Scoped Values
feature.structured.concurrency=Structured Concurrency
feature.structured.concurrency.constructors=Structured Concurrency (StructuredTaskScope with constructors)
feature.structured.concurrency.static.factory.methods=Structured Concurrency (StructuredTaskScope with static factory methods)
feature.sequenced.collections=Sequenced Collections
feature.classfile.api=ClassFile API
feature.stream.gatherers=Stream Gatherers
@@ -136,7 +136,13 @@ enum class JavaFeature {
},
SCOPED_VALUES(LanguageLevel.JDK_21_PREVIEW, "feature.scoped.values"),
STRUCTURED_CONCURRENCY(LanguageLevel.JDK_21_PREVIEW, "feature.structured.concurrency"),
STRUCTURED_CONCURRENCY_TASK_SCOPE_CONSTRUCTORS(LanguageLevel.JDK_21_PREVIEW, "feature.structured.concurrency.constructors") {
override fun isSufficient(useSiteLevel: LanguageLevel): Boolean {
return super.isSufficient(useSiteLevel) && !useSiteLevel.isAtLeast(LanguageLevel.JDK_25)
}
},
STRUCTURED_CONCURRENCY_TASK_SCOPE_STATIC_FACTORY_METHODS(LanguageLevel.JDK_25_PREVIEW, "feature.structured.concurrency.static.factory.methods"),
/**
* JEP 512
@@ -359,7 +365,7 @@ enum class JavaFeature {
"STRING_TEMPLATES" -> STRING_TEMPLATES
"UNNAMED_CLASSES", "IMPLICIT_CLASSES" -> IMPLICIT_CLASSES
"SCOPED_VALUES" -> SCOPED_VALUES
"STRUCTURED_CONCURRENCY" -> STRUCTURED_CONCURRENCY
"STRUCTURED_CONCURRENCY" -> STRUCTURED_CONCURRENCY_TASK_SCOPE_CONSTRUCTORS
"CLASSFILE_API" -> CLASSFILE_API
"STREAM_GATHERERS" -> STREAM_GATHERERS
"FOREIGN" -> FOREIGN_FUNCTIONS
@@ -1322,8 +1322,8 @@ live.template.context.else='else' position
live.template.context.expression=Expression
live.template.context.declaration=Declaration
live.template.context.statement.java.lang.io=Statement with available java.lang.IO
live.template.context.statement.java.structured.concurrency.24=Statement with available Structured Concurrency (Java 24 / JEP 499)
live.template.context.statement.java.structured.concurrency.25=Statement with available Structured Concurrency (Java 25 / JEP 505)
live.template.context.statement.java.structured.concurrency.constructors=Statement with available StructuredTaskScope with constructors
live.template.context.statement.java.structured.concurrency.static.factory.methods=Statement with available StructuredTaskScope with static factory methods
live.template.context.normal.class.before.instance.main.declaration=Declaration inside a normal class without instance 'main' method
live.template.context.normal.class.after.instance.main.declaration=Declaration inside a normal class with instance 'main' method
live.template.context.implicit.class.declaration=Declaration inside a compact source file