diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryDefModifierInspection.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryDefModifierInspection.java
index 0fc53286785f..f8686af623ea 100644
--- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryDefModifierInspection.java
+++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryDefModifierInspection.java
@@ -25,12 +25,13 @@ import org.jetbrains.plugins.groovy.codeInspection.GroovyInspectionBundle;
import org.jetbrains.plugins.groovy.codeInspection.GroovySuppressableInspectionTool;
import org.jetbrains.plugins.groovy.codeInspection.bugs.GrModifierFix;
import org.jetbrains.plugins.groovy.codeInspection.bugs.GrRemoveModifierFix;
-import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes;
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier;
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtilKt;
-public class GrUnnecessaryDefModifierInspection extends GroovySuppressableInspectionTool implements CleanupLocalInspectionTool{
+import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.kDEF;
+
+public class GrUnnecessaryDefModifierInspection extends GroovySuppressableInspectionTool implements CleanupLocalInspectionTool {
private static final GrModifierFix FIX = new GrRemoveModifierFix(GrModifier.DEF);
@@ -40,13 +41,13 @@ public class GrUnnecessaryDefModifierInspection extends GroovySuppressableInspec
return new PsiElementVisitor() {
@Override
public void visitElement(PsiElement modifier) {
- if (modifier.getNode().getElementType() != GroovyTokenTypes.kDEF) return;
+ if (modifier.getNode().getElementType() != kDEF) return;
PsiElement list = modifier.getParent();
if (!(list instanceof GrModifierList)) return;
PsiElement owner = list.getParent();
- if (!PsiUtilKt.modifierListMayBeEmpty(owner)) return;
+ if (!PsiUtilKt.modifierListMayBeEmpty(owner) && !PsiUtilKt.hasOtherModifiers((GrModifierList)list, kDEF)) return;
holder.registerProblem(
modifier,
diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/psiUtil.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/psiUtil.kt
index c5250bc2abdf..7feac6c5c9bb 100644
--- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/psiUtil.kt
+++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/psiUtil.kt
@@ -16,7 +16,9 @@
package org.jetbrains.plugins.groovy.lang.psi.util
import com.intellij.psi.PsiElement
+import com.intellij.psi.tree.IElementType
import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mCOLON
+import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration
import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrForInClause
@@ -46,3 +48,7 @@ fun modifierListMayBeEmpty(owner: PsiElement?): Boolean = when (owner) {
is GrVariableDeclaration -> owner.typeElementGroovy != null
else -> true
}
+
+fun GrModifierList.hasOtherModifiers(modifierElementType: IElementType): Boolean {
+ return modifiers.any { it.node.elementType != modifierElementType }
+}
diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryDefModifierInspectionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryDefModifierInspectionTest.groovy
index 71b2b0cb3a19..67a64e011e27 100644
--- a/plugins/groovy/test/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryDefModifierInspectionTest.groovy
+++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/codeInspection/style/GrUnnecessaryDefModifierInspectionTest.groovy
@@ -37,6 +37,8 @@ def baw(def a) {}
def T bax() {}
+synchronized def T baxx(Class c) {}
+
def Object bar
def baf
@@ -64,6 +66,8 @@ boolean baz(a) {}
def T bax() {}
+synchronized T baxx(Class c) {}
+
Object bar
def baf