From f9de08d149914ffb667000beb66396c42ba89b40 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 27 Apr 2012 20:14:11 +0200 Subject: [PATCH] cleanup, don't cache matchers --- .../completion/JavaCompletionContributor.java | 5 +- .../completion/JavaNoVariantsDelegator.java | 2 +- .../XmlBasicToClassNameDelegator.java | 2 +- .../completion/CompletionParameters.java | 22 ++---- .../completion/CodeCompletionHandlerBase.java | 2 +- .../RelaxedMatchingContributor.java | 77 ------------------- .../completion/impl/CamelHumpMatcher.java | 74 +++--------------- .../impl/CompletionServiceImpl.java | 8 +- .../GroovyCompletionContributor.java | 2 +- .../completion/GroovyNoVariantsDelegator.java | 2 +- 10 files changed, 25 insertions(+), 171 deletions(-) delete mode 100644 platform/lang-impl/src/com/intellij/codeInsight/completion/RelaxedMatchingContributor.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index c0b0f557e958..2e787a533784 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -241,7 +241,7 @@ public class JavaCompletionContributor extends CompletionContributor { public static void addAllClasses(CompletionParameters parameters, final CompletionResultSet result, final InheritorsHolder inheritors) { - if (!isClassNamePossible(parameters.getPosition()) || !mayStartClassName(result, parameters.isRelaxedMatching())) return; + if (!isClassNamePossible(parameters.getPosition()) || !mayStartClassName(result)) return; if (mayShowAllClasses(parameters)) { JavaClassNameCompletionContributor.addAllClasses(parameters, parameters.getInvocationCount() <= 2, result.getPrefixMatcher(), new Consumer() { @@ -385,14 +385,13 @@ public class JavaCompletionContributor extends CompletionContributor { return Registry.is("show.all.classes.on.first.completion") || parameters.getInvocationCount() >= 2; } - public static boolean mayStartClassName(CompletionResultSet result, final boolean relaxedMatching) { + public static boolean mayStartClassName(CompletionResultSet result) { String prefix = result.getPrefixMatcher().getPrefix(); if (StringUtil.isEmpty(prefix)) { return false; } return StringUtil.isCapitalized(prefix) || - relaxedMatching || CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE == CodeInsightSettings.NONE; } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java index 669905ed006e..78a87644b8ed 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java @@ -63,7 +63,7 @@ public class JavaNoVariantsDelegator extends CompletionContributor { suggestCollectionUtilities(parameters, result, position); if (parameters.getInvocationCount() <= 1 && - JavaCompletionContributor.mayStartClassName(result, false) && + JavaCompletionContributor.mayStartClassName(result) && JavaCompletionContributor.isClassNamePossible(position)) { suggestNonImportedClasses(parameters, result); return; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/XmlBasicToClassNameDelegator.java b/java/java-impl/src/com/intellij/codeInsight/completion/XmlBasicToClassNameDelegator.java index f5a864885480..96e174e1eb04 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/XmlBasicToClassNameDelegator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/XmlBasicToClassNameDelegator.java @@ -28,7 +28,7 @@ public class XmlBasicToClassNameDelegator extends AbstractBasicToClassNameDelega @Override protected boolean isClassNameCompletionSupported(CompletionResultSet result, PsiFile file, PsiElement position) { - if (!JavaCompletionContributor.mayStartClassName(result, false)) return false; + if (!JavaCompletionContributor.mayStartClassName(result)) return false; return file.getLanguage().isKindOf(StdLanguages.XML); } diff --git a/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionParameters.java b/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionParameters.java index 61fa75a9ff2a..e472a553e366 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionParameters.java +++ b/platform/lang-api/src/com/intellij/codeInsight/completion/CompletionParameters.java @@ -24,17 +24,16 @@ import com.intellij.psi.PsiFile; /** * @author peter */ -public class CompletionParameters { +public final class CompletionParameters { private final PsiElement myPosition; private final PsiFile myOriginalFile; private final CompletionType myCompletionType; private final Lookup myLookup; private final int myOffset; private final int myInvocationCount; - private final boolean myRelaxedMatching; - protected CompletionParameters(@NotNull final PsiElement position, @NotNull final PsiFile originalFile, - final CompletionType completionType, int offset, final int invocationCount, Lookup lookup, final boolean relaxedMatching) { + CompletionParameters(@NotNull final PsiElement position, @NotNull final PsiFile originalFile, + final CompletionType completionType, int offset, final int invocationCount, Lookup lookup) { assert offset >= position.getTextRange().getStartOffset(); myPosition = position; assert position.isValid(); @@ -42,20 +41,15 @@ public class CompletionParameters { myCompletionType = completionType; myOffset = offset; myInvocationCount = invocationCount; - myRelaxedMatching = relaxedMatching; myLookup = lookup; } public CompletionParameters withType(CompletionType type) { - return new CompletionParameters(myPosition, myOriginalFile, type, myOffset, myInvocationCount, myLookup, myRelaxedMatching); + return new CompletionParameters(myPosition, myOriginalFile, type, myOffset, myInvocationCount, myLookup); } public CompletionParameters withInvocationCount(int newCount) { - return new CompletionParameters(myPosition, myOriginalFile, myCompletionType, myOffset, newCount, myLookup, myRelaxedMatching); - } - - public CompletionParameters withRelaxedMatching() { - return new CompletionParameters(myPosition, myOriginalFile, myCompletionType, myOffset, myInvocationCount, myLookup, true); + return new CompletionParameters(myPosition, myOriginalFile, myCompletionType, myOffset, newCount, myLookup); } @NotNull @@ -101,11 +95,7 @@ public class CompletionParameters { return myInvocationCount == 0; } - public boolean isRelaxedMatching() { - return myRelaxedMatching; - } - public CompletionParameters withPosition(PsiElement element, int offset) { - return new CompletionParameters(element, myOriginalFile, myCompletionType, offset, myInvocationCount, myLookup, myRelaxedMatching); + return new CompletionParameters(element, myOriginalFile, myCompletionType, offset, myInvocationCount, myLookup); } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index 3a860e8e8ff5..3214d978bcca 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -379,7 +379,7 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { PsiFile originalFile = fileCopy.getOriginalFile(); final PsiElement insertedElement = findCompletionPositionLeaf(newContext, offset, fileCopy, originalFile); insertedElement.putUserData(CompletionContext.COMPLETION_CONTEXT_KEY, newContext); - return new CompletionParameters(insertedElement, originalFile, myCompletionType, offset, invocationCount, obtainLookup(initContext.getEditor()), false); + return new CompletionParameters(insertedElement, originalFile, myCompletionType, offset, invocationCount, obtainLookup(initContext.getEditor())); } @NotNull diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/RelaxedMatchingContributor.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/RelaxedMatchingContributor.java deleted file mode 100644 index 5a02c8171c9a..000000000000 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/RelaxedMatchingContributor.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2000-2011 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.codeInsight.completion; - -import com.intellij.codeInsight.template.impl.LiveTemplateLookupElement; -import com.intellij.patterns.PatternCondition; -import com.intellij.patterns.StandardPatterns; -import com.intellij.util.Consumer; -import com.intellij.util.ProcessingContext; -import org.jetbrains.annotations.NotNull; - -import java.util.HashSet; -import java.util.Set; - -/** - * @author peter - */ -public class RelaxedMatchingContributor extends CompletionContributor { - - @Override - public void fillCompletionVariants(CompletionParameters parameters, final CompletionResultSet result) { - final Set elements = result.runRemainingContributors(parameters, true); - - if (!elements.isEmpty() && parameters.getInvocationCount() == 0) { - Set prefixes = new HashSet(); - for (CompletionResult element : elements) { - prefixes.add(element.getPrefixMatcher().getPrefix()); - } - for (String prefix : prefixes) { - result.withPrefixMatcher(prefix) - .restartCompletionOnPrefixChange(StandardPatterns.string().with(new PatternCondition("noneMatch") { - @Override - public boolean accepts(@NotNull String s, ProcessingContext context) { - for (CompletionResult element : elements) { - if (element.getPrefixMatcher().cloneWithPrefix(s).prefixMatches(element.getLookupElement())) { - return false; - } - } - return true; - } - })); - } - } - - CompletionParameters relaxed; - if (parameters.getInvocationCount() == 0 && (elements.isEmpty() || elements.size() == 1 && elements.iterator().next().getLookupElement().as( - LiveTemplateLookupElement.class) != null)) { - relaxed = parameters.withRelaxedMatching(); - } - else if (parameters.getInvocationCount() >= 2) { - relaxed = parameters.withRelaxedMatching().withInvocationCount(parameters.getInvocationCount() - 1); - } - else { - return; - } - - result.runRemainingContributors(relaxed, new Consumer() { - @Override - public void consume(CompletionResult element) { - result.passResult(element); - } - }); - } -} diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java index 991bbd0d15b1..b18be5f4c57b 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java @@ -7,90 +7,41 @@ import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.codeStyle.NameUtil; -import com.intellij.util.containers.hash.LinkedHashMap; import com.intellij.util.text.Matcher; import org.jetbrains.annotations.NotNull; -import java.util.Map; - /** * @author peter */ public class CamelHumpMatcher extends PrefixMatcher { - private static int ourLastCompletionCaseSetting = -1; - private static final Map ourPatternCache = new LinkedHashMap() { - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > 10; - } - }; - private Matcher myMatcher; + private final Matcher myMatcher; private final boolean myCaseSensitive; - private final int currentSetting; - private final boolean myRelaxedMatching; public CamelHumpMatcher(@NotNull final String prefix) { - this(prefix, true, false); + this(prefix, true); } - public CamelHumpMatcher(String prefix, boolean caseSensitive, boolean relaxedMatching) { + public CamelHumpMatcher(String prefix, boolean caseSensitive) { super(prefix); - myRelaxedMatching = relaxedMatching; - currentSetting = CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE; myCaseSensitive = caseSensitive; + myMatcher = createMatcher(myCaseSensitive); } public boolean prefixMatches(@NotNull final String name) { - synchronized (ourPatternCache) { - if (myMatcher == null) { - if (ourLastCompletionCaseSetting != currentSetting) { - ourPatternCache.clear(); - ourLastCompletionCaseSetting = currentSetting; - } - - myMatcher = obtainMatcher(myRelaxedMatching, myCaseSensitive); - } - if (myMatcher.matches(name)) { - if (myRelaxedMatching && obtainMatcher(false, myCaseSensitive).matches(name)) { - return false; - } - - return true; - } - return false; - } + return myMatcher.matches(name); } - private Matcher obtainMatcher(final boolean relax, final boolean caseSensitive) { - String key = relax + myPrefix + caseSensitive; - Matcher pattern = ourPatternCache.get(key); - if (pattern == null) { - pattern = createCamelHumpsMatcher(relax, caseSensitive, myPrefix); - ourPatternCache.put(key, pattern); - } - return pattern; - } - - public boolean prefixMatches(@NotNull final LookupElement element) { return prefixMatchersInternal(element, !element.isCaseSensitive()); } private boolean prefixMatchersInternal(final LookupElement element, final boolean itemCaseInsensitive) { - if (itemCaseInsensitive && myRelaxedMatching) { - return false; - } - for (final String name : element.getAllLookupStrings()) { if (itemCaseInsensitive && StringUtil.startsWithIgnoreCase(name, myPrefix) || prefixMatches(name)) { return true; } if (itemCaseInsensitive && CodeInsightSettings.ALL != CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE) { - Matcher matcher; - synchronized (ourPatternCache) { - matcher = obtainMatcher(false, false); - } - if (matcher.matches(name)) { + if (createMatcher(false).matches(name)) { return true; } } @@ -100,20 +51,16 @@ public class CamelHumpMatcher extends PrefixMatcher { @NotNull public PrefixMatcher cloneWithPrefix(@NotNull final String prefix) { - return new CamelHumpMatcher(prefix, myCaseSensitive, myRelaxedMatching); + return new CamelHumpMatcher(prefix, myCaseSensitive); } - private static Matcher createCamelHumpsMatcher(final boolean relaxedMatching, final boolean caseSensitive, String prefix) { - prefix = applyMiddleMatching(prefix); + private Matcher createMatcher(final boolean caseSensitive) { + String prefix = applyMiddleMatching(myPrefix); if (!caseSensitive) { return NameUtil.buildCompletionMatcher(prefix, 0, true, true); } - if (relaxedMatching) { - return NameUtil.buildCompletionMatcher(prefix, 0, true, true); - } - switch (CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE) { case CodeInsightSettings.NONE: return NameUtil.buildCompletionMatcher(prefix, 0, true, true); @@ -139,7 +86,4 @@ public class CamelHumpMatcher extends PrefixMatcher { return myPrefix; } - public boolean isRelaxedMatching() { - return myRelaxedMatching; - } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CompletionServiceImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CompletionServiceImpl.java index a5d522045468..aa3a9510ae46 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CompletionServiceImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CompletionServiceImpl.java @@ -90,7 +90,7 @@ public class CompletionServiceImpl extends CompletionService{ throw new AssertionError("createResultSet may be invoked only from completion thread: " + indicator + "!=" + getCurrentCompletion() + "; phase set at " + ourPhaseTrace); } CompletionProgressIndicator process = (CompletionProgressIndicator)indicator; - CamelHumpMatcher matcher = new CamelHumpMatcher(prefix, true, parameters.isRelaxedMatching()); + CamelHumpMatcher matcher = new CamelHumpMatcher(prefix); CompletionSorterImpl sorter = defaultSorter(parameters, matcher); return new CompletionResultSetImpl(consumer, textBeforePosition, matcher, contributor,parameters, sorter, process, null); } @@ -157,8 +157,7 @@ public class CompletionServiceImpl extends CompletionService{ @NotNull public CompletionResultSet withPrefixMatcher(@NotNull final String prefix) { - boolean relaxed = getPrefixMatcher() instanceof CamelHumpMatcher && ((CamelHumpMatcher)getPrefixMatcher()).isRelaxedMatching(); - return withPrefixMatcher(new CamelHumpMatcher(prefix, true, relaxed)); + return withPrefixMatcher(new CamelHumpMatcher(prefix)); } @NotNull @@ -170,8 +169,7 @@ public class CompletionServiceImpl extends CompletionService{ @NotNull @Override public CompletionResultSet caseInsensitive() { - boolean relaxed = getPrefixMatcher() instanceof CamelHumpMatcher && ((CamelHumpMatcher)getPrefixMatcher()).isRelaxedMatching(); - return withPrefixMatcher(new CamelHumpMatcher(getPrefixMatcher().getPrefix(), false, relaxed)); + return withPrefixMatcher(new CamelHumpMatcher(getPrefixMatcher().getPrefix(), false)); } @Override diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java index c320906672d0..b9c66f060cbe 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java @@ -332,7 +332,7 @@ public class GroovyCompletionContributor extends CompletionContributor { if (reference.getQualifier() == null) { GroovySmartCompletionContributor.addExpectedClassMembers(parameters, result); - if (isClassNamePossible(position) && JavaCompletionContributor.mayStartClassName(result, parameters.isRelaxedMatching())) { + if (isClassNamePossible(position) && JavaCompletionContributor.mayStartClassName(result)) { if (JavaCompletionContributor.mayShowAllClasses(parameters)) { addAllClasses(parameters, result, inheritors); } else { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java index cba75c7052a9..3efdb7210d84 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java @@ -51,7 +51,7 @@ public class GroovyNoVariantsDelegator extends CompletionContributor { private static void delegate(CompletionParameters parameters, CompletionResultSet result) { if (parameters.getCompletionType() == CompletionType.BASIC) { if (parameters.getInvocationCount() <= 1 && - JavaCompletionContributor.mayStartClassName(result, false) && + JavaCompletionContributor.mayStartClassName(result) && GroovyCompletionContributor.isClassNamePossible(parameters.getPosition()) && !MapArgumentCompletionProvider.isMapKeyCompletion(parameters)) { suggestNonImportedClasses(parameters, result);