From e37a46ecc27c62026da16be9495128b4cf913878 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 20 Feb 2012 13:39:49 +0100 Subject: [PATCH] faster word* and *word* file name mask matching --- .../fileTypes/WildcardFileNameMatcher.java | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/fileTypes/WildcardFileNameMatcher.java b/platform/platform-api/src/com/intellij/openapi/fileTypes/WildcardFileNameMatcher.java index 6823c5d7c4be..8fa84a4bf55d 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileTypes/WildcardFileNameMatcher.java +++ b/platform/platform-api/src/com/intellij/openapi/fileTypes/WildcardFileNameMatcher.java @@ -60,14 +60,47 @@ public class WildcardFileNameMatcher implements FileNameMatcher { } } + private static final class PrefixMatcher implements MaskMatcher { + private final String myPrefix; + + private PrefixMatcher(final String prefix) { + myPrefix = prefix; + } + + public boolean matches(final String filename) { + return filename.startsWith(myPrefix); + } + } + + private static final class InfixMatcher implements MaskMatcher { + private final String myInfix; + + private InfixMatcher(final String infix) { + myInfix = infix; + } + + public boolean matches(final String filename) { + return filename.contains(myInfix); + } + } + public WildcardFileNameMatcher(@NotNull @NonNls String pattern) { myPattern = pattern; myMatcher = createMatcher(pattern); } private static MaskMatcher createMatcher(final String pattern) { - if (pattern.length() > 1 && pattern.charAt(0) == '*' && pattern.indexOf('*', 1) < 0 && pattern.indexOf('?') < 0) { - return new SuffixMatcher(pattern.substring(1)); + int len = pattern.length(); + if (len > 1 && pattern.indexOf('?') < 0) { + if (pattern.charAt(0) == '*' && pattern.indexOf('*', 1) < 0) { + return new SuffixMatcher(pattern.substring(1)); + } + if (pattern.indexOf('*') == len - 1) { + return new PrefixMatcher(pattern.substring(0, len - 1)); + } + if (len > 2 && pattern.charAt(0) == '*' && pattern.indexOf('*', 1) == len - 1) { + return new InfixMatcher(pattern.substring(1, len - 1)); + } } return new RegexpMatcher(pattern); }