IJPL-207762 extract OverridableSpace to java frontend

GitOrigin-RevId: c4a1c97d061cd9e9a631ac71acc21992b94054a5
This commit is contained in:
Max Medvedev
2026-02-15 19:21:59 +01:00
committed by intellij-monorepo-bot
parent abe3598180
commit 2ae976b0b8
4 changed files with 43 additions and 33 deletions

View File

@@ -0,0 +1,26 @@
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.TailType;
import com.intellij.codeInsight.TailTypes;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.TailTypeDecorator;
import org.jetbrains.annotations.NotNull;
public final class OverridableSpace extends TailTypeDecorator<LookupElement> {
private final @NotNull TailType myTail;
private OverridableSpace(@NotNull LookupElement keyword, @NotNull TailType tail) {
super(keyword);
myTail = tail;
}
@Override
protected @NotNull TailType computeTailType(@NotNull InsertionContext context) {
return context.shouldAddCompletionChar() ? TailTypes.noneType() : myTail;
}
public static LookupElement create(@NotNull LookupElement delegate, @NotNull TailType tail) {
return new OverridableSpace(delegate, tail);
}
}

View File

@@ -269,11 +269,11 @@ public class JavaKeywordCompletion {
}
private void addKeyword(@NlsSafe @NotNull String keyword, @NotNull TailType tailType) {
addKeyword(new OverridableSpace(createKeyword(keyword), tailType));
addKeyword(OverridableSpace.create(createKeyword(keyword), tailType));
}
private void addWrapRuleIntoBlock(@NlsSafe @NotNull String keyword, @NotNull TailType tail) {
addKeyword(wrapRuleIntoBlock(new OverridableSpace(createKeyword(keyword), tail)));
addKeyword(wrapRuleIntoBlock(OverridableSpace.create(createKeyword(keyword), tail)));
}
List<LookupElement> getResults() {
@@ -355,7 +355,7 @@ public class JavaKeywordCompletion {
if (psiElement().withText(";").withSuperParent(2, PsiIfStatement.class).accepts(myPrevLeaf) ||
psiElement().withText("}").withSuperParent(3, PsiIfStatement.class).accepts(myPrevLeaf)) {
LookupElement elseKeyword = new OverridableSpace(createKeyword(JavaKeywords.ELSE), TailTypes.humbleSpaceBeforeWordType());
LookupElement elseKeyword = OverridableSpace.create(createKeyword(JavaKeywords.ELSE), TailTypes.humbleSpaceBeforeWordType());
CharSequence text = myParameters.getEditor().getDocument().getCharsSequence();
int offset = myParameters.getOffset();
while (text.length() > offset && Character.isWhitespace(text.charAt(offset))) {
@@ -374,7 +374,7 @@ public class JavaKeywordCompletion {
TailType returnTail = getReturnTail(myPosition);
LookupElement ret = createKeyword(JavaKeywords.RETURN);
if (returnTail != TailTypes.noneType()) {
ret = new OverridableSpace(ret, returnTail);
ret = OverridableSpace.create(ret, returnTail);
}
return ret;
}
@@ -474,8 +474,7 @@ public class JavaKeywordCompletion {
return;
}
final OverridableSpace defaultCaseRule =
new OverridableSpace(createKeyword(JavaKeywords.DEFAULT), JavaTailTypes.forSwitchLabel(switchBlock));
LookupElement defaultCaseRule = OverridableSpace.create(createKeyword(JavaKeywords.DEFAULT), JavaTailTypes.forSwitchLabel(switchBlock));
addKeyword(prioritizeForRule(LookupElementDecorator.withInsertHandler(defaultCaseRule, ADJUST_LINE_OFFSET), switchBlock));
}
@@ -657,8 +656,7 @@ public class JavaKeywordCompletion {
if (defaultElement != null) {
return;
}
final OverridableSpace defaultCaseRule =
new OverridableSpace(createKeyword(JavaKeywords.DEFAULT), JavaTailTypes.forSwitchLabel(switchBlock));
LookupElement defaultCaseRule = OverridableSpace.create(createKeyword(JavaKeywords.DEFAULT), JavaTailTypes.forSwitchLabel(switchBlock));
addKeyword(prioritizeForRule(LookupElementDecorator.withInsertHandler(defaultCaseRule, ADJUST_LINE_OFFSET), switchBlock));
}
@@ -843,7 +841,7 @@ public class JavaKeywordCompletion {
if (tryStatement == null ||
tryStatement.getCatchSections().length > 0 ||
tryStatement.getFinallyBlock() != null || tryStatement.getResourceList() != null) {
LookupElement finalKeyword = new OverridableSpace(createKeyword(JavaKeywords.FINAL), TailTypes.humbleSpaceBeforeWordType());
LookupElement finalKeyword = OverridableSpace.create(createKeyword(JavaKeywords.FINAL), TailTypes.humbleSpaceBeforeWordType());
if (statement.getParent() instanceof PsiSwitchLabeledRuleStatement) {
finalKeyword = wrapRuleIntoBlock(finalKeyword);
}
@@ -1022,7 +1020,7 @@ public class JavaKeywordCompletion {
if (psiElement().insideStarting(psiElement(PsiLocalVariable.class, PsiExpressionStatement.class)).accepts(myPosition)) {
addKeyword(JavaKeywords.CLASS, TailTypes.humbleSpaceBeforeWordType());
addKeyword(new OverridableSpace(LookupElementBuilder.create("abstract class").bold(), TailTypes.humbleSpaceBeforeWordType()));
addKeyword(OverridableSpace.create(LookupElementBuilder.create("abstract class").bold(), TailTypes.humbleSpaceBeforeWordType()));
if (PsiUtil.isAvailable(JavaFeature.RECORDS, myPosition)) {
addKeyword(JavaKeywords.RECORD, TailTypes.humbleSpaceBeforeWordType());
}
@@ -1198,7 +1196,7 @@ public class JavaKeywordCompletion {
}
};
LookupElement element =
new OverridableSpace(LookupElementDecorator.withInsertHandler(createKeyword(JavaKeywords.PERMITS), handler),
OverridableSpace.create(LookupElementDecorator.withInsertHandler(createKeyword(JavaKeywords.PERMITS), handler),
TailTypes.humbleSpaceBeforeWordType());
addKeyword(element);
}
@@ -1330,7 +1328,7 @@ public class JavaKeywordCompletion {
TailType tailType = JavaTailTypes.forSwitchLabel(switchBlock);
for (String keyword : List.of(JavaKeywords.TRUE, JavaKeywords.FALSE)) {
if (branches.contains(keyword)) continue;
result.accept(new JavaKeywordCompletion.OverridableSpace(
result.accept(OverridableSpace.create(
BasicExpressionCompletionContributor.createKeywordLookupItem(position, keyword), tailType));
}
}
@@ -1380,7 +1378,7 @@ public class JavaKeywordCompletion {
}
if (declaration) {
LookupElement item = BasicExpressionCompletionContributor.createKeywordLookupItem(position, JavaKeywords.VOID);
result.consume(new OverridableSpace(item, TailTypes.humbleSpaceBeforeWordType()));
result.consume(OverridableSpace.create(item, TailTypes.humbleSpaceBeforeWordType()));
}
else if (typeFragment && ((PsiTypeCodeFragment)position.getContainingFile()).isVoidValid()) {
result.consume(BasicExpressionCompletionContributor.createKeywordLookupItem(position, JavaKeywords.VOID));
@@ -1665,18 +1663,4 @@ public class JavaKeywordCompletion {
addKeyword(JavaKeywords.WITH, TailTypes.humbleSpaceBeforeWordType());
}
}
public static final class OverridableSpace extends TailTypeDecorator<LookupElement> {
private final @NotNull TailType myTail;
public OverridableSpace(@NotNull LookupElement keyword, @NotNull TailType tail) {
super(keyword);
myTail = tail;
}
@Override
protected @NotNull TailType computeTailType(InsertionContext context) {
return context.shouldAddCompletionChar() ? TailTypes.noneType() : myTail;
}
}
}

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.TailTypes;
@@ -115,7 +115,7 @@ public final class JavaPatternCompletionUtil {
}
if (type instanceof PsiPrimitiveType) {
LookupElement lookupItem = BasicExpressionCompletionContributor.createKeywordLookupItem(currentPosition, type.getCanonicalText());
result.accept(new JavaKeywordCompletion.OverridableSpace(lookupItem, TailTypes.spaceType()));
result.accept(OverridableSpace.create(lookupItem, TailTypes.spaceType()));
}
}
@@ -158,7 +158,7 @@ public final class JavaPatternCompletionUtil {
if (TypeConversionUtil.areTypesConvertible(fromType, primitiveType)) {
LookupElement lookupItem =
BasicExpressionCompletionContributor.createKeywordLookupItem(currentPosition, primitiveType.getCanonicalText());
result.accept(new JavaKeywordCompletion.OverridableSpace(lookupItem, TailTypes.spaceType()));
result.accept(OverridableSpace.create(lookupItem, TailTypes.spaceType()));
}
}
}

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.groovy.lang.completion;
import com.intellij.codeInsight.JavaTailTypes;
@@ -7,8 +7,8 @@ import com.intellij.codeInsight.TailTypes;
import com.intellij.codeInsight.completion.CompletionParameters;
import com.intellij.codeInsight.completion.InsertHandler;
import com.intellij.codeInsight.completion.InsertionContext;
import com.intellij.codeInsight.completion.JavaKeywordCompletion;
import com.intellij.codeInsight.completion.ModifierChooser;
import com.intellij.codeInsight.completion.OverridableSpace;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.codeInsight.lookup.TailTypeDecorator;
@@ -363,7 +363,7 @@ public final class GroovyCompletionData {
private static LookupElement keyword(final String keyword, @NotNull TailType tail) {
LookupElementBuilder element = LookupElementBuilder.create(keyword).bold();
return tail != TailTypes.noneType() ? new JavaKeywordCompletion.OverridableSpace(element, tail) : element;
return tail != TailTypes.noneType() ? OverridableSpace.create(element, tail) : element;
}
private static void registerControlCompletion(PsiElement context, GroovyCompletionConsumer result) {