package com.google.jstestdriver.idea.execution; import com.google.jstestdriver.idea.execution.settings.JstdRunSettings; import com.google.jstestdriver.idea.execution.settings.TestType; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiUtilBase; import com.intellij.refactoring.listeners.RefactoringElementListener; import com.intellij.refactoring.listeners.UndoRefactoringElementAdapter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class JstdRunConfigurationRefactoringHandler { @Nullable public static RefactoringElementListener getRefactoringElementListener(@NotNull JstdRunConfiguration configuration, @Nullable PsiElement element) { VirtualFile fileAtElement = PsiUtilBase.asVirtualFile(element); if (fileAtElement == null) { return null; } JstdRunSettings settings = configuration.getRunSettings(); String path = fileAtElement.getPath(); if (settings.getTestType() == TestType.ALL_CONFIGS_IN_DIRECTORY) { String allInDirectory = FileUtil.toSystemIndependentName(settings.getDirectory()); if (allInDirectory.equals(path)) { return new FilePathRefactoringElementListener(configuration, false, false, true); } } else { String jsFilePath = FileUtil.toSystemIndependentName(settings.getJsFilePath()); if (jsFilePath.equals(path)) { return new FilePathRefactoringElementListener(configuration, false, true, false); } String configFilePath = FileUtil.toSystemIndependentName(settings.getConfigFile()); if (configFilePath.equals(path)) { return new FilePathRefactoringElementListener(configuration, true, false, false); } } return null; } private static class FilePathRefactoringElementListener extends UndoRefactoringElementAdapter { private final JstdRunConfiguration myConfiguration; private final boolean myIsConfigFile; private final boolean myIsJsTestFile; private final boolean myIsAllInDirectory; private FilePathRefactoringElementListener(@NotNull JstdRunConfiguration configuration, boolean isConfigFile, boolean isJsTestFile, boolean isAllInDirectory) { myConfiguration = configuration; myIsConfigFile = isConfigFile; myIsJsTestFile = isJsTestFile; myIsAllInDirectory = isAllInDirectory; } @Override protected void refactored(@NotNull PsiElement element, @Nullable String oldQualifiedName) { VirtualFile newFile = PsiUtilBase.asVirtualFile(element); if (newFile != null) { String newPath = FileUtil.toSystemDependentName(newFile.getPath()); JstdRunSettings.Builder settingsBuilder = new JstdRunSettings.Builder(myConfiguration.getRunSettings()); if (myIsConfigFile) { settingsBuilder.setConfigFile(newPath); } if (myIsJsTestFile) { settingsBuilder.setJSFilePath(newPath); } if (myIsAllInDirectory) { settingsBuilder.setDirectory(newPath); } myConfiguration.setRunSettings(settingsBuilder.build()); } } } }