[Java. Logging] Add Lombok Slf4 logger

IDEA-331693

GitOrigin-RevId: 6cd26276b28bba8b8082717001300c876ff910ce
This commit is contained in:
Georgii Ustinov
2024-01-31 10:14:45 +02:00
committed by intellij-monorepo-bot
parent bf968f0dee
commit 7ef6316e14
8 changed files with 67 additions and 9 deletions

View File

@@ -98,7 +98,7 @@ class GenerateLoggerHandler : CodeInsightActionHandler {
if (psiField.name == JvmLogger.LOGGER_IDENTIFIER) return false
for (logger in JvmLogger.getAllLoggers(false)) {
if (logger.loggerName == typeName) return false
if (logger.loggerTypeName == typeName) return false
}
}
return true

View File

@@ -8,17 +8,16 @@ import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiField
interface JvmLogger {
val loggerName: String
val loggerTypeName: String
val priority: Int
fun isOnlyOnStartup() = false
fun insertLoggerAtClass(project: Project, clazz: PsiClass): PsiElement? {
val logger = createLoggerElementText(project, clazz) as? PsiField ?: return null
val logger = createLoggerElementText(project, clazz) ?: return null
return WriteAction.compute<PsiElement?, Exception> {
insertLoggerAtClass(project, clazz, logger)
}

View File

@@ -12,13 +12,13 @@ class JvmLoggerFieldDelegate(
private val factoryName: String,
private val methodName: String,
private val classNamePattern: String,
override val loggerName: String,
override val loggerTypeName: String,
override val priority: Int,
) : JvmLogger {
override fun createLoggerElementText(project: Project, clazz: PsiClass): PsiField? {
val factory = JavaPsiFacade.getElementFactory(project)
val className = clazz.name ?: return null
val fieldText = "$loggerName ${JvmLogger.LOGGER_IDENTIFIER} = ${factoryName}.$methodName(${
val fieldText = "$loggerTypeName ${JvmLogger.LOGGER_IDENTIFIER} = ${factoryName}.$methodName(${
String.format(classNamePattern, className)
});"
return factory.createFieldFromText(fieldText, clazz).apply {
@@ -33,7 +33,7 @@ class JvmLoggerFieldDelegate(
return clazz.add(logger)
}
override fun isAvailable(project: Project?): Boolean = JavaLibraryUtil.hasLibraryClass(project, loggerName)
override fun isAvailable(project: Project?): Boolean = JavaLibraryUtil.hasLibraryClass(project, loggerTypeName)
override fun isAvailable(module: Module?): Boolean = JavaLibraryUtil.hasLibraryClass(module, loggerName)
override fun isAvailable(module: Module?): Boolean = JavaLibraryUtil.hasLibraryClass(module, loggerTypeName)
}

View File

@@ -7,7 +7,7 @@ import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
class UnspecifiedLogger : JvmLogger {
override val loggerName: String = "Unspecified"
override val loggerTypeName: String = "Unspecified"
override val priority: Int = 100
override fun isOnlyOnStartup() = true

View File

@@ -0,0 +1,37 @@
package de.plushnikov.intellij.plugin.logging
import com.intellij.java.library.JavaLibraryUtil
import com.intellij.logging.JvmLogger
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiAnnotation
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.codeStyle.JavaCodeStyleManager
import de.plushnikov.intellij.plugin.util.LombokLibraryUtil
class JvmLoggerAnnotationDelegate(
private val fieldLoggerName: String,
override val loggerTypeName: String,
override val priority: Int
) : JvmLogger {
override fun insertLoggerAtClass(project: Project, clazz: PsiClass, logger: PsiElement): PsiElement? {
if (logger !is PsiAnnotation) return null
JavaCodeStyleManager.getInstance(project).shortenClassReferences(logger)
return clazz.modifierList?.addAfter(logger, null)
}
override fun isAvailable(project: Project?): Boolean {
return project != null && JavaLibraryUtil.hasLibraryClass(project, fieldLoggerName) && LombokLibraryUtil.hasLombokLibrary(project)
}
override fun isAvailable(module: Module?): Boolean {
return module != null && JavaLibraryUtil.hasLibraryClass(module, fieldLoggerName) && LombokLibraryUtil.hasLombokClasses(module)
}
override fun createLoggerElementText(project: Project, clazz: PsiClass): PsiAnnotation {
val factory = JavaPsiFacade.getElementFactory(project)
return factory.createAnnotationFromText("@$loggerTypeName", clazz)
}
}

View File

@@ -0,0 +1,8 @@
package de.plushnikov.intellij.plugin.logging
object LombokLoggingUtils {
const val SLF4J_ANNOTATION = "lombok.extern.slf4j.Slf4j"
const val LOG4J2_ANNOTATION = "lombok.extern.log4j.Log4j2"
const val LOG4J_ANNOTATION = "lombok.extern.log4j.Log4j"
const val APACHE_ANNOTATION = "lombok.extern.apachecommons.CommonsLog"
}

View File

@@ -0,0 +1,12 @@
package de.plushnikov.intellij.plugin.logging
import com.intellij.logging.JvmLogger
import com.siyeh.ig.psiutils.JavaLoggingUtils
class LombokSlf4jLogger : JvmLogger by JvmLoggerAnnotationDelegate(
JavaLoggingUtils.SLF4J,
LombokLoggingUtils.SLF4J_ANNOTATION,
90
) {
override fun toString(): String = "Lombok SLf4j"
}

View File

@@ -245,6 +245,8 @@
<dependencySupport coordinate="org.projectlombok:lombok" kind="java" displayName="Lombok"/>
<iconMapper mappingFile="LombokIconMappings.json"/>
<jvm.logging implementation="de.plushnikov.intellij.plugin.logging.LombokSlf4jLogger"/>
</extensions>
<projectListeners>