Listening to external annotations manager's events.

This commit is contained in:
Evgeny Gerashchenko
2012-08-29 21:32:04 +04:00
parent 7dd98479cc
commit ea434065cb
2 changed files with 29 additions and 7 deletions
@@ -16,14 +16,20 @@
package org.jetbrains.jet.plugin.codeInsight; package org.jetbrains.jet.plugin.codeInsight;
import com.intellij.codeInsight.ExternalAnnotationsListener;
import com.intellij.codeInsight.ExternalAnnotationsManager;
import com.intellij.codeInsight.PsiEquivalenceUtil;
import com.intellij.codeInsight.intention.AddAnnotationFix; import com.intellij.codeInsight.intention.AddAnnotationFix;
import com.intellij.codeInsight.intention.impl.BaseIntentionAction; import com.intellij.codeInsight.intention.impl.BaseIntentionAction;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*; import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException; import com.intellij.util.IncorrectOperationException;
import com.intellij.util.messages.MessageBusConnection;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.di.InjectorForJavaSemanticServices; import org.jetbrains.jet.di.InjectorForJavaSemanticServices;
import org.jetbrains.jet.lang.BuiltinsScopeExtensionMode; import org.jetbrains.jet.lang.BuiltinsScopeExtensionMode;
@@ -79,16 +85,32 @@ public class AddKotlinSignatureAnnotation extends BaseIntentionAction {
} }
@Override @Override
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { public void invoke(@NotNull final Project project, final Editor editor, PsiFile file) throws IncorrectOperationException {
PsiMethod method = findMethod(file, editor.getCaretModel().getOffset()); final PsiMethod method = findMethod(file, editor.getCaretModel().getOffset());
PsiMethod original = (PsiMethod) method.getOriginalElement(); String signature = getDefaultSignature(project, (PsiMethod) method.getOriginalElement());
String signature = getDefaultSignature(project, original);
if (signature == null) { if (signature == null) {
return; return;
} }
final MessageBusConnection busConnection = project.getMessageBus().connect();
busConnection.subscribe(ExternalAnnotationsManager.TOPIC, new ExternalAnnotationsListener.Adapter() {
@Override
public void afterExternalAnnotationChanging(@NotNull PsiModifierListOwner owner, @NotNull String annotationFQName,
boolean successful) {
busConnection.disconnect();
if (successful && owner == method
&& KotlinSignatureInJavaMarkerProvider.KOTLIN_SIGNATURE_ANNOTATION.equals(annotationFQName)) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
KotlinSignatureInJavaMarkerProvider.refresh(project);
KotlinSignatureInJavaMarkerProvider.invokeEditSignature(method, editor, null);
}
}, ModalityState.NON_MODAL);
}
}
});
createFix(method, signature).invoke(project, editor, file); createFix(method, signature).invoke(project, editor, file);
KotlinSignatureInJavaMarkerProvider.refresh(project);
KotlinSignatureInJavaMarkerProvider.invokeEditSignature(method, editor, null);
} }
@NotNull @NotNull
@@ -91,7 +91,7 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
return annotation; return annotation;
} }
private static PsiMethod getAnnotationOwner(PsiElement element) { static PsiMethod getAnnotationOwner(PsiElement element) {
PsiMethod annotationOwner = element.getOriginalElement() instanceof PsiMethod PsiMethod annotationOwner = element.getOriginalElement() instanceof PsiMethod
? (PsiMethod) element.getOriginalElement() ? (PsiMethod) element.getOriginalElement()
: (PsiMethod) element; : (PsiMethod) element;