private void processPropertyFromField( @NotNull GrField field, @NotNull GroovyResolveResult resolveResult) { if (field.getGetters().length != 0 || field.getSetter() != null || !myPropertyNames.add(field.getName()) || myIsMap) return; for (LookupElement element : GroovyCompletionUtil.createLookupElements(resolveResult, false, myMatcher, null)) { myConsumer.consume( ((LookupElementBuilder) element).withIcon(JetgroovyIcons.Groovy.Property)); } }
@Override public void processDynamicElements( @NotNull PsiType qualifierType, PsiClass aClass, PsiScopeProcessor processor, GroovyPsiElement place, ResolveState state) { ClassHint classHint = processor.getHint(ClassHint.KEY); if (classHint != null && !classHint.shouldProcess(ClassHint.ResolveKind.PROPERTY)) return; String nameHint = ResolveUtil.getNameHint(processor); Map<String, PsiClass> supers = TypesUtil.getSuperClassesWithCache(aClass); PsiElement grCall = place.getParent(); if (grCall instanceof GrMethodCall) { PsiElement grClosure = grCall.getParent(); if (grClosure instanceof GrClosableBlock) { PsiElement contentField = grClosure.getParent(); if (contentField instanceof GrField) { GrField f = (GrField) contentField; if ("content".equals(f.getName()) && f.hasModifierProperty(PsiModifier.STATIC) && f.getContainingClass() == aClass) { Map<String, PsiField> elements = GebUtil.getContentElements(aClass); for (PsiField field : elements.values()) { if (field.getNavigationElement() == place) { return; // Don't resolve variable definition. } } } } } } for (PsiClass psiClass : supers.values()) { Map<String, PsiField> contentFields = GebUtil.getContentElements(psiClass); if (nameHint == null) { for (Map.Entry<String, PsiField> entry : contentFields.entrySet()) { if (!processor.execute(entry.getValue(), state)) return; } } else { PsiField field = contentFields.get(nameHint); if (field != null) { processor.execute(field, state); return; } } } }
@Override public void findExistingNameConflicts( PsiElement element, String newName, MultiMap<PsiElement, String> conflicts) { super.findExistingNameConflicts(element, newName, conflicts); GrField field = (GrField) element; final PsiClass containingClass = field.getContainingClass(); if (containingClass == null) return; final PsiMethod getter = GroovyPropertyUtils.findGetterForField(field); if (getter instanceof GrAccessorMethod) { final PsiMethod newGetter = PropertyUtil.findPropertyGetter( containingClass, newName, field.hasModifierProperty(PsiModifier.STATIC), true); if (newGetter != null && !(newGetter instanceof GrAccessorMethod)) { conflicts.putValue( newGetter, GroovyRefactoringBundle.message( "implicit.getter.will.by.overriden.by.method", field.getName(), newGetter.getName())); } } final PsiMethod setter = GroovyPropertyUtils.findSetterForField(field); if (setter instanceof GrAccessorMethod) { final PsiMethod newSetter = PropertyUtil.findPropertySetter( containingClass, newName, field.hasModifierProperty(PsiModifier.STATIC), true); if (newSetter != null && !(newSetter instanceof GrAccessorMethod)) { conflicts.putValue( newSetter, GroovyRefactoringBundle.message( "implicit.setter.will.by.overriden.by.method", field.getName(), newSetter.getName())); } } }
public void putNewElements(@NotNull GrField field) { myNewElements.put(field.getName(), field); if (field.isProperty()) { for (GrAccessorMethod newGetter : field.getGetters()) { myNewElements.put(newGetter.getName(), newGetter); } final GrAccessorMethod newSetter = field.getSetter(); if (newSetter != null) { myNewElements.put(newSetter.getName(), newSetter); } } }
@Override public void renameElement( final PsiElement psiElement, String newName, final UsageInfo[] usages, @Nullable RefactoringElementListener listener) throws IncorrectOperationException { final GrField field = (GrField) psiElement; String fieldName = field.getName(); NameProvider nameProvider = new NameProvider(field, newName); MultiMap<PsiNamedElement, UsageInfo> propertyUsages = MultiMap.createLinked(); MultiMap<PsiNamedElement, UsageInfo> simpleUsages = MultiMap.createLinked(); List<PsiReference> unknownUsages = new ArrayList<>(); for (UsageInfo usage : usages) { final PsiReference ref = usage.getReference(); if (ref instanceof GrReferenceExpression) { final GroovyResolveResult resolveResult = ((GrReferenceExpression) ref).advancedResolve(); final PsiElement element = resolveResult.getElement(); if (resolveResult.isInvokedOnProperty()) { propertyUsages.putValue((PsiNamedElement) element, usage); } else { simpleUsages.putValue((PsiNamedElement) element, usage); } } else if (ref != null) { unknownUsages.add(ref); } } for (PsiReference ref : unknownUsages) { handleElementRename(newName, ref, fieldName); } field.setName(newName); nameProvider.putNewElements(field); PsiManager manager = field.getManager(); for (PsiNamedElement element : simpleUsages.keySet()) { for (UsageInfo info : simpleUsages.get(element)) { final String name = nameProvider.getNewName(element); rename( nameProvider.getNewElement(element), info, name == null ? newName : name, name != null, manager); } } for (PsiNamedElement element : propertyUsages.keySet()) { for (UsageInfo info : propertyUsages.get(element)) { rename(element, info, newName, true, manager); } } if (listener != null) { listener.elementRenamed(field); } }
@Override protected void processIntention(@NotNull PsiElement element, Project project, Editor editor) throws IncorrectOperationException { final GrField field; if (element.getParent() instanceof GrField) { field = (GrField) element.getParent(); } else { final PsiReference ref = element.getReference(); LOG.assertTrue(ref != null); PsiElement resolved = ref.resolve(); if (resolved instanceof GrAccessorMethod) { resolved = ((GrAccessorMethod) resolved).getProperty(); } LOG.assertTrue(resolved instanceof GrField); field = (GrField) resolved; } final HashSet<PsiReference> usages = new HashSet<PsiReference>(); usages.addAll(ReferencesSearch.search(field).findAll()); final GrAccessorMethod[] getters = field.getGetters(); for (GrAccessorMethod getter : getters) { usages.addAll(MethodReferencesSearch.search(getter).findAll()); } final GrAccessorMethod setter = field.getSetter(); if (setter != null) { usages.addAll(MethodReferencesSearch.search(setter).findAll()); } final String fieldName = field.getName(); LOG.assertTrue(fieldName != null); final Collection<PsiElement> fieldUsages = new HashSet<PsiElement>(); MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>(); for (PsiReference usage : usages) { final PsiElement psiElement = usage.getElement(); if (PsiUtil.isMethodUsage(psiElement)) continue; if (!GroovyFileType.GROOVY_LANGUAGE.equals(psiElement.getLanguage())) { conflicts.putValue( psiElement, GroovyIntentionsBundle.message("closure.is.accessed.outside.of.groovy", fieldName)); } else { if (psiElement instanceof GrReferenceExpression) { fieldUsages.add(psiElement); if (PsiUtil.isAccessedForWriting((GrExpression) psiElement)) { conflicts.putValue( psiElement, GroovyIntentionsBundle.message("write.access.to.closure.variable", fieldName)); } } else if (psiElement instanceof GrArgumentLabel) { conflicts.putValue( psiElement, GroovyIntentionsBundle.message("field.is.used.in.argument.label", fieldName)); } } } final PsiClass containingClass = field.getContainingClass(); final GrExpression initializer = field.getInitializerGroovy(); LOG.assertTrue(initializer != null); final PsiType type = initializer.getType(); LOG.assertTrue(type instanceof GrClosureType); final GrSignature signature = ((GrClosureType) type).getSignature(); final List<MethodSignature> signatures = GrClosureSignatureUtil.generateAllMethodSignaturesBySignature(fieldName, signature); for (MethodSignature s : signatures) { final PsiMethod method = MethodSignatureUtil.findMethodBySignature(containingClass, s, true); if (method != null) { conflicts.putValue( method, GroovyIntentionsBundle.message( "method.with.signature.already.exists", GroovyPresentationUtil.getSignaturePresentation(s))); } } if (conflicts.size() > 0) { final ConflictsDialog conflictsDialog = new ConflictsDialog( project, conflicts, new Runnable() { @Override public void run() { execute(field, fieldUsages); } }); conflictsDialog.show(); if (conflictsDialog.getExitCode() != DialogWrapper.OK_EXIT_CODE) return; } execute(field, fieldUsages); }
private static void execute(final GrField field, final Collection<PsiElement> fieldUsages) { final GroovyPsiElementFactory factory = GroovyPsiElementFactory.getInstance(field.getProject()); final StringBuilder builder = new StringBuilder(field.getTextLength()); final GrClosableBlock block = (GrClosableBlock) field.getInitializerGroovy(); final GrModifierList modifierList = field.getModifierList(); if (modifierList.getModifiers().length > 0 || modifierList.getAnnotations().length > 0) { builder.append(modifierList.getText()); } else { builder.append(GrModifier.DEF); } builder.append(' ').append(field.getName()); builder.append('('); if (block.hasParametersSection()) { builder.append(block.getParameterList().getText()); } else { builder.append("def it = null"); } builder.append(") {"); ApplicationManager.getApplication() .runWriteAction( new Runnable() { public void run() { block.getParameterList().delete(); block.getLBrace().delete(); final PsiElement psiElement = PsiUtil.skipWhitespacesAndComments(block.getFirstChild(), true); if (psiElement != null && "->".equals(psiElement.getText())) { psiElement.delete(); } builder.append(block.getText()); final GrMethod method = GroovyPsiElementFactory.getInstance(field.getProject()) .createMethodFromText(builder.toString()); field.getParent().replace(method); for (PsiElement usage : fieldUsages) { if (usage instanceof GrReferenceExpression) { final PsiElement parent = usage.getParent(); StringBuilder newRefText = new StringBuilder(); if (parent instanceof GrReferenceExpression && usage == ((GrReferenceExpression) parent).getQualifier() && "call".equals(((GrReferenceExpression) parent).getReferenceName())) { newRefText.append(usage.getText()); usage = parent; } else { PsiElement qualifier = ((GrReferenceExpression) usage).getQualifier(); if (qualifier == null) { if (parent instanceof GrReferenceExpression && ((GrReferenceExpression) parent).getQualifier() != null && usage != ((GrReferenceExpression) parent).getQualifier()) { qualifier = ((GrReferenceExpression) parent).getQualifier(); usage = parent; } } if (qualifier != null) { newRefText.append(qualifier.getText()).append('.'); ((GrReferenceExpression) usage).setQualifier(null); } else { newRefText.append("this."); } newRefText.append('&').append(usage.getText()); } usage.replace(factory.createReferenceExpressionFromText(newRefText.toString())); } } } }); }