diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java index e82dcf67758b..c0a44f7821f5 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java @@ -591,7 +591,7 @@ public class GroovyAnnotator extends GroovyElementVisitor { public void visitOpenBlock(GrOpenBlock block) { if (block.getParent() instanceof GrMethod) { final GrMethod method = (GrMethod)block.getParent(); - if (method.hasModifierProperty(ABSTRACT)) { + if (method.hasModifierProperty(ABSTRACT) && !PsiImplUtil.isTrait(method.getContainingClass())) { final Annotation annotation = myHolder.createErrorAnnotation(block, GroovyBundle.message("abstract.methods.must.not.have.body")); registerMakeAbstractMethodNotAbstractFix(annotation, method, true); } @@ -1750,8 +1750,9 @@ public class GroovyAnnotator extends GroovyElementVisitor { if (typeDefinition.isAnnotationType()) return; if (typeDefinition instanceof GrTypeParameter) return; + PsiMethod abstractMethod = ClassUtil.getAnyAbstractMethod(typeDefinition); - if (abstractMethod== null) return; + if (abstractMethod == null) return; String notImplementedMethodName = abstractMethod.getName(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyTraitFieldSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyTraitFieldSearcher.java index 6aa9e8449878..e75ccd1ff57c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyTraitFieldSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyTraitFieldSearcher.java @@ -28,7 +28,7 @@ import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; +import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil; import org.jetbrains.plugins.groovy.lang.resolve.CollectClassMembersUtil; /** @@ -56,7 +56,7 @@ public class GroovyTraitFieldSearcher extends QueryExecutorBasefalse") + public static boolean isTrait(@Nullable PsiClass aClass) { return aClass instanceof GrTypeDefinition && ((GrTypeDefinition)aClass).isTrait(); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/modifiers/GrModifierListImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/modifiers/GrModifierListImpl.java index e809a1e6d874..d65aa3533cd6 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/modifiers/GrModifierListImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/modifiers/GrModifierListImpl.java @@ -195,9 +195,9 @@ public class GrModifierListImpl extends GrStubElementBase im if (owner instanceof GrMethod && owner.getParent() instanceof GrTypeDefinitionBody) { PsiElement parent = owner.getParent().getParent(); - if (parent instanceof GrTypeDefinition && ((GrTypeDefinition)parent).isInterface() && !((GrTypeDefinition)parent).isTrait()) { + if (parent instanceof GrTypeDefinition && ((GrTypeDefinition)parent).isInterface()) { if (GrModifier.ABSTRACT.equals(modifier)) return true; - if (GrModifier.PUBLIC.equals(modifier)) return true; + if (!((GrTypeDefinition)parent).isTrait() && GrModifier.PUBLIC.equals(modifier)) return true; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodBaseImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodBaseImpl.java index 484ef1fde8e1..04ff818087b4 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodBaseImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/members/GrMethodBaseImpl.java @@ -335,6 +335,7 @@ public abstract class GrMethodBaseImpl extends GrStubElementBase i @Nullable public PsiCodeBlock getBody() { + if (PsiImplUtil.isTrait(getContainingClass())) return null; return PsiImplUtil.getOrCreatePsiCodeBlock(getBlock()); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/CollectClassMembersUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/CollectClassMembersUtil.java index 638b240d5fa7..9f72551cc970 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/CollectClassMembersUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/CollectClassMembersUtil.java @@ -28,6 +28,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; +import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil; import java.util.ArrayList; import java.util.List; @@ -154,7 +155,7 @@ public class CollectClassMembersUtil { if (!visitedClasses.add(aClass)) return; - String fieldPrefix = aClass instanceof GrTypeDefinition && ((GrTypeDefinition)aClass).isTrait() ? getTraitFieldPrefix(aClass) : null; + String fieldPrefix = PsiImplUtil.isTrait(aClass) ? getTraitFieldPrefix(aClass) : null; for (PsiField field : getFields(aClass, includeSynthetic)) { String originalName = field.getName();