mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
java smart completion: use less code to replace method calls
This commit is contained in:
@@ -716,8 +716,6 @@ public class JavaCompletionContributor extends CompletionContributor {
|
||||
}
|
||||
}
|
||||
|
||||
JavaCompletionUtil.initOffsets(file, context.getOffsetMap());
|
||||
|
||||
if (context.getCompletionType() == CompletionType.BASIC) {
|
||||
if (semicolonNeeded(context.getEditor(), file, context.getStartOffset())) {
|
||||
context.setDummyIdentifier(CompletionInitializationContext.DUMMY_IDENTIFIER.trim() + ";");
|
||||
|
||||
@@ -34,10 +34,12 @@ import com.intellij.openapi.fileEditor.FileDocumentManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.*;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.patterns.ElementPattern;
|
||||
import com.intellij.patterns.PsiJavaPatterns;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.*;
|
||||
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
import com.intellij.psi.codeStyle.SuggestedNameInfo;
|
||||
import com.intellij.psi.codeStyle.VariableKind;
|
||||
import com.intellij.psi.filters.ElementFilter;
|
||||
import com.intellij.psi.impl.FakePsiElement;
|
||||
import com.intellij.psi.impl.light.LightVariableBuilder;
|
||||
@@ -48,7 +50,10 @@ import com.intellij.psi.scope.ElementClassHint;
|
||||
import com.intellij.psi.scope.NameHint;
|
||||
import com.intellij.psi.scope.PsiScopeProcessor;
|
||||
import com.intellij.psi.scope.util.PsiScopesUtil;
|
||||
import com.intellij.psi.util.*;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.psi.util.PsiUtilCore;
|
||||
import com.intellij.psi.util.TypeConversionUtil;
|
||||
import com.intellij.ui.JBColor;
|
||||
import com.intellij.util.*;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
@@ -59,7 +64,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import static com.intellij.codeInsight.completion.ReferenceExpressionCompletionContributor.*;
|
||||
import static com.intellij.codeInsight.completion.ReferenceExpressionCompletionContributor.findConstantsUsedInSwitch;
|
||||
import static com.intellij.patterns.PlatformPatterns.psiElement;
|
||||
|
||||
public class JavaCompletionUtil {
|
||||
@@ -68,9 +73,6 @@ public class JavaCompletionUtil {
|
||||
public static final Key<PairFunction<PsiExpression, CompletionParameters, PsiType>> DYNAMIC_TYPE_EVALUATOR = Key.create("DYNAMIC_TYPE_EVALUATOR");
|
||||
|
||||
private static final Key<PsiType> QUALIFIER_TYPE_ATTR = Key.create("qualifierType"); // SmartPsiElementPointer to PsiType of "qualifier"
|
||||
public static final OffsetKey LPAREN_OFFSET = OffsetKey.create("lparen");
|
||||
public static final OffsetKey RPAREN_OFFSET = OffsetKey.create("rparen");
|
||||
public static final OffsetKey ARG_LIST_END_OFFSET = OffsetKey.create("argListEnd");
|
||||
static final NullableLazyKey<ExpectedTypeInfo[], CompletionLocation> EXPECTED_TYPES = NullableLazyKey.create("expectedTypes", new NullableFunction<CompletionLocation, ExpectedTypeInfo[]>() {
|
||||
@Override
|
||||
@Nullable
|
||||
@@ -83,8 +85,6 @@ public class JavaCompletionUtil {
|
||||
return JavaSmartCompletionContributor.getExpectedTypes(location.getCompletionParameters());
|
||||
}
|
||||
});
|
||||
private static final ElementPattern<PsiElement> LEFT_PAREN = psiElement(JavaTokenType.LPARENTH).andOr(psiElement().withParent(
|
||||
PsiExpressionList.class), psiElement().afterLeaf(".", PsiKeyword.NEW));
|
||||
|
||||
public static final Key<Boolean> SUPER_METHOD_PARAMETERS = Key.create("SUPER_METHOD_PARAMETERS");
|
||||
|
||||
@@ -200,38 +200,6 @@ public class JavaCompletionUtil {
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void initOffsets(final PsiFile file, final OffsetMap offsetMap) {
|
||||
int offset = Math.max(offsetMap.getOffset(CompletionInitializationContext.SELECTION_END_OFFSET),
|
||||
offsetMap.getOffset(CompletionInitializationContext.IDENTIFIER_END_OFFSET));
|
||||
|
||||
PsiElement element = file.findElementAt(offset);
|
||||
if (element instanceof PsiWhiteSpace &&
|
||||
(!element.textContains('\n') ||
|
||||
CodeStyleSettingsManager.getSettings(file.getProject()).getCommonSettings(JavaLanguage.INSTANCE).METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||
)) {
|
||||
element = file.findElementAt(element.getTextRange().getEndOffset());
|
||||
}
|
||||
if (element == null) return;
|
||||
|
||||
if (LEFT_PAREN.accepts(element)) {
|
||||
offsetMap.addOffset(LPAREN_OFFSET, element.getTextRange().getStartOffset());
|
||||
PsiElement list = element.getParent();
|
||||
PsiElement last = list.getLastChild();
|
||||
if (last instanceof PsiJavaToken && ((PsiJavaToken)last).getTokenType() == JavaTokenType.RPARENTH) {
|
||||
offsetMap.addOffset(RPAREN_OFFSET, last.getTextRange().getStartOffset());
|
||||
}
|
||||
|
||||
offsetMap.addOffset(ARG_LIST_END_OFFSET, list.getTextRange().getEndOffset());
|
||||
}
|
||||
}
|
||||
|
||||
public static void resetParensInfo(final OffsetMap offsetMap) {
|
||||
offsetMap.removeOffset(LPAREN_OFFSET);
|
||||
offsetMap.removeOffset(RPAREN_OFFSET);
|
||||
offsetMap.removeOffset(ARG_LIST_END_OFFSET);
|
||||
offsetMap.removeOffset(CompletionInitializationContext.IDENTIFIER_END_OFFSET);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static List<? extends PsiElement> getAllPsiElements(final LookupElement item) {
|
||||
List<PsiMethod> allMethods = getAllMethods(item);
|
||||
|
||||
+20
-11
@@ -23,10 +23,12 @@ import com.intellij.codeInsight.lookup.Lookup;
|
||||
import com.intellij.codeInsight.lookup.LookupElement;
|
||||
import com.intellij.codeInsight.lookup.LookupItem;
|
||||
import com.intellij.codeInsight.lookup.TailTypeDecorator;
|
||||
import com.intellij.openapi.editor.Document;
|
||||
import com.intellij.lang.java.JavaLanguage;
|
||||
import com.intellij.pom.java.LanguageLevel;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.PsiUtilCore;
|
||||
import com.intellij.psi.util.TypeConversionUtil;
|
||||
import gnu.trove.THashSet;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -44,7 +46,7 @@ public class SmartCompletionDecorator extends TailTypeDecorator<LookupElement> {
|
||||
@NotNull private final Collection<ExpectedTypeInfo> myExpectedTypeInfos;
|
||||
private PsiElement myPosition;
|
||||
|
||||
public SmartCompletionDecorator(LookupElement item, Collection<ExpectedTypeInfo> expectedTypeInfos) {
|
||||
public SmartCompletionDecorator(LookupElement item, @NotNull Collection<ExpectedTypeInfo> expectedTypeInfos) {
|
||||
super(item);
|
||||
myExpectedTypeInfos = expectedTypeInfos;
|
||||
}
|
||||
@@ -115,16 +117,9 @@ public class SmartCompletionDecorator extends TailTypeDecorator<LookupElement> {
|
||||
public void handleInsert(InsertionContext context) {
|
||||
if (getObject() instanceof PsiVariable && context.getCompletionChar() == Lookup.REPLACE_SELECT_CHAR) {
|
||||
context.commitDocument();
|
||||
final Document document = context.getDocument();
|
||||
JavaCompletionUtil.initOffsets(context.getFile(), context.getOffsetMap());
|
||||
document.deleteString(context.getSelectionEndOffset(), context.getOffsetMap().getOffset(CompletionInitializationContext.IDENTIFIER_END_OFFSET));
|
||||
if(context.getOffsetMap().getOffset(JavaCompletionUtil.LPAREN_OFFSET) > 0){
|
||||
document.deleteString(context.getOffsetMap().getOffset(JavaCompletionUtil.LPAREN_OFFSET),
|
||||
context.getOffsetMap().getOffset(JavaCompletionUtil.ARG_LIST_END_OFFSET));
|
||||
JavaCompletionUtil.resetParensInfo(context.getOffsetMap());
|
||||
}
|
||||
context.commitDocument();
|
||||
replaceMethodCallIfNeeded(context);
|
||||
}
|
||||
context.commitDocument();
|
||||
myPosition = getPosition(context, this);
|
||||
|
||||
TailType tailType = computeTailType(context);
|
||||
@@ -136,6 +131,20 @@ public class SmartCompletionDecorator extends TailTypeDecorator<LookupElement> {
|
||||
}
|
||||
}
|
||||
|
||||
private static void replaceMethodCallIfNeeded(InsertionContext context) {
|
||||
PsiFile file = context.getFile();
|
||||
PsiElement element = file.findElementAt(context.getTailOffset());
|
||||
if (element instanceof PsiWhiteSpace &&
|
||||
(!element.textContains('\n') ||
|
||||
CodeStyleSettingsManager.getSettings(file.getProject()).getCommonSettings(JavaLanguage.INSTANCE).METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE
|
||||
)) {
|
||||
element = file.findElementAt(element.getTextRange().getEndOffset());
|
||||
}
|
||||
if (element != null && PsiUtilCore.getElementType(element) == JavaTokenType.LPARENTH && element.getParent() instanceof PsiExpressionList) {
|
||||
context.getDocument().deleteString(context.getTailOffset(), element.getParent().getTextRange().getEndOffset());
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean hasUnboundTypeParams(final PsiMethod method, PsiType expectedType) {
|
||||
final PsiTypeParameter[] typeParameters = method.getTypeParameters();
|
||||
if (typeParameters.length == 0) return false;
|
||||
|
||||
Reference in New Issue
Block a user