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

[WIP] Rework of SideOnly inspections #769

Draft
wants to merge 5 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ intellij {
version = ideaVersion
// Bundled plugin dependencies
setPlugins(
"java", "maven", "gradle", "Groovy",
"java", "maven", "gradle", "Groovy", "Kotlin",
// needed dependencies for unit tests
"properties", "junit",
// useful to have when running for mods.toml
Expand Down
7 changes: 7 additions & 0 deletions src/main/kotlin/MinecraftSettings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class MinecraftSettings : PersistentStateComponent<MinecraftSettings.State> {
var isShowEventListenerGutterIcons: Boolean = true,
var isShowChatColorGutterIcons: Boolean = true,
var isShowChatColorUnderlines: Boolean = false,
var isShowSideOnlyGutterIcons: Boolean = true,
var underlineType: MinecraftSettings.UnderlineType = MinecraftSettings.UnderlineType.DOTTED
)

Expand Down Expand Up @@ -62,6 +63,12 @@ class MinecraftSettings : PersistentStateComponent<MinecraftSettings.State> {
state.isShowChatColorUnderlines = showChatColorUnderlines
}

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

var underlineType: UnderlineType
get() = state.underlineType
set(underlineType) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import com.demonwav.mcdev.creator.buildsystem.gradle.GradleBuildSystem
import com.demonwav.mcdev.creator.buildsystem.gradle.GradleCreator
import com.demonwav.mcdev.platform.PlatformType
import com.demonwav.mcdev.platform.fabric.EntryPoint
import com.demonwav.mcdev.platform.forge.inspections.sideonly.Side
import com.demonwav.mcdev.sideonly.Side
import com.demonwav.mcdev.util.License
import com.demonwav.mcdev.util.SemanticVersion
import com.intellij.openapi.module.Module
Expand All @@ -35,7 +35,7 @@ class FabricProjectConfig : ProjectConfig(), GradleCreator {
var apiMavenLocation: String? = null
var loomVersion = SemanticVersion.release()
var gradleVersion = SemanticVersion.release()
var environment = Side.NONE
var environment = Side.BOTH
var entryPoints: List<EntryPoint> = arrayListOf()
var modRepo: String? = null
var mixins = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import com.demonwav.mcdev.creator.ValidatedFieldType.NON_BLANK
import com.demonwav.mcdev.platform.PlatformType
import com.demonwav.mcdev.platform.fabric.EntryPoint
import com.demonwav.mcdev.platform.fabric.util.FabricConstants
import com.demonwav.mcdev.platform.forge.inspections.sideonly.Side
import com.demonwav.mcdev.sideonly.Side
import com.demonwav.mcdev.util.License
import com.demonwav.mcdev.util.SemanticVersion
import com.demonwav.mcdev.util.modUpdateStep
Expand Down Expand Up @@ -255,7 +255,7 @@ class FabricProjectSettingsWizard(private val creator: MinecraftProjectCreator)
conf.environment = when ((environmentBox.selectedItem as? String)?.toLowerCase(Locale.ROOT)) {
"client" -> Side.CLIENT
"server" -> Side.SERVER
else -> Side.NONE
else -> Side.BOTH
}
conf.license = licenseBox.selectedItem as? License
conf.entryPoints = entryPoints.filter { it.valid }
Expand Down
2 changes: 1 addition & 1 deletion src/main/kotlin/platform/fabric/creator/FabricTemplate.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ package com.demonwav.mcdev.platform.fabric.creator

import com.demonwav.mcdev.creator.buildsystem.BuildSystem
import com.demonwav.mcdev.platform.BaseTemplate
import com.demonwav.mcdev.platform.forge.inspections.sideonly.Side
import com.demonwav.mcdev.sideonly.Side
import com.demonwav.mcdev.util.License
import com.demonwav.mcdev.util.MinecraftTemplates.Companion.FABRIC_BUILD_GRADLE_TEMPLATE
import com.demonwav.mcdev.util.MinecraftTemplates.Companion.FABRIC_GRADLE_PROPERTIES_TEMPLATE
Expand Down
24 changes: 0 additions & 24 deletions src/main/kotlin/platform/forge/ForgeModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import com.demonwav.mcdev.insight.generation.GenerationData
import com.demonwav.mcdev.inspection.IsCancelled
import com.demonwav.mcdev.platform.AbstractModule
import com.demonwav.mcdev.platform.PlatformType
import com.demonwav.mcdev.platform.forge.inspections.sideonly.SidedProxyAnnotator
import com.demonwav.mcdev.platform.forge.util.ForgeConstants
import com.demonwav.mcdev.util.SourceType
import com.demonwav.mcdev.util.extendsOrImplements
Expand All @@ -26,7 +25,6 @@ import com.demonwav.mcdev.util.waitForAllSmart
import com.intellij.json.JsonFileType
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.fileTypes.FileTypeManager
import com.intellij.openapi.project.DumbService
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiClassType
Expand All @@ -36,7 +34,6 @@ import com.intellij.psi.PsiMethod
import com.intellij.psi.PsiMethodCallExpression
import com.intellij.psi.PsiType
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.searches.AnnotatedElementsSearch

class ForgeModule internal constructor(facet: MinecraftFacet) : AbstractModule(facet) {

Expand All @@ -54,27 +51,6 @@ class ForgeModule internal constructor(facet: MinecraftFacet) : AbstractModule(f
runWriteTaskLater {
FileTypeManager.getInstance().associatePattern(JsonFileType.INSTANCE, ForgeConstants.MCMOD_INFO)
}

// Index @SideOnly
val service = DumbService.getInstance(project)
service.runReadActionInSmartMode runSmart@{
if (service.isDumb || project.isDisposed) {
return@runSmart
}

val scope = GlobalSearchScope.projectScope(project)
val sidedProxy = JavaPsiFacade.getInstance(project)
.findClass(ForgeConstants.SIDED_PROXY_ANNOTATION, scope) ?: return@runSmart
val annotatedFields = AnnotatedElementsSearch.searchPsiFields(sidedProxy, scope).findAll()

for (field in annotatedFields) {
if (service.isDumb || project.isDisposed) {
return@runSmart
}

SidedProxyAnnotator.check(field)
}
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/*
* Minecraft Dev for IntelliJ
*
* https://minecraftdev.org
*
* Copyright (c) 2020 minecraft-dev
*
* MIT License
*/

package com.demonwav.mcdev.platform.forge.inspections

import com.demonwav.mcdev.platform.forge.util.ForgeConstants
import com.intellij.psi.PsiErrorElement
import com.intellij.psi.PsiExpression
import com.intellij.psi.PsiLambdaExpression
import com.intellij.psi.PsiMethodCallExpression
import com.intellij.psi.PsiMethodReferenceExpression
import com.siyeh.ig.BaseInspection
import com.siyeh.ig.BaseInspectionVisitor

class DistExecutorInspection : BaseInspection() {
override fun getDisplayName() = "DistExecutor problems"

override fun getStaticDescription() = "DistExecutor problems"

override fun buildErrorString(vararg infos: Any?): String {
return infos[0] as String
}

override fun buildVisitor(): BaseInspectionVisitor {
return Visitor()
}

private class Visitor : BaseInspectionVisitor() {
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
val method = expression.resolveMethod() ?: return
if (method.containingClass?.qualifiedName != ForgeConstants.DIST_EXECUTOR) return
when (method.name) {
"safeCallWhenOn", "safeRunWhenOn" -> {
checkSafeArgument(method.name, expression.argumentList.expressions.getOrNull(1))
}
"safeRunForDist" -> {
for (arg in expression.argumentList.expressions) {
checkSafeArgument(method.name, arg)
}
}
}
}

private fun checkSafeArgument(methodName: String, expression: PsiExpression?) {
if (expression == null || expression is PsiErrorElement || expression.textLength == 0) return

if (expression !is PsiLambdaExpression) {
registerError(expression, "DistExecutor.$methodName must contain lambda argument")
return
}

val lambdaBody = expression.body
if (lambdaBody != null &&
lambdaBody !is PsiMethodReferenceExpression &&
lambdaBody !is PsiErrorElement &&
lambdaBody.textLength != 0
) {
registerError(lambdaBody, "DistExecutor.$methodName must contain a method reference inside a lambda")
}
}
}
}

This file was deleted.

Loading