mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
ensure JavaCompletionContributor commits the document after auto-import, cleanup (EA-52975)
This commit is contained in:
+14
-8
@@ -53,6 +53,7 @@ import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.psi.util.PsiUtilCore;
|
||||
import com.intellij.util.Consumer;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
import com.intellij.util.PairConsumer;
|
||||
import com.intellij.util.ProcessingContext;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -340,6 +341,7 @@ public class JavaCompletionContributor extends CompletionContributor {
|
||||
}
|
||||
|
||||
final Object[] variants = reference.getVariants();
|
||||
//noinspection ConstantConditions
|
||||
if (variants == null) {
|
||||
LOG.error("Reference=" + reference);
|
||||
}
|
||||
@@ -365,6 +367,7 @@ public class JavaCompletionContributor extends CompletionContributor {
|
||||
|
||||
}
|
||||
else {
|
||||
//noinspection deprecation
|
||||
LookupElement element = LookupItemUtil.objectToLookupItem(completion);
|
||||
usedWords.add(element.getLookupString());
|
||||
result.addElement(element);
|
||||
@@ -434,7 +437,7 @@ public class JavaCompletionContributor extends CompletionContributor {
|
||||
private static void completeAnnotationAttributeName(CompletionResultSet result, PsiElement insertedElement,
|
||||
CompletionParameters parameters) {
|
||||
PsiNameValuePair pair = PsiTreeUtil.getParentOfType(insertedElement, PsiNameValuePair.class);
|
||||
PsiAnnotationParameterList parameterList = (PsiAnnotationParameterList)pair.getParent();
|
||||
PsiAnnotationParameterList parameterList = (PsiAnnotationParameterList)ObjectUtils.assertNotNull(pair).getParent();
|
||||
PsiAnnotation anno = (PsiAnnotation)parameterList.getParent();
|
||||
boolean showClasses = psiElement().afterLeaf("(").accepts(insertedElement);
|
||||
PsiClass annoClass = null;
|
||||
@@ -507,7 +510,7 @@ public class JavaCompletionContributor extends CompletionContributor {
|
||||
if (psiElement().withParent(psiReferenceExpression().withFirstChild(psiReferenceExpression().referencing(psiClass()))).accepts(position)) {
|
||||
if (CompletionUtil.shouldShowFeature(parameters, JavaCompletionFeatures.GLOBAL_MEMBER_NAME)) {
|
||||
final String shortcut = getActionShortcut(IdeActions.ACTION_CODE_COMPLETION);
|
||||
if (shortcut != null) {
|
||||
if (StringUtil.isNotEmpty(shortcut)) {
|
||||
return "Pressing " + shortcut + " twice without a class qualifier would show all accessible static methods";
|
||||
}
|
||||
}
|
||||
@@ -517,7 +520,7 @@ public class JavaCompletionContributor extends CompletionContributor {
|
||||
if (parameters.getCompletionType() != CompletionType.SMART && shouldSuggestSmartCompletion(parameters.getPosition())) {
|
||||
if (CompletionUtil.shouldShowFeature(parameters, CodeCompletionFeatures.EDITING_COMPLETION_SMARTTYPE_GENERAL)) {
|
||||
final String shortcut = getActionShortcut(IdeActions.ACTION_SMART_TYPE_COMPLETION);
|
||||
if (shortcut != null) {
|
||||
if (StringUtil.isNotEmpty(shortcut)) {
|
||||
return CompletionBundle.message("completion.smart.hint", shortcut);
|
||||
}
|
||||
}
|
||||
@@ -528,7 +531,7 @@ public class JavaCompletionContributor extends CompletionContributor {
|
||||
if (psiTypes.length > 0) {
|
||||
if (CompletionUtil.shouldShowFeature(parameters, JavaCompletionFeatures.SECOND_SMART_COMPLETION_TOAR)) {
|
||||
final String shortcut = getActionShortcut(IdeActions.ACTION_SMART_TYPE_COMPLETION);
|
||||
if (shortcut != null) {
|
||||
if (StringUtil.isNotEmpty(shortcut)) {
|
||||
for (final PsiType psiType : psiTypes) {
|
||||
final PsiType type = PsiUtil.extractIterableTypeParameter(psiType, false);
|
||||
if (type != null) {
|
||||
@@ -539,7 +542,7 @@ public class JavaCompletionContributor extends CompletionContributor {
|
||||
}
|
||||
if (CompletionUtil.shouldShowFeature(parameters, JavaCompletionFeatures.SECOND_SMART_COMPLETION_ASLIST)) {
|
||||
final String shortcut = getActionShortcut(IdeActions.ACTION_SMART_TYPE_COMPLETION);
|
||||
if (shortcut != null) {
|
||||
if (StringUtil.isNotEmpty(shortcut)) {
|
||||
for (final PsiType psiType : psiTypes) {
|
||||
if (psiType instanceof PsiArrayType) {
|
||||
final PsiType componentType = ((PsiArrayType)psiType).getComponentType();
|
||||
@@ -553,7 +556,7 @@ public class JavaCompletionContributor extends CompletionContributor {
|
||||
|
||||
if (CompletionUtil.shouldShowFeature(parameters, JavaCompletionFeatures.SECOND_SMART_COMPLETION_CHAIN)) {
|
||||
final String shortcut = getActionShortcut(IdeActions.ACTION_SMART_TYPE_COMPLETION);
|
||||
if (shortcut != null) {
|
||||
if (StringUtil.isNotEmpty(shortcut)) {
|
||||
return CompletionBundle.message("completion.smart.chain.hint", shortcut);
|
||||
}
|
||||
}
|
||||
@@ -639,9 +642,12 @@ public class JavaCompletionContributor extends CompletionContributor {
|
||||
final PsiFile file = context.getFile();
|
||||
|
||||
if (file instanceof PsiJavaFile) {
|
||||
JavaCompletionUtil.initOffsets(file, context.getOffsetMap());
|
||||
if (context.getInvocationCount() > 0) {
|
||||
autoImport(file, context.getStartOffset() - 1, context.getEditor());
|
||||
PsiDocumentManager.getInstance(context.getProject()).commitDocument(context.getEditor().getDocument());
|
||||
}
|
||||
|
||||
autoImport(file, context.getStartOffset() - 1, context.getEditor());
|
||||
JavaCompletionUtil.initOffsets(file, context.getOffsetMap());
|
||||
|
||||
if (context.getCompletionType() == CompletionType.BASIC) {
|
||||
if (semicolonNeeded(context.getEditor(), file, context.getStartOffset())) {
|
||||
|
||||
+9
-3
@@ -21,6 +21,7 @@ import com.intellij.openapi.editor.SelectionModel;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.util.PsiUtilBase;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -40,13 +41,15 @@ public class CompletionInitializationContext {
|
||||
private final Editor myEditor;
|
||||
private final PsiFile myFile;
|
||||
private final CompletionType myCompletionType;
|
||||
private final int myInvocationCount;
|
||||
private final OffsetMap myOffsetMap;
|
||||
private String myDummyIdentifier = DUMMY_IDENTIFIER;
|
||||
|
||||
public CompletionInitializationContext(final Editor editor, final PsiFile file, final CompletionType completionType) {
|
||||
public CompletionInitializationContext(final Editor editor, final PsiFile file, final CompletionType completionType, int invocationCount) {
|
||||
myEditor = editor;
|
||||
myFile = file;
|
||||
myCompletionType = completionType;
|
||||
myInvocationCount = invocationCount;
|
||||
myOffsetMap = new OffsetMap(editor.getDocument());
|
||||
|
||||
myOffsetMap.addOffset(START_OFFSET, calcStartOffset(editor));
|
||||
@@ -79,7 +82,7 @@ public class CompletionInitializationContext {
|
||||
|
||||
@NotNull
|
||||
public Language getPositionLanguage() {
|
||||
return PsiUtilBase.getLanguageInEditor(getEditor(), getProject());
|
||||
return ObjectUtils.assertNotNull(PsiUtilBase.getLanguageInEditor(getEditor(), getProject()));
|
||||
}
|
||||
|
||||
public String getDummyIdentifier() {
|
||||
@@ -127,9 +130,12 @@ public class CompletionInitializationContext {
|
||||
return getIdentifierEndOffset();
|
||||
}
|
||||
|
||||
public int getInvocationCount() {
|
||||
return myInvocationCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark the offset up to which the text will be deleted if a completion variant is selected using Replace character (Tab)
|
||||
* @param idEnd
|
||||
*/
|
||||
public void setReplacementOffset(int idEnd) {
|
||||
myOffsetMap.addOffset(IDENTIFIER_END_OFFSET, idEnd);
|
||||
|
||||
+14
-13
@@ -135,19 +135,18 @@ public class CodeCompletionHandlerBase {
|
||||
}
|
||||
*/
|
||||
|
||||
int newTime = phase.newCompletionStarted(time, repeated);
|
||||
final int newTime = phase.newCompletionStarted(time, repeated);
|
||||
if (invokedExplicitly) {
|
||||
time = newTime;
|
||||
}
|
||||
final int invocationCount = time;
|
||||
if (CompletionServiceImpl.isPhase(CompletionPhase.InsertedSingleItem.class)) {
|
||||
CompletionServiceImpl.setCompletionPhase(CompletionPhase.NoCompletion);
|
||||
}
|
||||
CompletionServiceImpl.assertPhase(CompletionPhase.NoCompletion.getClass(), CompletionPhase.CommittingDocuments.class);
|
||||
|
||||
if (time > 1) {
|
||||
if (myCompletionType == CompletionType.BASIC) {
|
||||
FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.SECOND_BASIC_COMPLETION);
|
||||
}
|
||||
if (invocationCount > 1 && myCompletionType == CompletionType.BASIC) {
|
||||
FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.SECOND_BASIC_COMPLETION);
|
||||
}
|
||||
|
||||
final CompletionInitializationContext[] initializationContext = {null};
|
||||
@@ -168,7 +167,7 @@ public class CodeCompletionHandlerBase {
|
||||
psiFile.putUserData(PsiFileEx.BATCH_REFERENCE_PROCESSING, Boolean.TRUE);
|
||||
CompletionAssertions.assertCommitSuccessful(editor, psiFile);
|
||||
|
||||
initializationContext[0] = runContributorsBeforeCompletion(editor, psiFile);
|
||||
initializationContext[0] = runContributorsBeforeCompletion(editor, psiFile, invocationCount);
|
||||
}
|
||||
};
|
||||
ApplicationManager.getApplication().runWriteAction(runnable);
|
||||
@@ -184,12 +183,12 @@ public class CodeCompletionHandlerBase {
|
||||
CommandProcessor.getInstance().executeCommand(project, initCmd, null, null);
|
||||
}
|
||||
|
||||
insertDummyIdentifier(initializationContext[0], hasModifiers, time);
|
||||
insertDummyIdentifier(initializationContext[0], hasModifiers, invocationCount);
|
||||
}
|
||||
|
||||
private CompletionInitializationContext runContributorsBeforeCompletion(Editor editor, PsiFile psiFile) {
|
||||
private CompletionInitializationContext runContributorsBeforeCompletion(Editor editor, PsiFile psiFile, int invocationCount) {
|
||||
final Ref<CompletionContributor> current = Ref.create(null);
|
||||
CompletionInitializationContext context = new CompletionInitializationContext(editor, psiFile, myCompletionType) {
|
||||
CompletionInitializationContext context = new CompletionInitializationContext(editor, psiFile, myCompletionType, invocationCount) {
|
||||
CompletionContributor dummyIdentifierChanger;
|
||||
|
||||
@Override
|
||||
@@ -759,10 +758,12 @@ public class CodeCompletionHandlerBase {
|
||||
}
|
||||
if (context.getCompletionChar() == Lookup.COMPLETE_STATEMENT_SELECT_CHAR) {
|
||||
final Language language = PsiUtilBase.getLanguageInEditor(editor, project);
|
||||
final List<SmartEnterProcessor> processors = SmartEnterProcessors.INSTANCE.forKey(language);
|
||||
if (processors.size() > 0) {
|
||||
for (SmartEnterProcessor processor : processors) {
|
||||
processor.process(project, editor, indicator.getParameters().getOriginalFile());
|
||||
if (language != null) {
|
||||
final List<SmartEnterProcessor> processors = SmartEnterProcessors.INSTANCE.forKey(language);
|
||||
if (processors.size() > 0) {
|
||||
for (SmartEnterProcessor processor : processors) {
|
||||
processor.process(project, editor, indicator.getParameters().getOriginalFile());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user