simplify the CodeCompletionAction hierarchy

This commit is contained in:
peter
2011-02-28 18:29:27 +01:00
parent 90dbb9bfc2
commit 92bc8d1d7c
12 changed files with 53 additions and 118 deletions
@@ -68,7 +68,7 @@ class JavaClassNameInsertHandler implements InsertHandler<JavaPsiClassReferenceE
if (c == '#') {
context.setLaterRunnable(new Runnable() {
public void run() {
new CodeCompletionHandlerBase(CompletionType.BASIC).invoke(project, editor, file);
new CodeCompletionHandlerBase(CompletionType.BASIC).invokeCompletion(project, editor);
}
});
} else if (c == '.' && PsiTreeUtil.getParentOfType(position, PsiParameterList.class) == null) {
@@ -1,45 +0,0 @@
/*
* Copyright 2000-2009 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.editorActions.smartEnter;
import com.intellij.codeInsight.completion.actions.CodeCompletionAction;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiJavaCodeReferenceElement;
import com.intellij.psi.JavaResolveResult;
import com.intellij.util.IncorrectOperationException;
/**
* Created by IntelliJ IDEA.
* User: max
* Date: Sep 8, 2003
* Time: 3:25:56 PM
* To change this template use Options | File Templates.
*/
public class CompletionFixer implements Fixer {
public void apply(Editor editor, JavaSmartEnterProcessor processor, PsiElement psiElement) throws IncorrectOperationException {
if (psiElement instanceof PsiJavaCodeReferenceElement) {
PsiJavaCodeReferenceElement ref = (PsiJavaCodeReferenceElement) psiElement;
final JavaResolveResult resolved = ref.advancedResolve(true);
if (resolved == null || resolved.getElement() == null) {
editor.getCaretModel().moveToOffset(ref.getTextRange().getEndOffset());
final CodeCompletionAction completionAction = (CodeCompletionAction) ActionManager.getInstance().getAction("CodeCompletion");
completionAction.getHandler().invoke(psiElement.getProject(), editor, psiElement.getContainingFile());
}
}
}
}
@@ -9,8 +9,6 @@ import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.module.JavaModuleType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.impl.JavaSdkImpl;
import com.intellij.testFramework.PsiTestUtil;
import com.intellij.testFramework.TestDataPath;
@@ -223,7 +221,7 @@ public class ClassNameCompletionTest extends CompletionTestCase {
private void performAction() {
CodeCompletionHandlerBase handler = new CodeCompletionHandlerBase(CompletionType.CLASS_NAME);
handler.invoke(myProject, myEditor, myFile);
handler.invokeCompletion(myProject, myEditor);
final LookupManager instance = LookupManager.getInstance(myProject);
if(instance instanceof LookupManagerImpl){
final LookupManagerImpl testLookupManager = ((LookupManagerImpl)instance);
@@ -334,11 +334,11 @@ public class CompletionStyleTest extends LightCodeInsightTestCase{
}
private void performSmartCompletion(){
new CodeCompletionHandlerBase(CompletionType.SMART).invoke(getProject(), getEditor(), getFile());
new CodeCompletionHandlerBase(CompletionType.SMART).invokeCompletion(getProject(), getEditor());
}
private void performNormalCompletion(){
new CodeCompletionHandlerBase(CompletionType.BASIC).invoke(getProject(), getEditor(), getFile());
new CodeCompletionHandlerBase(CompletionType.BASIC).invokeCompletion(getProject(), getEditor());
}
private void select(char completionChar, int index){
@@ -83,8 +83,10 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler {
this.autopopup = autopopup;
}
public final void invoke(final Project project, final Editor editor) {
invoke(project, editor, PsiUtilBase.getPsiFileInEditor(editor, project));
public final void invokeCompletion(final Project project, final Editor editor) {
PsiFile file = PsiUtilBase.getPsiFileInEditor(editor, project);
assert file != null;
invoke(project, editor, file);
}
public final void invoke(@NotNull final Project project, @NotNull final Editor editor, @NotNull PsiFile psiFile) {
@@ -15,36 +15,61 @@
*/
package com.intellij.codeInsight.completion.actions;
import com.intellij.codeInsight.actions.BaseCodeInsightAction;
import com.intellij.codeInsight.completion.CodeCompletionFeatures;
import com.intellij.codeInsight.completion.CodeCompletionHandlerBase;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.codeInsight.hint.HintManagerImpl;
import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiUtilBase;
import org.jetbrains.annotations.NotNull;
/**
* @author peter
*/
public abstract class BaseCodeCompletionAction extends BaseCodeInsightAction implements HintManagerImpl.ActionToIgnore, DumbAware{
protected BaseCodeCompletionAction() {
public abstract class BaseCodeCompletionAction extends AnAction implements HintManagerImpl.ActionToIgnore, DumbAware {
private CompletionType myCompletionType;
protected BaseCodeCompletionAction(CompletionType completionType) {
myCompletionType = completionType;
setEnabledInModalContext(true);
}
public void actionPerformedImpl(@NotNull final Project project, final Editor editor) {
public void actionPerformed(AnActionEvent e) {
DataContext dataContext = e.getDataContext();
Project project = PlatformDataKeys.PROJECT.getData(dataContext);
Editor editor = PlatformDataKeys.EDITOR.getData(dataContext);
switch (myCompletionType) {
case BASIC: FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_BASIC);
case SMART: FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_SMARTTYPE_GENERAL);
case CLASS_NAME: FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_CLASSNAME);
}
new CodeCompletionHandlerBase(myCompletionType).invokeCompletion(project, editor);
}
@Override
public void update(AnActionEvent e) {
DataContext dataContext = e.getDataContext();
e.getPresentation().setEnabled(false);
Project project = PlatformDataKeys.PROJECT.getData(dataContext);
if (project == null) return;
Editor editor = PlatformDataKeys.EDITOR.getData(dataContext);
if (editor == null) return;
final PsiFile psiFile = PsiUtilBase.getPsiFileInEditor(editor, project);
if (psiFile == null) return;
if (!ApplicationManager.getApplication().isUnitTestMode() && !editor.getContentComponent().isShowing()) return;
getHandler().invoke(project, editor, psiFile);
}
@Override
protected boolean isValidForLookup() {
return true;
e.getPresentation().setEnabled(true);
}
}
@@ -16,26 +16,14 @@
package com.intellij.codeInsight.completion.actions;
import com.intellij.codeInsight.completion.CodeCompletionFeatures;
import com.intellij.codeInsight.completion.CodeCompletionHandlerBase;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
/**
*
*/
public class ClassNameCompletionAction extends BaseCodeCompletionAction{
public void actionPerformedImpl(@NotNull Project project, Editor editor) {
FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_CLASSNAME);
super.actionPerformedImpl(project, editor);
}
protected CodeCompletionHandlerBase getHandler() {
return new CodeCompletionHandlerBase(CompletionType.CLASS_NAME);
public ClassNameCompletionAction() {
super(CompletionType.CLASS_NAME);
}
}
@@ -16,26 +16,14 @@
package com.intellij.codeInsight.completion.actions;
import com.intellij.codeInsight.completion.CodeCompletionFeatures;
import com.intellij.codeInsight.completion.CodeCompletionHandlerBase;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
/**
* @author peter
*/
public class CodeCompletionAction extends BaseCodeCompletionAction {
public void actionPerformedImpl(@NotNull Project project, Editor editor) {
FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_BASIC);
super.actionPerformedImpl(project, editor);
}
public CodeCompletionHandlerBase getHandler() {
return new CodeCompletionHandlerBase(CompletionType.BASIC);
public CodeCompletionAction() {
super(CompletionType.BASIC);
}
}
@@ -16,36 +16,15 @@
package com.intellij.codeInsight.completion.actions;
import com.intellij.codeInsight.CodeInsightActionHandler;
import com.intellij.codeInsight.completion.CodeCompletionFeatures;
import com.intellij.codeInsight.completion.CodeCompletionHandlerBase;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
/**
* @author peter
*/
public class SmartCodeCompletionAction extends BaseCodeCompletionAction{
protected CodeInsightActionHandler getHandler() {
return createHandler();
}
public static CodeInsightActionHandler createHandler() {
return new CodeInsightActionHandler() {
public void invoke(@NotNull Project project, @NotNull Editor editor, @NotNull PsiFile file) {
FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_SMARTTYPE_GENERAL);
new CodeCompletionHandlerBase(CompletionType.SMART).invoke(project, editor, file);
}
public boolean startInWriteAction() {
return false;
}
};
public SmartCodeCompletionAction() {
super(CompletionType.SMART);
}
}
@@ -122,7 +122,7 @@ public class CompletionAutoPopupHandler extends TypedHandlerDelegate {
}
public static void invokeAutoPopupCompletion(Project project, final Editor editor) {
new CodeCompletionHandlerBase(CompletionType.BASIC, false, true).invoke(project, editor);
new CodeCompletionHandlerBase(CompletionType.BASIC, false, true).invokeCompletion(project, editor);
final AutoPopupState state = new AutoPopupState(project, editor);
editor.putUserData(STATE_KEY, state);
@@ -193,7 +193,7 @@ public class AntCompletionTest extends LightCodeInsightTestCase {
}
private static void performNormalCompletion() {
new CodeCompletionHandlerBase(CompletionType.BASIC).invoke(getProject(), getEditor(), myFile);
new CodeCompletionHandlerBase(CompletionType.BASIC).invokeCompletion(getProject(), getEditor());
}
private static void select(char completionChar, LookupElement item) {
@@ -67,7 +67,7 @@ public class GroovyClassNameCompletionTest extends LightCodeInsightFixtureTestCa
private void forceCompletion() {
CodeCompletionHandlerBase handler = new CodeCompletionHandlerBase(CompletionType.CLASS_NAME);
handler.invoke(myFixture.getProject(), myFixture.getEditor(), myFixture.getFile());
handler.invokeCompletion(myFixture.getProject(), myFixture.getEditor());
final LookupManager instance = LookupManager.getInstance(myFixture.getProject());
if(instance.getActiveLookup() != null)
instance.forceSelection(Lookup.NORMAL_SELECT_CHAR, 1);