Skip to content

Commit bd8d5f8

Browse files
[platform] Refactor: Replace repeated regex string literals with compiled Patterns and improve version comparisons
1 parent 7bae540 commit bd8d5f8

File tree

39 files changed

+157
-88
lines changed

39 files changed

+157
-88
lines changed

java/java-impl/src/com/intellij/codeInsight/NonCodeAnnotationsLineMarkerProvider.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,15 @@
4343
import javax.swing.*;
4444
import java.awt.event.MouseEvent;
4545
import java.util.*;
46+
import java.util.regex.Pattern;
4647
import java.util.stream.Collectors;
4748

4849
import static com.intellij.lang.documentation.QuickDocHighlightingHelper.CODE_BLOCK_PREFIX;
4950
import static com.intellij.lang.documentation.QuickDocHighlightingHelper.CODE_BLOCK_SUFFIX;
5051

5152
public abstract class NonCodeAnnotationsLineMarkerProvider extends LineMarkerProviderDescriptor {
5253
protected enum LineMarkerType { External, InferredNullability, InferredContract }
54+
private static final Pattern CODE_TAG_PATTERN = Pattern.compile("</?code>");
5355

5456
private static LineMarkerType getAnnotationLineMarkerType(Collection<? extends AnnotationDocGenerator> nonCodeAnnotations) {
5557
if (ContainerUtil.find(nonCodeAnnotations, (anno) -> !anno.isInferred()) != null) {
@@ -117,7 +119,9 @@ private LineMarkerInfo<?> buildLineMarkerInfo(@NotNull PsiElement element) {
117119

118120
String tooltip = XmlStringUtil.wrapInHtml(
119121
"<p>" + NonCodeAnnotationGenerator.getNonCodeHeaderAvailable(nonCodeAnnotations) + CommonXmlStrings.NBSP + JavaBundle.message("non.code.annotations.explanation.full.signature") + "\n" +
120-
CODE_BLOCK_PREFIX + JavaDocInfoGeneratorFactory.create(owner.getProject(), owner).generateSignature(owner).replaceAll("</?code>", "") + CODE_BLOCK_SUFFIX);
122+
CODE_BLOCK_PREFIX +
123+
CODE_TAG_PATTERN.matcher(JavaDocInfoGeneratorFactory.create(owner.getProject(), owner).generateSignature(owner)).replaceAll("") +
124+
CODE_BLOCK_SUFFIX);
121125
return new LineMarkerInfo<>(element, element.getTextRange(), AllIcons.Gutter.ExtAnnotation, __ -> tooltip, MyIconGutterHandler.INSTANCE,
122126
GutterIconRenderer.Alignment.RIGHT);
123127
}

java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public abstract class ImportClassFixBase<T extends PsiElement, R extends PsiRefe
5757
private final PsiFile myContainingPsiFile;
5858
private final boolean myInContent;
5959
private final ThreeState extensionsAllowToChangeFileSilently;
60+
private static final Pattern NO_AUTO_IMPORT_PATTERN = Pattern.compile(DaemonCodeAnalyzerSettings.getInstance().NO_AUTO_IMPORT_PATTERN);
6061

6162
@RequiresBackgroundThread
6263
@RequiresReadLock
@@ -96,7 +97,7 @@ protected boolean isStillAvailable() {
9697
}
9798
// ok, something did change. but can we still import? (in case of auto-import there maybe multiple fixes wanting to be executed)
9899
List<? extends PsiClass> classesToImport = getClassesToImport(true);
99-
return myContainingPsiFile.isValid() && !classesToImport.isEmpty() &&
100+
return myContainingPsiFile.isValid() && !classesToImport.isEmpty() &&
100101
!isClassDefinitelyPositivelyImportedAlready(myContainingPsiFile, classesToImport.get(0));
101102
}
102103

@@ -407,8 +408,7 @@ private boolean isReferenceNameForbiddenForAutoImport() {
407408
try {
408409
String name = getQualifiedName(myReferenceElement);
409410
if (name != null) {
410-
Pattern pattern = Pattern.compile(DaemonCodeAnalyzerSettings.getInstance().NO_AUTO_IMPORT_PATTERN);
411-
Matcher matcher = pattern.matcher(name);
411+
Matcher matcher = NO_AUTO_IMPORT_PATTERN.matcher(name);
412412
if (matcher.matches()) {
413413
return true;
414414
}

java/java-impl/src/com/siyeh/ig/naming/ClassNamingConvention.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@ public final class ClassNamingConvention extends NamingConvention<PsiClass> {
2525
public static final @NonNls String CLASS_NAMING_CONVENTION_SHORT_NAME = "ClassNamingConvention";
2626
private static final int DEFAULT_MIN_LENGTH = 8;
2727
private static final int DEFAULT_MAX_LENGTH = 64;
28+
private static final @NonNls NamingConventionBean DEFAULT_BEAN = new NamingConventionBean("[A-Z][A-Za-z\\d]*", DEFAULT_MIN_LENGTH, DEFAULT_MAX_LENGTH);
2829

2930
@Override
3031
public NamingConventionBean createDefaultBean() {
31-
return new NamingConventionBean("[A-Z][A-Za-z\\d]*", DEFAULT_MIN_LENGTH, DEFAULT_MAX_LENGTH);
32+
return DEFAULT_BEAN;
3233
}
3334

3435
@Override

java/java-impl/src/com/siyeh/ig/naming/InstanceMethodNamingConvention.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ public final class InstanceMethodNamingConvention extends NamingConvention<PsiMe
2727
private static final int DEFAULT_MIN_LENGTH = 4;
2828
private static final int DEFAULT_MAX_LENGTH = 32;
2929
public static final @NonNls String INSTANCE_METHOD_NAMING_CONVENTION = "InstanceMethodNamingConvention";
30-
30+
private static final @NonNls NamingConventionBean DEFAULT_BEAN = new NamingConventionBean("[a-z][A-Za-z\\d]*", DEFAULT_MIN_LENGTH, DEFAULT_MAX_LENGTH);
3131
@Override
3232
public NamingConventionBean createDefaultBean() {
33-
return new NamingConventionBean("[a-z][A-Za-z\\d]*", DEFAULT_MIN_LENGTH, DEFAULT_MAX_LENGTH);
33+
return DEFAULT_BEAN;
3434
}
3535

3636
@Override
@@ -47,4 +47,4 @@ public boolean isApplicable(PsiMethod member) {
4747
public String getShortName() {
4848
return INSTANCE_METHOD_NAMING_CONVENTION;
4949
}
50-
}
50+
}

java/java-impl/src/com/siyeh/ig/naming/NativeMethodNamingConvention.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@
2020
import com.intellij.psi.PsiMethod;
2121
import com.intellij.psi.PsiModifier;
2222
import com.siyeh.InspectionGadgetsBundle;
23+
import org.jetbrains.annotations.NonNls;
2324

2425
public final class NativeMethodNamingConvention extends NamingConvention<PsiMethod>{
2526

2627
private static final int DEFAULT_MIN_LENGTH = 4;
2728
private static final int DEFAULT_MAX_LENGTH = 32;
29+
private static final @NonNls NamingConventionBean DEFAULT_BEAN = new NamingConventionBean("[a-z][A-Za-z\\d]*", DEFAULT_MIN_LENGTH, DEFAULT_MAX_LENGTH);
2830

2931
@Override
3032
public String getElementDescription() {
@@ -33,7 +35,7 @@ public String getElementDescription() {
3335

3436
@Override
3537
public NamingConventionBean createDefaultBean() {
36-
return new NamingConventionBean("[a-z][A-Za-z\\d]*", DEFAULT_MIN_LENGTH, DEFAULT_MAX_LENGTH);
38+
return DEFAULT_BEAN;
3739
}
3840

3941
@Override
@@ -45,4 +47,4 @@ public boolean isApplicable(PsiMethod member) {
4547
public String getShortName() {
4648
return "NativeMethodNamingConvention";
4749
}
48-
}
50+
}

java/java-impl/src/com/siyeh/ig/naming/StaticMethodNamingConvention.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@
2020
import com.intellij.psi.PsiMethod;
2121
import com.intellij.psi.PsiModifier;
2222
import com.siyeh.InspectionGadgetsBundle;
23+
import org.jetbrains.annotations.NonNls;
2324

2425
public final class StaticMethodNamingConvention extends NamingConvention<PsiMethod> {
2526

2627

2728

2829
private static final int DEFAULT_MIN_LENGTH = 4;
2930
private static final int DEFAULT_MAX_LENGTH = 32;
31+
private static final @NonNls NamingConventionBean DEFAULT_BEAN = new NamingConventionBean("[a-z][A-Za-z\\d]*", DEFAULT_MIN_LENGTH, DEFAULT_MAX_LENGTH);
3032

3133
@Override
3234
public String getElementDescription() {
@@ -35,7 +37,7 @@ public String getElementDescription() {
3537

3638
@Override
3739
public NamingConventionBean createDefaultBean() {
38-
return new NamingConventionBean("[a-z][A-Za-z\\d]*", DEFAULT_MIN_LENGTH, DEFAULT_MAX_LENGTH);
40+
return DEFAULT_BEAN;
3941
}
4042

4143
@Override

java/java-impl/src/com/siyeh/ig/naming/TypeParameterNamingConvention.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,17 @@
2020
import com.intellij.psi.PsiClass;
2121
import com.intellij.psi.PsiTypeParameter;
2222
import com.siyeh.InspectionGadgetsBundle;
23+
import org.jetbrains.annotations.NonNls;
2324

2425
public final class TypeParameterNamingConvention extends NamingConvention<PsiClass> {
2526

2627
private static final int DEFAULT_MIN_LENGTH = 1;
2728
private static final int DEFAULT_MAX_LENGTH = 1;
29+
private static final @NonNls NamingConventionBean DEFAULT_BEAN = new NamingConventionBean("[A-Z][A-Za-z\\d]*", DEFAULT_MIN_LENGTH, DEFAULT_MAX_LENGTH);
2830

2931
@Override
3032
public NamingConventionBean createDefaultBean() {
31-
return new NamingConventionBean("[A-Z][A-Za-z\\d]*", DEFAULT_MIN_LENGTH, DEFAULT_MAX_LENGTH);
33+
return DEFAULT_BEAN;
3234
}
3335

3436
@Override

java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocUtil.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ public final class JavaDocUtil {
3232
private static final Logger LOG = Logger.getInstance(JavaDocUtil.class);
3333

3434
private static final @NonNls Pattern ourTypePattern = Pattern.compile("[ ]+[^ ^\\[^\\]]");
35+
private static final Pattern STAR_PATTERN = Pattern.compile("[*]");
36+
private static final Pattern LEADING_HASH = Pattern.compile("^#");
37+
private static final Pattern ALL_HASHES = Pattern.compile("#");
3538
private static final String JAVA_LANG = "java.lang.";
3639

3740
private JavaDocUtil() {
@@ -211,7 +214,7 @@ private static PsiJavaModule findModuleFromRef(@NotNull PsiManager manager,
211214
if (rparenIndex == -1) return null;
212215

213216
String parmsText = memberRefText.substring(parenthIndex + 1, rparenIndex).trim();
214-
StringTokenizer tokenizer = new StringTokenizer(parmsText.replaceAll("[*]", ""), ",");
217+
StringTokenizer tokenizer = new StringTokenizer(STAR_PATTERN.matcher(parmsText).replaceAll(""), ",");
215218
PsiType[] types = PsiType.createArray(tokenizer.countTokens());
216219
int i = 0;
217220
PsiElementFactory factory = JavaPsiFacade.getElementFactory(aClass.getProject());
@@ -369,7 +372,8 @@ public static String getLabelText(Project project, PsiManager manager, String re
369372
return refText;
370373
}
371374
if (refElement == null) {
372-
return refText.replaceFirst("^#", "").replaceAll("#", ".");
375+
String withoutLeading = LEADING_HASH.matcher(refText).replaceFirst("");
376+
return ALL_HASHES.matcher(withoutLeading).replaceAll(".");
373377
}
374378
int poundIndex = refText.indexOf('#');
375379
if (poundIndex < 0) {

platform/analysis-impl/src/com/intellij/codeInsight/intention/impl/config/IntentionActionWrapper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@
2323

2424
import java.util.Collection;
2525
import java.util.Set;
26+
import java.util.regex.Pattern;
2627

2728
public final class IntentionActionWrapper implements IntentionAction, ShortcutProvider, IntentionActionDelegate, Comparable<IntentionAction> {
2829
private final IntentionActionBean extension;
30+
private static final Pattern DOLLAR_PATTERN = Pattern.compile("\\$");
2931
private IntentionAction instance;
3032
private String fullFamilyName;
3133

@@ -41,7 +43,7 @@ public IntentionActionWrapper(@NotNull IntentionActionBean extension) {
4143

4244
@ApiStatus.Internal
4345
public static @NotNull String getDescriptionDirectoryName(@NotNull String fqn) {
44-
return fqn.substring(fqn.lastIndexOf('.') + 1).replaceAll("\\$", "");
46+
return DOLLAR_PATTERN.matcher(fqn.substring(fqn.lastIndexOf('.') + 1)).replaceAll("");
4547
}
4648

4749
@Override

platform/core-api/src/com/intellij/openapi/vfs/VfsUtilCore.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.net.URL;
2727
import java.nio.charset.Charset;
2828
import java.util.*;
29+
import java.util.regex.Pattern;
2930

3031
/**
3132
* Various utility methods for working with {@link VirtualFile}.
@@ -40,6 +41,7 @@ public class VfsUtilCore {
4041
public static final String VFS_SEPARATOR = "/";
4142

4243
private static final String PROTOCOL_DELIMITER = ":";
44+
private static final Pattern VFS_URL_SPLIT = Pattern.compile("://");
4345

4446
/**
4547
* @param strict if {@code false} then this method returns {@code true} if {@code ancestor} and {@code file} are equal
@@ -578,7 +580,7 @@ else if (c == ':') {
578580
}
579581
}
580582

581-
String[] split = vfsUrl.split("://");
583+
String[] split = VFS_URL_SPLIT.split(vfsUrl);
582584

583585
if (split.length != 2) {
584586
LOG.debug("Malformed VFS URL: " + vfsUrl);
@@ -789,7 +791,7 @@ else if (isOrphan2) {
789791
}
790792
return 0;
791793
}
792-
794+
793795
public static boolean hasInvalidFiles(@NotNull Iterable<? extends VirtualFile> files) {
794796
for (VirtualFile file : files) {
795797
if (!file.isValid()) {

0 commit comments

Comments
 (0)