diff --git a/java/java-tests/testSrc/com/intellij/formatting/commandLine/FileSetFormatterTest.java b/java/java-tests/testSrc/com/intellij/formatting/commandLine/FileSetFormatterTest.java index e82aa7439654..69895d5897cf 100644 --- a/java/java-tests/testSrc/com/intellij/formatting/commandLine/FileSetFormatterTest.java +++ b/java/java-tests/testSrc/com/intellij/formatting/commandLine/FileSetFormatterTest.java @@ -43,6 +43,7 @@ public class FileSetFormatterTest extends LightPlatformTestCase { MessageOutput messageOutput = new MessageOutput(new PrintWriter(System.out), new PrintWriter(System.err)); FileSetFormatter formatter = new FileSetFormatter(messageOutput); formatter.addEntry(fileSpec); + formatter.addFileMask("*.java"); formatter.setRecursive(); formatter.setCodeStyleSettings(settings); formatter.processFiles(); diff --git a/platform/lang-impl/src/com/intellij/formatting/commandLine/FileSetProcessor.java b/platform/lang-impl/src/com/intellij/formatting/commandLine/FileSetProcessor.java index 3e1e4f6d018c..b934ff543d6c 100644 --- a/platform/lang-impl/src/com/intellij/formatting/commandLine/FileSetProcessor.java +++ b/platform/lang-impl/src/com/intellij/formatting/commandLine/FileSetProcessor.java @@ -18,7 +18,7 @@ package com.intellij.formatting.commandLine; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.containers.hash.HashSet; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import java.io.File; @@ -28,7 +28,8 @@ import java.util.Set; public abstract class FileSetProcessor { private static final Logger LOG = Logger.getInstance("#" + FileSetProcessor.class.getName()); - private Set myTopEntries = new HashSet<>(); + private Set myTopEntries = ContainerUtil.newHashSet(); + private Set myFileMasks = ContainerUtil.newHashSet(); private int myProcessedFiles; private boolean isRecursive; @@ -42,6 +43,21 @@ public abstract class FileSetProcessor { isRecursive = true; } + public void addFileMask(@NotNull String fileMask) { + String fileMaskRegexp = fileMaskToRegexp(fileMask); + LOG.info("File mask regexp: " + fileMaskRegexp); + myFileMasks.add(fileMaskRegexp); + } + + private static String fileMaskToRegexp(@NotNull String fileMask) { + return + fileMask + .replace(".", "\\.") + .replace("*", ".*") + .replace("?", ".") + .replace("+", "\\+"); + } + public void addEntry(@NotNull String filePath) throws IOException { File file = new File(filePath); if (!file.exists()) { @@ -64,17 +80,28 @@ public abstract class FileSetProcessor { } } else { - VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(entry); - if (virtualFile == null) { - throw new IOException("Can not find " + entry.getPath()); + if (matchesFileMask(entry.getName())) { + VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(entry); + if (virtualFile == null) { + throw new IOException("Can not find " + entry.getPath()); + } + LOG.info("Processing " + virtualFile.getPath()); + processFile(virtualFile); + myProcessedFiles++; } - LOG.info("Processing " + virtualFile.getPath()); - processFile(virtualFile); - myProcessedFiles++; } } } + private boolean matchesFileMask(@NotNull String name) { + for (String fileMask : myFileMasks) { + if (name.matches(fileMask)) { + return true; + } + } + return false; + } + protected abstract void processFile(@NotNull VirtualFile virtualFile); public int getProcessedFiles() { diff --git a/platform/lang-impl/src/com/intellij/formatting/commandLine/FormatterStarter.java b/platform/lang-impl/src/com/intellij/formatting/commandLine/FormatterStarter.java index 5abf46e9d46f..8f7ad7f66d81 100644 --- a/platform/lang-impl/src/com/intellij/formatting/commandLine/FormatterStarter.java +++ b/platform/lang-impl/src/com/intellij/formatting/commandLine/FormatterStarter.java @@ -75,7 +75,7 @@ public class FormatterStarter extends ApplicationStarterEx { //noinspection AssignmentToForLoopParameter i ++; if (i >= args.length) { - fatalError(messageOutput, "Mising settings file path."); + fatalError(messageOutput, "Missing settings file path."); } try { CodeStyleSettings settings = readSettings(args[i]); @@ -88,6 +88,18 @@ public class FormatterStarter extends ApplicationStarterEx { else if (checkOption(args[i], "-r", "-R")) { fileSetFormatter.setRecursive(); } + else if (checkOption(args[i], "-m", "-mask")) { + //noinspection AssignmentToForLoopParameter + i ++; + if (i >= args.length) { + fatalError(messageOutput, "Missing file mask(s)."); + } + for (String mask : args[i].split(",")) { + if (!mask.isEmpty()) { + fileSetFormatter.addFileMask(mask); + } + } + } else { fatalError(messageOutput, "Unknown option " + args[i]); } @@ -143,6 +155,7 @@ public class FormatterStarter extends ApplicationStarterEx { messageOutput.info(" -h|-help Show a help message and exit."); messageOutput.info(" -s|-settings A path to Intellij IDEA code style settings .xml file.\n"); messageOutput.info(" -r|-R Scan directories recursively.\n"); + messageOutput.info(" -m|-mask A comma-separated list of file masks."); messageOutput.info(" path A path to a file or a directory.\n"); System.exit(0); }