diff --git a/java/idea-ui/src/com/intellij/codeInsight/daemon/impl/AttachSourcesNotificationProvider.java b/java/idea-ui/src/com/intellij/codeInsight/daemon/impl/AttachSourcesNotificationProvider.java index 5a6f5e3a4ea8..7dd60550d18b 100644 --- a/java/idea-ui/src/com/intellij/codeInsight/daemon/impl/AttachSourcesNotificationProvider.java +++ b/java/idea-ui/src/com/intellij/codeInsight/daemon/impl/AttachSourcesNotificationProvider.java @@ -229,7 +229,7 @@ final class AttachSourcesNotificationProvider implements EditorNotificationProvi LanguageLevel level = JavaMultiReleaseUtil.getVersion(file); @Nls StringBuilder info = new StringBuilder(); if (level != null) { - info.append(JavaUiBundle.message("class.file.multi.release.decompiled.text", level.toJavaVersion().feature)); + info.append(JavaUiBundle.message("class.file.multi.release.decompiled.text", level.feature())); } else { info.append(JavaUiBundle.message("class.file.decompiled.text")); } diff --git a/java/idea-ui/src/com/intellij/ide/starters/local/GeneratorContext.kt b/java/idea-ui/src/com/intellij/ide/starters/local/GeneratorContext.kt index 1ac46d4bc570..ec47baad02ac 100644 --- a/java/idea-ui/src/com/intellij/ide/starters/local/GeneratorContext.kt +++ b/java/idea-ui/src/com/intellij/ide/starters/local/GeneratorContext.kt @@ -68,6 +68,6 @@ internal class GeneratorContext( val sdkFeatureVersion: Int get() { - return sdkVersion?.maxLanguageLevel?.toJavaVersion()?.feature ?: 8 + return sdkVersion?.maxLanguageLevel?.feature() ?: 8 } } \ No newline at end of file diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelCombo.kt b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelCombo.kt index 42b5527fb25a..53b1a1d426b4 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelCombo.kt +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelCombo.kt @@ -40,7 +40,7 @@ abstract class LanguageLevelCombo @JvmOverloads constructor( val otherItems = items.filterAndAdd(buildList { LanguageLevel.entries - .sortedBy { it.toJavaVersion().feature } + .sortedBy { it.feature() } .filter { level: LanguageLevel -> level <= highestWithPreview && !level.isUnsupported && (level.isPreview || !ArrayUtil.contains(level, *LTS)) } .forEach { level: LanguageLevel -> add(level) } diff --git a/java/java-analysis-api/src/com/intellij/openapi/module/LanguageLevelUtil.java b/java/java-analysis-api/src/com/intellij/openapi/module/LanguageLevelUtil.java index a6f8f1c2a786..9f68b872946a 100644 --- a/java/java-analysis-api/src/com/intellij/openapi/module/LanguageLevelUtil.java +++ b/java/java-analysis-api/src/com/intellij/openapi/module/LanguageLevelUtil.java @@ -73,7 +73,7 @@ public final class LanguageLevelUtil { static { for (LanguageLevel level : LanguageLevel.values()) { if (level.ordinal() > LanguageLevel.HIGHEST.ordinal()) break; - int feature = level.toJavaVersion().feature + 1; + int feature = level.feature() + 1; ourPresentableShortMessage.put(level, feature >= 9 ? String.valueOf(feature) : "1." + feature); } } diff --git a/java/java-frontback-psi-api/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java b/java/java-frontback-psi-api/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java index 0384a0dae58e..b722af386078 100644 --- a/java/java-frontback-psi-api/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java +++ b/java/java-frontback-psi-api/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java @@ -66,7 +66,7 @@ public enum JavaSdkVersion { if (languageLevel == LanguageLevel.JDK_X) { return values[values.length - 1]; } - int feature = languageLevel.toJavaVersion().feature; + int feature = languageLevel.feature(); if (feature < values.length) { return values[feature]; } diff --git a/java/java-frontback-psi-api/src/com/intellij/pom/java/LanguageLevel.java b/java/java-frontback-psi-api/src/com/intellij/pom/java/LanguageLevel.java index e47e9efaef9c..af5ed3c72e81 100644 --- a/java/java-frontback-psi-api/src/com/intellij/pom/java/LanguageLevel.java +++ b/java/java-frontback-psi-api/src/com/intellij/pom/java/LanguageLevel.java @@ -134,19 +134,39 @@ public enum LanguageLevel { return myPresentableText.get(); } + /** + * @param level level to compare to + * @return true, if this language level is at least the same or newer than the level we are comparing to. + * A preview level for Java version X is assumed to be between non-preview version X and non-preview version X+1 + */ public boolean isAtLeast(@NotNull LanguageLevel level) { return compareTo(level) >= 0; } + /** + * @param level level to compare to + * @return true if this language level is strictly less than the level we are comparing to. + * A preview level for Java version X is assumed to be between non-preview version X and non-preview version X+1 + */ public boolean isLessThan(@NotNull LanguageLevel level) { return compareTo(level) < 0; } + /** + * @return the {@link JavaVersion} object that corresponds to this language level + */ @NotNull public JavaVersion toJavaVersion() { return myVersion; } + /** + * @return the language level feature number (like 8 for {@link #JDK_1_8}). + */ + public int feature() { + return myVersion.feature; + } + /** See {@link JavaVersion#parse(String)} for supported formats. */ @Nullable public static LanguageLevel parse(@Nullable String compilerComplianceOption) { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/UpgradeSdkFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/UpgradeSdkFix.java index 25a50bdd1b5a..d94122c36eb7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/UpgradeSdkFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/UpgradeSdkFix.java @@ -31,7 +31,7 @@ public class UpgradeSdkFix implements IntentionAction { @NotNull @Override public String getText() { - return JavaBundle.message("intention.name.upgrade.jdk.to", myLevel.toJavaVersion().feature); + return JavaBundle.message("intention.name.upgrade.jdk.to", myLevel.feature()); } @NotNull diff --git a/java/java-impl/src/com/intellij/javadoc/JavadocGeneratorRunProfile.java b/java/java-impl/src/com/intellij/javadoc/JavadocGeneratorRunProfile.java index b432cd9e8158..24f04fb40dce 100644 --- a/java/java-impl/src/com/intellij/javadoc/JavadocGeneratorRunProfile.java +++ b/java/java-impl/src/com/intellij/javadoc/JavadocGeneratorRunProfile.java @@ -251,7 +251,7 @@ public final class JavadocGeneratorRunProfile implements ModuleRunProfile { LanguageLevel languageLevel = LanguageLevelUtil.getEffectiveLanguageLevel(module); if (languageLevel.isPreview()) { parameters.add(JavaParameters.JAVA_ENABLE_PREVIEW_PROPERTY); - parameters.add("--source", String.valueOf(languageLevel.toJavaVersion().feature)); + parameters.add("--source", String.valueOf(languageLevel.feature())); break; } } diff --git a/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java b/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java index a5f2b29ffc18..72a03a75d4af 100644 --- a/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java +++ b/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java @@ -120,7 +120,7 @@ public final class JavaSdkImpl extends JavaSdk { public @Nullable String getDefaultDocumentationUrl(@NotNull Sdk sdk) { JavaSdkVersion version = getVersion(sdk); int release = version != null ? version.ordinal() : 0; - if (release > LanguageLevel.HIGHEST.toJavaVersion().feature) return "https://download.java.net/java/early_access/jdk" + release + "/docs/api/"; + if (release > LanguageLevel.HIGHEST.feature()) return "https://download.java.net/java/early_access/jdk" + release + "/docs/api/"; if (release >= 11) return "https://docs.oracle.com/en/java/javase/" + release + "/docs/api/"; if (release >= 6) return "https://docs.oracle.com/javase/" + release + "/docs/api/"; if (release == 5) return "https://docs.oracle.com/javase/1.5.0/docs/api/"; diff --git a/java/java-impl/src/com/intellij/pom/java/AcceptedLanguageLevelsSettings.java b/java/java-impl/src/com/intellij/pom/java/AcceptedLanguageLevelsSettings.java index bd28f1068cec..691678378aac 100644 --- a/java/java-impl/src/com/intellij/pom/java/AcceptedLanguageLevelsSettings.java +++ b/java/java-impl/src/com/intellij/pom/java/AcceptedLanguageLevelsSettings.java @@ -69,7 +69,7 @@ public final class AcceptedLanguageLevelsSettings implements PersistentStateComp return; } - int previewFeature = languageLevel.toJavaVersion().feature; + int previewFeature = languageLevel.feature(); if (languageLevel.isUnsupported()) { PREVIEW_NOTIFICATION_GROUP.createNotification( JavaBundle.message("java.preview.features.unsupported.title"), diff --git a/java/java-impl/src/com/intellij/pom/java/JavaLanguageVersionsCollector.kt b/java/java-impl/src/com/intellij/pom/java/JavaLanguageVersionsCollector.kt index c50a3d7664b7..8df89af7a5a5 100644 --- a/java/java-impl/src/com/intellij/pom/java/JavaLanguageVersionsCollector.kt +++ b/java/java-impl/src/com/intellij/pom/java/JavaLanguageVersionsCollector.kt @@ -60,7 +60,7 @@ class JavaLanguageVersionsCollector : ProjectUsagesCollector() { LanguageLevelUtil.getCustomLanguageLevel(it) ?: projectLanguageLevel } languageLevels.mapTo(metrics) { - moduleLanguageLevel.metric(it.toJavaVersion().feature, it.isPreview) + moduleLanguageLevel.metric(it.feature(), it.isPreview) } } diff --git a/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java b/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java index 09b89e288c76..4a13a755f816 100644 --- a/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java @@ -133,7 +133,7 @@ public final class JavaPsiImplementationHelperImpl extends JavaPsiImplementation else { // Multi-release jar: assume that source file is placed in META-INF/versions/ // fallback to default location only if there's no the same file in the root - String versionPath = "META-INF/versions/" + level.toJavaVersion().feature + "/" + relativePath; + String versionPath = "META-INF/versions/" + level.feature() + "/" + relativePath; if (JavaMultiReleaseUtil.findBaseFile(clsFile.getVirtualFile()) != null) { finder = root -> root.findFileByRelativePath(versionPath); } else { diff --git a/java/java-impl/src/com/siyeh/ig/jdk/ForwardCompatibilityInspection.java b/java/java-impl/src/com/siyeh/ig/jdk/ForwardCompatibilityInspection.java index 844c214317fd..71772a320e7f 100644 --- a/java/java-impl/src/com/siyeh/ig/jdk/ForwardCompatibilityInspection.java +++ b/java/java-impl/src/com/siyeh/ig/jdk/ForwardCompatibilityInspection.java @@ -47,7 +47,7 @@ public final class ForwardCompatibilityInspection extends AbstractBaseJavaLocalI feature != JavaFeature.MODULES && !name.equals(PsiKeyword.WHEN) && // Keywords from module-info and 'when' still can be used as class names !feature.isSufficient(languageLevel) && parent instanceof PsiClass) { return JavaErrorBundle.message("restricted.identifier.warn", name, - feature.getMinimumLevel().toJavaVersion().feature); + feature.getMinimumLevel().feature()); } switch (name) { case PsiKeyword.ASSERT -> { diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaVersionBasedScope.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaVersionBasedScope.java index 3d8f434182de..c8c839262383 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaVersionBasedScope.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaVersionBasedScope.java @@ -64,6 +64,6 @@ public final class JavaVersionBasedScope extends DelegatingGlobalSearchScope { @Override public String toString() { - return "Java " + myLevel.toJavaVersion().feature + " @ " + myBaseScope; + return "Java " + myLevel.feature() + " @ " + myBaseScope; } } diff --git a/java/java-psi-impl/src/com/intellij/psi/presentation/java/ClassPresentationProvider.java b/java/java-psi-impl/src/com/intellij/psi/presentation/java/ClassPresentationProvider.java index 6d155f99a6ef..e28dfc4cfbdc 100644 --- a/java/java-psi-impl/src/com/intellij/psi/presentation/java/ClassPresentationProvider.java +++ b/java/java-psi-impl/src/com/intellij/psi/presentation/java/ClassPresentationProvider.java @@ -38,7 +38,7 @@ public final class ClassPresentationProvider implements ItemPresentationProvider if (packageName.isEmpty()) return null; LanguageLevel version = JavaMultiReleaseUtil.getVersion(file); if (version != null) { - packageName += "/" + JavaPsiBundle.message("class.file.version", version.toJavaVersion().feature); + packageName += "/" + JavaPsiBundle.message("class.file.version", version.feature()); } return NewUiValue.isEnabled() ? JavaPsiBundle.message("aux.context.display", packageName) : "(" + packageName + ")"; } diff --git a/java/java-psi-impl/src/com/intellij/psi/util/JavaMultiReleaseUtil.java b/java/java-psi-impl/src/com/intellij/psi/util/JavaMultiReleaseUtil.java index b2e60e523056..7d9f985fdd51 100644 --- a/java/java-psi-impl/src/com/intellij/psi/util/JavaMultiReleaseUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/util/JavaMultiReleaseUtil.java @@ -107,8 +107,8 @@ public final class JavaMultiReleaseUtil { if (relativePath == null) return file; VirtualFile versions = root.findFileByRelativePath("META-INF/versions"); if (versions == null) return file; - int feature = level.toJavaVersion().feature; - int minFeature = MIN_MULTI_RELEASE_VERSION.toJavaVersion().feature; + int feature = level.feature(); + int minFeature = MIN_MULTI_RELEASE_VERSION.feature(); while (feature >= minFeature) { VirtualFile versionRoot = versions.findChild(String.valueOf(feature)); if (versionRoot != null) { diff --git a/java/testFramework/src/com/intellij/debugger/impl/OutputChecker.java b/java/testFramework/src/com/intellij/debugger/impl/OutputChecker.java index a749b7febcc3..21cc37dea2bf 100644 --- a/java/testFramework/src/com/intellij/debugger/impl/OutputChecker.java +++ b/java/testFramework/src/com/intellij/debugger/impl/OutputChecker.java @@ -137,7 +137,7 @@ public class OutputChecker { current = res; } JavaSdkVersion version = JavaSdkVersionUtil.getJavaSdkVersion(jdk); - for (int feature = version.getMaxLanguageLevel().toJavaVersion().feature; feature > 6; feature--) { + for (int feature = version.getMaxLanguageLevel().feature(); feature > 6; feature--) { File outFile = new File(outsDir, name + ".jdk" + feature + ".out"); if (outFile.exists()) { current = outFile; diff --git a/java/testFramework/src/com/intellij/debugger/mockJDI/types/MockPsiReferenceType.java b/java/testFramework/src/com/intellij/debugger/mockJDI/types/MockPsiReferenceType.java index 74932a58edab..61cb5a0a22a7 100644 --- a/java/testFramework/src/com/intellij/debugger/mockJDI/types/MockPsiReferenceType.java +++ b/java/testFramework/src/com/intellij/debugger/mockJDI/types/MockPsiReferenceType.java @@ -208,7 +208,7 @@ public class MockPsiReferenceType extends MockType implements ReferenceType { @Override public int majorVersion() { - return PsiUtil.getLanguageLevel(myClass).toJavaVersion().feature + 44; + return PsiUtil.getLanguageLevel(myClass).feature() + 44; } @Override diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java index ba453ccdf999..d5451a4ef6a7 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java @@ -55,9 +55,7 @@ import org.jetbrains.jps.model.serialization.PathMacroUtil; import org.jetbrains.jps.service.JpsServiceManager; import org.jetbrains.jps.service.SharedThreadPool; -import javax.tools.Diagnostic; -import javax.tools.DiagnosticListener; -import javax.tools.JavaFileObject; +import javax.tools.*; import java.io.File; import java.io.FileFilter; import java.io.IOException; @@ -1039,7 +1037,7 @@ public final class JavaBuilder extends ModuleLevelBuilder { @NotNull JpsModule module = chunk.representativeTarget().getModule(); final LanguageLevel level = JpsJavaExtensionService.getInstance().getLanguageLevel(module); - final int languageLevel = level != null ? level.toJavaVersion().feature : 0; + final int languageLevel = level != null ? level.feature() : 0; final int chunkSdkVersion = getChunkSdkVersion(chunk); int bytecodeTarget = getModuleBytecodeTarget(context, chunk, compilerConfiguration, @@ -1120,7 +1118,7 @@ public final class JavaBuilder extends ModuleLevelBuilder { private static int getLanguageLevel(@NotNull JpsModule module) { final LanguageLevel level = JpsJavaExtensionService.getInstance().getLanguageLevel(module); - return level != null ? level.toJavaVersion().feature : 0; + return level != null ? level.feature() : 0; } /** diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/LanguageLevel.java b/jps/model-api/src/org/jetbrains/jps/model/java/LanguageLevel.java index 11c50377fbb7..b63df13457ef 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/java/LanguageLevel.java +++ b/jps/model-api/src/org/jetbrains/jps/model/java/LanguageLevel.java @@ -45,6 +45,13 @@ public enum LanguageLevel { return myVersion; } + /** + * @return the language level feature number (like 8 for {@link #JDK_1_8}). + */ + public int feature() { + return myVersion.feature; + } + public boolean isPreview() { return name().endsWith("_PREVIEW") || name().endsWith("_X"); } diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/GenerationUtil.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/GenerationUtil.java index a906e824b41f..cb11aba4e76a 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/GenerationUtil.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/GenerationUtil.java @@ -203,7 +203,7 @@ public final class GenerationUtil { } if (member != null) { - vc.put("java_version", PsiUtil.getLanguageLevel(member).toJavaVersion().feature); + vc.put("java_version", PsiUtil.getLanguageLevel(member).feature()); final Project project = member.getProject(); vc.put("settings", CodeStyle.getSettings(project).getCustomSettings(JavaCodeStyleSettings.class)); vc.put("project", project); diff --git a/plugins/gradle/java/testSources/importing/GradleMiscImportingTest.java b/plugins/gradle/java/testSources/importing/GradleMiscImportingTest.java index f5ef4a001481..d76835a46623 100644 --- a/plugins/gradle/java/testSources/importing/GradleMiscImportingTest.java +++ b/plugins/gradle/java/testSources/importing/GradleMiscImportingTest.java @@ -124,7 +124,7 @@ public class GradleMiscImportingTest extends GradleJavaImportingTestCase { @Test public void testPreviewLanguageLevel() throws Exception { - int feature = LanguageLevel.HIGHEST.toJavaVersion().feature; + int feature = LanguageLevel.HIGHEST.feature(); importProject( "apply plugin: 'java'\n" + "java.sourceCompatibility = " + feature+ "\n" + diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/wizard/JavaFxModuleBuilder.kt b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/wizard/JavaFxModuleBuilder.kt index f7c37ef9bf6e..c172eed6c420 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/wizard/JavaFxModuleBuilder.kt +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/wizard/JavaFxModuleBuilder.kt @@ -4,7 +4,6 @@ package org.jetbrains.plugins.javaFX.wizard import com.intellij.icons.AllIcons import com.intellij.ide.fileTemplates.FileTemplateManager import com.intellij.ide.starters.local.* -import com.intellij.ide.starters.local.StandardAssetsProvider import com.intellij.ide.starters.shared.* import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.projectRoots.JavaSdk @@ -98,7 +97,7 @@ internal class JavaFxModuleBuilder : StarterModuleBuilder() { val properties = HashMap(super.getGeneratorContextProperties(sdk, dependencyConfig)) val sdkVersion = sdk?.let { JavaSdk.getInstance().getVersion(it) } - val sdkFeatureVersion = sdkVersion?.maxLanguageLevel?.toJavaVersion()?.feature + val sdkFeatureVersion = sdkVersion?.maxLanguageLevel?.feature() if (sdkFeatureVersion == null) { properties["javafx.version"] = getUnknownFxVersion(dependencyConfig) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/MavenCommandLineInspectionProjectConfigurator.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/MavenCommandLineInspectionProjectConfigurator.kt index 1bc0a8f42d29..7b8e1095f4bb 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/MavenCommandLineInspectionProjectConfigurator.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/MavenCommandLineInspectionProjectConfigurator.kt @@ -157,7 +157,7 @@ class MavenCommandLineInspectionProjectConfigurator : CommandLineInspectionProje SdkLookup .newLookupBuilder() .withProgressIndicator(context.progressIndicator) - .withVersionFilter { JavaVersion.tryParse(it)?.feature == level.toJavaVersion().feature } + .withVersionFilter { JavaVersion.tryParse(it)?.feature == level.feature() } .withSdkType(JavaSdk.getInstance()) .onSdkResolved { sdk -> future.complete(sdk) diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenCompilerImportingTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenCompilerImportingTest.kt index 8d7fcc463100..27cc4a1919a8 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenCompilerImportingTest.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenCompilerImportingTest.kt @@ -276,7 +276,7 @@ open class MavenCompilerImportingTest : MavenMultiVersionImportingTestCase() { } private suspend fun doTestPreview(compilerArgs: String?) { - val feature = LanguageLevel.HIGHEST.toJavaVersion().feature + val feature = LanguageLevel.HIGHEST.feature() importProjectAsync(("test" + "project" + "1" +