LocalQuickFix (@NotNull PsiElement location) { final GrRangeExpression range = (GrRangeExpression)location; final PsiType type = range.getType(); final List<LocalQuickFix> fixes = new ArrayList<>(3); if (type instanceof GrRangeType) { PsiType iterationType = ((GrRangeType)type).getIterationType(); if (!(iterationType instanceof PsiClassType)) return null; final PsiClass psiClass = ((PsiClassType)iterationType).resolve(); if (!(psiClass instanceof GrTypeDefinition)) return null; final GroovyResolveResult[] nexts = ResolveUtil.getMethodCandidates(iterationType, "next", range); final GroovyResolveResult[] previouses = ResolveUtil.getMethodCandidates(iterationType, "previous", range); final GroovyResolveResult[] compareTos = ResolveUtil.getMethodCandidates(iterationType, "compareTo", range, iterationType); if (countImplementations(psiClass, nexts)==0) { fixes.add(GroovyQuickFixFactory.getInstance().createAddMethodFix("next", (GrTypeDefinition)psiClass)); } if (countImplementations(psiClass, previouses) == 0) { fixes.add(GroovyQuickFixFactory.getInstance().createAddMethodFix("previous", (GrTypeDefinition)psiClass)); } if (!InheritanceUtil.isInheritor(iterationType, CommonClassNames.JAVA_LANG_COMPARABLE) || countImplementations(psiClass, compareTos) == 0) { fixes.add(GroovyQuickFixFactory.getInstance().createAddClassToExtendsFix((GrTypeDefinition)psiClass, CommonClassNames.JAVA_LANG_COMPARABLE)); } return new GroovyFix() { @Override protected void doFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) throws IncorrectOperationException { for (LocalQuickFix fix : fixes) { fix.applyFix(project, descriptor); } } @NotNull @Override public String getName() { return GroovyBundle.message("fix.class", psiClass.getName()); } @Nls @NotNull @Override public String getFamilyName() { return GroovyBundle.message("intention.family.name.fix.range.class"); } }; } return null; }