package com.siberika.idea.pascal.lang.references.impl;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.refactoring.rename.RenamePsiElementProcessor;
import com.siberika.idea.pascal.PascalFileType;
import com.siberika.idea.pascal.ide.actions.SectionToggle;
import com.siberika.idea.pascal.lang.psi.PasFormalParameter;
import com.siberika.idea.pascal.lang.psi.PasFormalParameterSection;
import com.siberika.idea.pascal.lang.psi.PasModule;
import com.siberika.idea.pascal.lang.psi.PasNamedIdent;
import com.siberika.idea.pascal.lang.psi.PascalNamedElement;
import com.siberika.idea.pascal.lang.psi.impl.PascalRoutineImpl;
import com.siberika.idea.pascal.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
/**
* Author: George Bakhtadze
* Date: 20/03/2015
*/
public class PascalRenameProcessor extends RenamePsiElementProcessor {
@Override
public boolean canProcessElement(@NotNull PsiElement element) {
return (element instanceof PsiFile) || (element instanceof PasModule)
|| (element instanceof PascalNamedElement) && (element.getParent() instanceof PasFormalParameter);
}
@Override
public boolean isInplaceRenameSupported() {
return true;
}
@Override
public void prepareRenaming(PsiElement element, String newName, Map<PsiElement, String> allRenames) {
if (element instanceof PsiFile) {
PasModule module = PsiUtil.getElementPasModule(element);
if (module != null && module.isValid()) {
final String moduleName = FileUtil.getNameWithoutExtension(newName);
allRenames.put(module, moduleName);
}
} else if (element instanceof PasModule) {
PsiFile file = element.getContainingFile();
if (file != null && file.isValid()) {
final String fileName = FileUtil.getNameWithoutExtension(newName) + "." + PascalFileType.INSTANCE.getDefaultExtension();
allRenames.put(file, fileName);
}
} else if (element.getParent() instanceof PasFormalParameter) {
addRoutineRenames(element, allRenames, newName);
}
}
private void addRoutineRenames(PsiElement element, Map<PsiElement, String> allRenames, String newName) {
String name = ((PascalNamedElement) element).getName();
if (element.getParent() instanceof PasFormalParameter) {
PsiElement r = element.getParent().getParent().getParent();
if (r instanceof PascalRoutineImpl) {
PsiElement routine = SectionToggle.getImplementationOrDeclaration((PascalRoutineImpl) r);
if (routine instanceof PascalRoutineImpl) {
PasFormalParameterSection pars = ((PascalRoutineImpl) routine).getFormalParameterSection();
if (pars != null) for (PasFormalParameter parameter : pars.getFormalParameterList()) {
for (PasNamedIdent ident : parameter.getNamedIdentList()) {
if (name.equalsIgnoreCase(ident.getName())) {
allRenames.put(ident, newName);
}
}
}
}
}
}
}
}