package com.intellij.lang.javascript.linter.tslint.fix;
import com.intellij.history.LocalHistory;
import com.intellij.lang.javascript.JSBundle;
import com.intellij.lang.javascript.ecmascript6.TypeScriptUtil;
import com.intellij.lang.javascript.linter.JSLinterConfiguration;
import com.intellij.lang.javascript.linter.JSLinterFixAction;
import com.intellij.lang.javascript.linter.tslint.TsLintBundle;
import com.intellij.lang.javascript.linter.tslint.config.TsLintConfiguration;
import com.intellij.lang.javascript.linter.tslint.config.TsLintState;
import com.intellij.lang.javascript.linter.tslint.execution.TsLinterError;
import com.intellij.lang.javascript.linter.tslint.service.TsLintLanguageService;
import com.intellij.lang.javascript.service.JSLanguageServiceUtil;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Future;
public class TsLintFileFixAction extends JSLinterFixAction {
public TsLintFileFixAction() {
super(TsLintBundle.message("tslint.framework.title"),
TsLintBundle.message("tslint.action.fix.all.problem.title"), null);
}
@NotNull
@Override
protected JSLinterConfiguration getConfiguration(Project project) {
return TsLintConfiguration.getInstance(project);
}
@Override
protected Task createTask(@NotNull Project project, @NotNull Collection<VirtualFile> filesToProcess, @NotNull Runnable completeCallback) {
LocalHistory
.getInstance().putSystemLabel(project, JSBundle
.message("javascript.linter.action.fix.problems.name.start", TsLintBundle.message("tslint.framework.title")));
return new Task.Backgroundable(project, TsLintBundle.message("tslint.action.background.title"), true) {
@Override
public void run(@NotNull ProgressIndicator indicator) {
TsLintLanguageService service = TsLintLanguageService.getService(project);
TsLintState state = TsLintConfiguration.getInstance(project).getExtendedState().getState();
for (VirtualFile file : filesToProcess) {
indicator.setText("Processing file " + file.getCanonicalPath());
Future<List<TsLinterError>> future = ReadAction.compute(() -> service.highlightAndFix(file, state));
JSLanguageServiceUtil.awaitFuture(future,
JSLanguageServiceUtil.TIMEOUT_MILLS,
JSLanguageServiceUtil.QUOTA_MILLS,
indicator);
}
completeCallback.run();
}
};
}
protected Collection<FileType> getFileTypes() {
return TypeScriptUtil.TYPESCRIPT_FILE_TYPES;
}
}