mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-105292 IDEA 12.1.1 doesn't allow abstract methods in groovy enums (new feature in groovy 2.1.3)
This commit is contained in:
@@ -1324,8 +1324,7 @@ public class GroovyAnnotator extends GroovyElementVisitor {
|
||||
}
|
||||
|
||||
Map<PsiElement, String> errors = ContainerUtil.newHashMap();
|
||||
CustomAnnotationChecker.checkAnnotationArguments(errors, anno, annotation.getClassReference(), annotationArgumentList.getAttributes(),
|
||||
true);
|
||||
CustomAnnotationChecker.checkAnnotationArguments(errors, anno, annotation.getClassReference(), annotationArgumentList.getAttributes(), true);
|
||||
for (Map.Entry<PsiElement, String> entry : errors.entrySet()) {
|
||||
myHolder.createErrorAnnotation(entry.getKey(), entry.getValue());
|
||||
}
|
||||
@@ -1590,7 +1589,7 @@ public class GroovyAnnotator extends GroovyElementVisitor {
|
||||
PsiModifierList typeDefModifiersList = containingTypeDef.getModifierList();
|
||||
LOG.assertTrue(typeDefModifiersList != null, "modifiers list must be not null");
|
||||
|
||||
if (!typeDefModifiersList.hasExplicitModifier(ABSTRACT) && isMethodAbstract) {
|
||||
if (!typeDefModifiersList.hasModifierProperty(ABSTRACT) && isMethodAbstract) {
|
||||
final Annotation annotation =
|
||||
holder.createErrorAnnotation(modifiersList, GroovyBundle.message("only.abstract.class.can.have.abstract.method"));
|
||||
registerMakeAbstractMethodNotAbstractFix(annotation, method, true);
|
||||
@@ -1653,7 +1652,7 @@ public class GroovyAnnotator extends GroovyElementVisitor {
|
||||
}
|
||||
}
|
||||
|
||||
if (modifiersList.hasModifierProperty(ABSTRACT) && modifiersList.hasModifierProperty(FINAL)) {
|
||||
if (!typeDefinition.isEnum() && modifiersList.hasModifierProperty(ABSTRACT) && modifiersList.hasModifierProperty(FINAL)) {
|
||||
final Annotation annotation =
|
||||
holder.createErrorAnnotation(modifiersList, GroovyBundle.message("illegal.combination.of.modifiers.abstract.and.final"));
|
||||
annotation.registerFix(new GrModifierFix(typeDefinition, modifiersList, FINAL, false, false));
|
||||
|
||||
+25
-2
@@ -30,6 +30,7 @@ import gnu.trove.TObjectIntHashMap;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.plugins.groovy.config.GroovyConfigUtils;
|
||||
import org.jetbrains.plugins.groovy.lang.lexer.TokenSets;
|
||||
import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor;
|
||||
@@ -38,11 +39,14 @@ import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierFlags;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField;
|
||||
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.params.GrParameter;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinitionBody;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.packaging.GrPackageDefinition;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.impl.GrStubElementBase;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.stubs.GrModifierListStub;
|
||||
@@ -203,12 +207,31 @@ public class GrModifierListImpl extends GrStubElementBase<GrModifierListStub> im
|
||||
}
|
||||
|
||||
if (owner instanceof GrTypeDefinition) {
|
||||
final GrTypeDefinition clazz = (GrTypeDefinition)owner;
|
||||
|
||||
if (modifier.equals(GrModifier.STATIC)) {
|
||||
final PsiClass containingClass = ((GrTypeDefinition)owner).getContainingClass();
|
||||
final PsiClass containingClass = clazz.getContainingClass();
|
||||
return containingClass != null && containingClass.isInterface();
|
||||
}
|
||||
if (modifier.equals(GrModifier.ABSTRACT)) {
|
||||
return ((GrTypeDefinition)owner).isInterface();
|
||||
if (clazz.isInterface()) return true;
|
||||
if (clazz.isEnum() &&
|
||||
GroovyConfigUtils.getInstance().isVersionAtLeast(modifierList, GroovyConfigUtils.GROOVY2_0)) {
|
||||
for (GrMethod method : clazz.getCodeMethods()) {
|
||||
if (method.hasModifierProperty(PsiModifier.ABSTRACT)) return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (modifier.equals(GrModifier.FINAL)) {
|
||||
if (clazz.isEnum()) {
|
||||
final GrField[] fields = clazz.getFields();
|
||||
for (GrField field : fields) {
|
||||
if (field instanceof GrEnumConstant && ((GrEnumConstant)field).getInitializingClass() != null) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -71,8 +71,7 @@ public class ClassGenerator {
|
||||
boolean isAnnotationType = typeDefinition.isAnnotationType();
|
||||
boolean isInterface = typeDefinition.isInterface();
|
||||
|
||||
ModifierListGenerator.writeClassModifiers(text, typeDefinition.getModifierList(), typeDefinition.isInterface(), toplevel,
|
||||
classItemGenerator.generateAnnotations());
|
||||
ModifierListGenerator.writeClassModifiers(text, typeDefinition.getModifierList(), typeDefinition.isInterface(), typeDefinition.isEnum(), toplevel, classItemGenerator.generateAnnotations());
|
||||
|
||||
if (isAnnotationType) {
|
||||
text.append('@');
|
||||
|
||||
+4
-3
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2011 JetBrains s.r.o.
|
||||
* Copyright 2000-2013 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -108,6 +108,7 @@ public class ModifierListGenerator {
|
||||
public static void writeClassModifiers(StringBuilder text,
|
||||
@Nullable PsiModifierList modifierList,
|
||||
boolean isInterface,
|
||||
boolean isEnum,
|
||||
boolean toplevel,
|
||||
boolean generateAnnotations) {
|
||||
if (modifierList == null) {
|
||||
@@ -117,11 +118,11 @@ public class ModifierListGenerator {
|
||||
|
||||
List<String> allowedModifiers = new ArrayList<String>();
|
||||
allowedModifiers.add(PsiModifier.PUBLIC);
|
||||
allowedModifiers.add(PsiModifier.FINAL);
|
||||
if (!isEnum) allowedModifiers.add(PsiModifier.FINAL);
|
||||
if (!toplevel) {
|
||||
allowedModifiers.addAll(Arrays.asList(PsiModifier.PROTECTED, PsiModifier.PRIVATE, PsiModifier.STATIC));
|
||||
}
|
||||
if (!isInterface) {
|
||||
if (!isInterface && !isEnum) {
|
||||
allowedModifiers.add(PsiModifier.ABSTRACT);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user