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

Fixes for 2025.1 #2451

Open
wants to merge 67 commits into
base: dev
Choose a base branch
from
Open
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
15e0bfa
2024.2 EAP
RedNesto May 16, 2024
720a3bd
Silence weird tearDown failure in ProjectBuilderTest
RedNesto May 16, 2024
3d33566
Cleanup and comments
RedNesto May 16, 2024
a29d1ae
Fix imports
RedNesto May 16, 2024
19b53a9
Exclude plugin.xml from gradle tooling jar
RedNesto May 16, 2024
a4ac3e4
Revert Kotlin version bump
RedNesto May 16, 2024
b6c280c
Fix deprecated usage
RedNesto May 16, 2024
67902e5
Restore ideaVersion property usage
RedNesto May 16, 2024
a9f2138
Fix formatting error
RedNesto May 19, 2024
6c5b2fa
Update ASM, coroutines and gradle tooling
RedNesto May 19, 2024
fe25f1d
Use IJGP 2.0.0-beta3 and fix missing externalAnnotations jar
RedNesto May 19, 2024
374511f
IJGP 2.0.0-beta5
RedNesto May 30, 2024
abdf793
Fix deprecated API usage
RedNesto May 30, 2024
aee5888
Build against JDK 21
RedNesto May 31, 2024
40e5528
Use Groovy 3 for supporting newer JDK versions
RedNesto May 31, 2024
5e2ef33
Fix deprecation/internal usages
RedNesto Jun 3, 2024
8ecc137
Configure plugin verifier
RedNesto Jun 3, 2024
7f4f185
Fixes for latest EAP breaking changes
RedNesto Jun 14, 2024
d4b39e6
Merge branch 'refs/heads/2024.1' into 2024.2
RedNesto Jun 14, 2024
01f85cf
Update EAP build and restore Kotlin support
RedNesto Jul 5, 2024
03d5aaa
Merge branch '2024.1' into 2024.2
RedNesto Jul 14, 2024
60004c2
2024.2 post-merge fixes
RedNesto Jul 14, 2024
81e1227
Merge branch '2024.1' into 2024.2
RedNesto Jul 14, 2024
959775f
Set all jvm targets to 21 and fix builtin templates destination direc…
RedNesto Jul 14, 2024
50594cb
Remove unused property
RedNesto Jul 14, 2024
e95da3e
Use new startOffset extension function
RedNesto Jul 15, 2024
b3e691e
Intellij platform plugin 2.0.0
RedNesto Aug 1, 2024
5a17d89
Merge branch '2024.1' into 2024.2
DenWav Aug 4, 2024
ab0ec84
Replace namedChildSCope with childScope
DenWav Aug 4, 2024
b955969
No need to depend upon the ide variant of the Java plugin
RedNesto Aug 6, 2024
e4376bf
Compile against the 2024.2 release build
RedNesto Aug 7, 2024
cd57fa6
Merge branch '2024.1' into 2024.2
RedNesto Aug 10, 2024
111c3d7
Fix import order
RedNesto Aug 10, 2024
4c3f5ee
Remove downloadSources property
RedNesto Aug 10, 2024
d0d3a4b
Merge branch '2024.1' into 2024.2
RedNesto Sep 12, 2024
07d1a7c
Merge branch '2024.1' into 2024.2
RedNesto Sep 12, 2024
44ffaaa
2024.3 EAP
RedNesto Sep 12, 2024
5771346
Fix deprecated JavaLexer.isKeyword usage
RedNesto Sep 13, 2024
560c78a
Fix internal API usage in external annotations resolver
RedNesto Sep 13, 2024
7093a23
Use our own getOrLogException
RedNesto Sep 13, 2024
15e3806
Override new shouldSkipAutopopup, as the old one is deprecated
RedNesto Sep 13, 2024
98b7912
Remove old intellij dependencies block
RedNesto Sep 13, 2024
c141268
Declare explicit dependency on the JSON plugin
RedNesto Sep 13, 2024
f8d87fb
Merge branch 'dev' into 2024.1
RedNesto Sep 28, 2024
00b9a23
Merge branch '2024.1' into 2024.2
RedNesto Sep 28, 2024
18c612f
Merge branch '2024.2' into 2024.3
RedNesto Sep 28, 2024
283505d
Fix latest EAP warnings
RedNesto Sep 29, 2024
8037951
Declare the plugin as K2 compatible
RedNesto Sep 29, 2024
9c4c07d
Fix obfex compilation on latest EAP
RedNesto Sep 30, 2024
24f151b
Merge branch 'dev' into 2024.1
RedNesto Oct 1, 2024
acfb0a0
Merge branch '2024.1' into 2024.2
RedNesto Oct 1, 2024
555d6d2
Merge branch '2024.2' into 2024.3
RedNesto Oct 1, 2024
69a1bdd
Opt-in internal API for now and hope it goes well for now
RedNesto Oct 1, 2024
8f90e21
Merge branch '2024.2' into 2024.3
RedNesto Oct 1, 2024
9c27b29
Merge branch 'dev' into 2024.1
RedNesto Oct 6, 2024
017a3e9
Merge branch '2024.1' into 2024.2
RedNesto Oct 6, 2024
175f97e
Merge branch '2024.2' into 2024.3
RedNesto Oct 6, 2024
365b52d
Fix newly-deprecated function use
RedNesto Oct 27, 2024
28ca789
Fix #2406 and fix #2397
RedNesto Nov 28, 2024
092f5c1
Fix #2408 Force external annotations by default
RedNesto Dec 3, 2024
90a58d3
2025.1 EAP
RedNesto Jan 15, 2025
99ced62
Fixed CCE in lockedCached and test dependencies
RedNesto Jan 15, 2025
4c650b8
Merge branch 'dev' into 2025.1
LlamaLad7 Mar 17, 2025
2885713
Build: Bump IDEA version.
LlamaLad7 Mar 17, 2025
4d88839
Fix: Resolve compile errors from new 2025.1 build.
LlamaLad7 Mar 17, 2025
535c157
Fix: Fix `lockedCached` not working on 2025.1.
LlamaLad7 Mar 17, 2025
106cd69
Build: Exclude old ASM from ME Expressions.
LlamaLad7 Mar 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -24,6 +24,7 @@ crashlytics-build.properties
hs_err_pid*

**/.gradle/
.intellijPlatform/
.sandbox/
.intellijPlatform/
.kotlin/
8 changes: 6 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -86,7 +86,9 @@ dependencies {

implementation(files(gradleToolingExtensionJar))

implementation(libs.mixinExtras.expressions)
implementation(libs.mixinExtras.expressions) {
exclude(group = "org.ow2.asm", module = "asm-debug-all")
}
testLibs(libs.mixinExtras.common)

implementation(libs.mappingIo)
@@ -95,7 +97,7 @@ dependencies {
implementation(libs.bundles.fuel)

intellijPlatform {
intellijIdeaCommunity(libs.versions.intellij.ide)
intellijIdeaCommunity(libs.versions.intellij.ide, useInstaller = false)

// Bundled plugin dependencies
bundledPlugin("com.intellij.java")
@@ -105,13 +107,15 @@ dependencies {
bundledPlugin("ByteCodeViewer")
bundledPlugin("org.intellij.intelliLang")
bundledPlugin("com.intellij.properties")
bundledPlugin("com.intellij.modules.json")

// Optional dependencies
bundledPlugin("org.jetbrains.kotlin")
bundledPlugin("org.toml.lang")
bundledPlugin("org.jetbrains.plugins.yaml")

testFramework(TestFrameworkType.JUnit5)
testFramework(TestFrameworkType.Platform)
testFramework(TestFrameworkType.Plugin.Java)

pluginVerifier()
10 changes: 5 additions & 5 deletions buildSrc/src/main/kotlin/mcdev-core.gradle.kts
Original file line number Diff line number Diff line change
@@ -45,27 +45,27 @@ if (buildNumber != null) {

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
languageVersion.set(JavaLanguageVersion.of(21))
}
}

tasks.withType<JavaCompile>().configureEach {
options.encoding = "UTF-8"
options.compilerArgs = listOf("-proc:none")
options.release.set(17)
options.release.set(21)
}

kotlin {
jvmToolchain {
languageVersion.set(JavaLanguageVersion.of(17))
languageVersion.set(JavaLanguageVersion.of(21))
}
}

tasks.withType<KotlinCompile>().configureEach {
compilerOptions {
jvmTarget = JvmTarget.JVM_17
jvmTarget = JvmTarget.JVM_21
languageVersion = KotlinVersion.KOTLIN_2_0
freeCompilerArgs = listOf("-Xjvm-default=all", "-Xjdk-release=17")
freeCompilerArgs = listOf("-Xjvm-default=all", "-Xjdk-release=21")
optIn.add("kotlin.contracts.ExperimentalContracts")
}
kotlinDaemonJvmArguments.add("-Xmx2G")
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -19,7 +19,7 @@
#

# suppress inspection "UnusedProperty" for whole file
ideaVersionName = 2024.1
ideaVersionName = 2025.1

coreVersion = 1.8.2

10 changes: 5 additions & 5 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -7,10 +7,10 @@ asm = "9.6"
fuel = "2.3.1"
licenser = "0.6.1"
changelog = "2.2.0"
intellij-plugin = "2.1.0"
intellij-ide = "2024.1"
intellij-plugin = "2.3.0"
intellij-ide = "251.23774-EAP-CANDIDATE-SNAPSHOT"
idea-ext = "1.1.8"
psiPlugin = "241.14494.158-EAP-SNAPSHOT"
psiPlugin = "251.175"

[plugins]
kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
@@ -39,9 +39,9 @@ jflex-skeleton = "org.jetbrains.idea:jflex:1.7.0-c1fdf11"
grammarKit = "org.jetbrains.idea:grammar-kit:1.5.1"

# Gradle Tooling
gradleToolingExtension = "com.jetbrains.intellij.gradle:gradle-tooling-extension:241.11761.10-EAP-SNAPSHOT"
gradleToolingExtension = { module = "com.jetbrains.intellij.gradle:gradle-tooling-extension", version.ref = "intellij-ide" }
annotations = "org.jetbrains:annotations:24.0.0"
groovy = "org.codehaus.groovy:groovy-all:2.5.18"
groovy = "org.codehaus.groovy:groovy:3.0.19"

asm = { module = "org.ow2.asm:asm", version.ref = "asm" }
asm-tree = { module = "org.ow2.asm:asm-tree", version.ref = "asm" }
2 changes: 1 addition & 1 deletion obfuscation-explorer/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -38,7 +38,7 @@ intellijPlatform {

dependencies {
intellijPlatform {
intellijIdeaCommunity(libs.versions.intellij.ide)
intellijIdeaCommunity(libs.versions.intellij.ide, useInstaller = false)

plugin(libs.versions.psiPlugin.map { "PsiViewer:$it" })

Original file line number Diff line number Diff line change
@@ -154,7 +154,7 @@ class MappingsTable(private val config: ObfExFacetConfiguration) {
private val model: MappingsFileTableModel,
private val state: MutableList<MappingsTableRow> = model.state,
) : AbstractTableCellEditor() {
private val textField = textFieldWithBrowseButton(null, "Mappings Files", fileDesc, null)
private val textField = textFieldWithBrowseButton(null, fileDesc, null)
private var row: Int = -1

override fun getCellEditorValue(): Any? {
@@ -308,6 +308,6 @@ class MappingsTable(private val config: ObfExFacetConfiguration) {
return uri
}

private val fileDesc = FileChooserDescriptor(true, false, false, false, false, true)
private val fileDesc = FileChooserDescriptor(true, false, false, false, false, true).withTitle("Mappings Files")
}
}
2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -19,7 +19,7 @@
*/

plugins {
id("org.gradle.toolchains.foojay-resolver-convention") version("0.7.0")
id("org.gradle.toolchains.foojay-resolver-convention") version("0.8.0")
}

rootProject.name = "MinecraftDev"
18 changes: 14 additions & 4 deletions src/main/kotlin/MinecraftConfigurable.kt
Original file line number Diff line number Diff line change
@@ -30,15 +30,17 @@ import com.intellij.openapi.options.Configurable
import com.intellij.openapi.project.ProjectManager
import com.intellij.openapi.ui.DialogPanel
import com.intellij.ui.EnumComboBoxModel
import com.intellij.ui.components.Label
import com.intellij.ui.dsl.builder.AlignX
import com.intellij.ui.dsl.builder.BottomGap
import com.intellij.ui.dsl.builder.MutableProperty
import com.intellij.ui.dsl.builder.bindItem
import com.intellij.ui.dsl.builder.bindSelected
import com.intellij.ui.dsl.builder.panel
import com.intellij.util.IconUtil
import java.awt.Font
import javax.swing.JComponent
import javax.swing.JLabel
import javax.swing.SwingConstants
import org.jetbrains.annotations.Nls

class MinecraftConfigurable : Configurable {
@@ -50,9 +52,12 @@ class MinecraftConfigurable : Configurable {

override fun createComponent(): JComponent = panel {
row(
Label(MCDevBundle("minecraft.settings.title"), bold = true).apply {
font = font.deriveFont(font.size * 1.5f)
icon = IconUtil.scale(PlatformAssets.MINECRAFT_ICON_2X, null, 1.5f)
JLabel(
MCDevBundle("minecraft.settings.title"),
IconUtil.scale(PlatformAssets.MINECRAFT_ICON_2X, null, 1.5f),
SwingConstants.LEADING
).apply {
font = font.deriveFont(Font.BOLD, font.size * 1.5f)
}
) {
button(MCDevBundle("minecraft.settings.change_update_channel")) {
@@ -77,6 +82,11 @@ class MinecraftConfigurable : Configurable {
row {
checkBox(MCDevBundle("minecraft.settings.show_chat_color_underlines"))
.bindSelected(settings::isShowChatColorUnderlines)
}
row {
checkBox(MCDevBundle("minecraft.settings.force_external_annotations"))
.bindSelected(settings::forceExternalAnnotations)
.comment(MCDevBundle("minecraft.settings.force_external_annotations.comment"))
}.bottomGap(BottomGap.SMALL)

group(indent = false) {
7 changes: 7 additions & 0 deletions src/main/kotlin/MinecraftSettings.kt
Original file line number Diff line number Diff line change
@@ -40,6 +40,7 @@ class MinecraftSettings : PersistentStateComponent<MinecraftSettings.State> {
var isShowChatColorGutterIcons: Boolean = true,
var isShowChatColorUnderlines: Boolean = false,
var underlineType: UnderlineType = UnderlineType.DOTTED,
var forceExternalAnnotations: Boolean = true,

var mixinClassIcon: Boolean = true,

@@ -124,6 +125,12 @@ class MinecraftSettings : PersistentStateComponent<MinecraftSettings.State> {
state.underlineType = underlineType
}

var forceExternalAnnotations: Boolean
get() = state.forceExternalAnnotations
set(forceExternalAnnotations) {
state.forceExternalAnnotations = forceExternalAnnotations
}

var mixinClassIcon: Boolean
get() = state.mixinClassIcon
set(mixinClassIcon) {
4 changes: 2 additions & 2 deletions src/main/kotlin/creator/PlatformVersion.kt
Original file line number Diff line number Diff line change
@@ -31,7 +31,7 @@ import com.github.kittinunf.fuel.coroutines.awaitString
import com.google.gson.Gson
import com.intellij.openapi.diagnostic.Attachment
import com.intellij.openapi.diagnostic.logger
import com.intellij.util.proxy.CommonProxy
import com.intellij.util.net.JdkProxyProvider
import java.io.IOException
import java.net.Proxy
import java.net.URI
@@ -103,7 +103,7 @@ fun selectProxy(urlText: String): Proxy? {
val uri = URI(urlText)
val url = uri.toURL()

val proxies = CommonProxy.getInstance().select(uri)
val proxies = JdkProxyProvider.getInstance().proxySelector.select(uri)
for (proxy in proxies) {
try {
url.openConnection(proxy)
5 changes: 2 additions & 3 deletions src/main/kotlin/creator/custom/BuiltinValidations.kt
Original file line number Diff line number Diff line change
@@ -23,13 +23,12 @@ package com.demonwav.mcdev.creator.custom
import com.demonwav.mcdev.asset.MCDevBundle
import com.demonwav.mcdev.platform.fabric.util.FabricVersions
import com.demonwav.mcdev.util.SemanticVersion
import com.intellij.lang.java.lexer.JavaLexer
import com.demonwav.mcdev.util.isJavaKeyword
import com.intellij.openapi.ui.ComboBox
import com.intellij.openapi.ui.ValidationInfo
import com.intellij.openapi.ui.validation.DialogValidation
import com.intellij.openapi.ui.validation.validationErrorIf
import com.intellij.openapi.util.text.StringUtil
import com.intellij.pom.java.LanguageLevel
import javax.swing.JComponent

object BuiltinValidations {
@@ -61,7 +60,7 @@ object BuiltinValidations {

val validClassFqn = validationErrorIf<String>(MCDevBundle("creator.validation.class_fqn")) {
it.isBlank() || it.split('.').any { part ->
!StringUtil.isJavaIdentifier(part) || JavaLexer.isKeyword(part, LanguageLevel.HIGHEST)
!StringUtil.isJavaIdentifier(part) || part.isJavaKeyword()
}
}

4 changes: 2 additions & 2 deletions src/main/kotlin/creator/custom/CreatorContext.kt
Original file line number Diff line number Diff line change
@@ -27,7 +27,7 @@ import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.ModalityState
import com.intellij.openapi.application.asContextElement
import com.intellij.openapi.observable.properties.PropertyGraph
import com.intellij.platform.util.coroutines.namedChildScope
import com.intellij.platform.util.coroutines.childScope
import kotlin.coroutines.CoroutineContext
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -53,7 +53,7 @@ data class CreatorContext(
/**
* A general purpose scope dependent of the main creator scope, cancelled when the creator is closed.
*/
fun childScope(name: String): CoroutineScope = scope.namedChildScope(name)
fun childScope(name: String): CoroutineScope = scope.childScope(name)

@Suppress("UNCHECKED_CAST")
fun <T> property(name: String): CreatorProperty<T> = properties[name] as CreatorProperty<T>
3 changes: 1 addition & 2 deletions src/main/kotlin/creator/custom/CreatorTemplateProcessor.kt
Original file line number Diff line number Diff line change
@@ -39,7 +39,6 @@ import com.intellij.openapi.diagnostic.ControlFlowException
import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.module.ModuleTypeId
import com.intellij.openapi.observable.properties.GraphProperty
import com.intellij.openapi.observable.properties.PropertyGraph
import com.intellij.openapi.project.Project
@@ -308,7 +307,7 @@ class CreatorTemplateProcessor(

private fun setupTempRootModule(project: Project, projectPath: Path) {
val modifiableModel = ModuleManager.getInstance(project).getModifiableModel()
val module = modifiableModel.newNonPersistentModule("mcdev-temp-root", ModuleTypeId.JAVA_MODULE)
val module = modifiableModel.newNonPersistentModule("mcdev-temp-root", "")
val rootsModel = ModuleRootManager.getInstance(module).modifiableModel
rootsModel.addContentEntry(projectPath.virtualFileOrError)
rootsModel.commit()
5 changes: 2 additions & 3 deletions src/main/kotlin/creator/custom/TemplateService.kt
Original file line number Diff line number Diff line change
@@ -25,7 +25,7 @@ import com.intellij.openapi.components.service
import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.ProjectActivity
import com.intellij.platform.util.coroutines.namedChildScope
import com.intellij.platform.util.coroutines.childScope
import com.intellij.util.application
import kotlinx.coroutines.CoroutineScope

@@ -47,8 +47,7 @@ class TemplateService(private val scope: CoroutineScope) {
pendingActions.remove(project.locationHash)?.invoke()
}

@Suppress("UnstableApiUsage") // namedChildScope is Internal right now but has been promoted to Stable in 2024.2
fun scope(name: String): CoroutineScope = scope.namedChildScope(name)
fun scope(name: String): CoroutineScope = scope.childScope(name)

companion object {

Original file line number Diff line number Diff line change
@@ -24,7 +24,7 @@ import com.intellij.ide.util.projectWizard.WizardContext
import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.openapi.project.Project
import org.jetbrains.plugins.gradle.service.project.open.canLinkAndRefreshGradleProject
import org.jetbrains.plugins.gradle.service.project.open.linkAndRefreshGradleProject
import org.jetbrains.plugins.gradle.service.project.open.linkAndSyncGradleProject

class ImportGradleProjectFinalizer : CreatorFinalizer {

@@ -38,7 +38,7 @@ class ImportGradleProjectFinalizer : CreatorFinalizer {
val canLink = canLinkAndRefreshGradleProject(projectDir, project, showValidationDialog = false)
thisLogger().info("canLink = $canLink projectDir = $projectDir")
if (canLink) {
linkAndRefreshGradleProject(projectDir, project)
linkAndSyncGradleProject(project, projectDir)
thisLogger().info("Linking done")
}
}
Original file line number Diff line number Diff line change
@@ -67,13 +67,11 @@ class LocalTemplateProvider : TemplateProvider {
return panel {
row(MCDevBundle("creator.ui.custom.path.label")) {
val pathChooserDescriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor().apply {
title = MCDevBundle("creator.ui.custom.path.dialog.title")
description = MCDevBundle("creator.ui.custom.path.dialog.description")
}
textFieldWithBrowseButton(
MCDevBundle("creator.ui.custom.path.dialog.title"),
null,
pathChooserDescriptor
).align(AlignX.FILL)
textFieldWithBrowseButton(pathChooserDescriptor)
.align(AlignX.FILL)
.columns(COLUMNS_LARGE)
.bindText(pathProperty)
.textValidation(
Original file line number Diff line number Diff line change
@@ -68,13 +68,11 @@ class ZipTemplateProvider : TemplateProvider {
return panel {
row(MCDevBundle("creator.ui.custom.path.label")) {
val pathChooserDescriptor = FileChooserDescriptorFactory.createSingleLocalFileDescriptor()
.withTitle(MCDevBundle("creator.ui.custom.archive.dialog.title"))
.withFileFilter { it.extension == "zip" }
.apply { description = MCDevBundle("creator.ui.custom.archive.dialog.description") }
textFieldWithBrowseButton(
MCDevBundle("creator.ui.custom.archive.dialog.title"),
null,
pathChooserDescriptor
).align(AlignX.FILL)
textFieldWithBrowseButton(pathChooserDescriptor)
.align(AlignX.FILL)
.columns(COLUMNS_LARGE)
.bindText(pathProperty)
.textValidation(
4 changes: 2 additions & 2 deletions src/main/kotlin/creator/field-validation.kt
Original file line number Diff line number Diff line change
@@ -20,7 +20,7 @@

package com.demonwav.mcdev.creator

import com.demonwav.mcdev.util.isJavaKeyword
import com.demonwav.mcdev.util.isJavaSoftKeyword

fun isValidClassName(className: String): Boolean {
// default package
@@ -42,5 +42,5 @@ fun isValidClassName(className: String): Boolean {
return false
}
// keyword identifier
return !fieldNameSplit.any { it.isJavaKeyword() }
return !fieldNameSplit.any { it.isJavaSoftKeyword() }
}
Loading
Oops, something went wrong.
Loading
Oops, something went wrong.