Minor: Log and create attachment on AssertionError in KotlinSignature line markers

This commit is contained in:
Pavel V. Talanov
2014-10-14 15:42:37 +04:00
parent e73866040d
commit f3b9ab9329
@@ -20,17 +20,23 @@ import com.intellij.codeHighlighting.Pass;
import com.intellij.codeInsight.daemon.GutterIconNavigationHandler; import com.intellij.codeInsight.daemon.GutterIconNavigationHandler;
import com.intellij.codeInsight.daemon.LineMarkerInfo; import com.intellij.codeInsight.daemon.LineMarkerInfo;
import com.intellij.codeInsight.daemon.LineMarkerProvider; import com.intellij.codeInsight.daemon.LineMarkerProvider;
import com.intellij.diagnostic.AttachmentFactory;
import com.intellij.diagnostic.LogMessageEx;
import com.intellij.icons.AllIcons; import com.intellij.icons.AllIcons;
import com.intellij.ide.DataManager; import com.intellij.ide.DataManager;
import com.intellij.ide.util.PropertiesComponent; import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.actionSystem.ActionGroup;
import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.diagnostic.Attachment;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.markup.GutterIconRenderer; import com.intellij.openapi.editor.markup.GutterIconRenderer;
import com.intellij.openapi.module.Module; import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*; import com.intellij.psi.*;
import com.intellij.util.ExceptionUtil;
import com.intellij.util.Function; import com.intellij.util.Function;
import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -53,6 +59,7 @@ import java.util.List;
public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider { public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
private static final String SHOW_MARKERS_PROPERTY = "kotlin.signature.markers.enabled"; private static final String SHOW_MARKERS_PROPERTY = "kotlin.signature.markers.enabled";
private static final Logger LOG = Logger.getInstance(KotlinSignatureInJavaMarkerProvider.class);
private static final GutterIconNavigationHandler<PsiModifierListOwner> NAVIGATION_HANDLER = new GutterIconNavigationHandler<PsiModifierListOwner>() { private static final GutterIconNavigationHandler<PsiModifierListOwner> NAVIGATION_HANDLER = new GutterIconNavigationHandler<PsiModifierListOwner>() {
@Override @Override
@@ -90,10 +97,35 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
return; return;
} }
markElements(elements, result, firstElement.getContainingFile());
}
private static void markElements(
@NotNull List<PsiElement> elements,
@NotNull Collection<LineMarkerInfo> result,
@NotNull PsiFile psiFile
) {
try {
for (PsiElement element : elements) { for (PsiElement element : elements) {
markElement(element, result);
}
}
catch (AssertionError error) {
VirtualFile virtualFile = psiFile.getVirtualFile();
Attachment[] attachments = virtualFile != null
? new Attachment[] {AttachmentFactory.createAttachment(virtualFile)}
: new Attachment[] {};
LOG.error(LogMessageEx.createEvent(
"Exception while collecting KotlinSignature markers", ExceptionUtil.getThrowableText(error), attachments
));
}
}
private static void markElement(@NotNull PsiElement element, @NotNull Collection<LineMarkerInfo> result) {
Project project = element.getProject();
PsiModifierListOwner annotationOwner = KotlinSignatureUtil.getAnalyzableAnnotationOwner(element); PsiModifierListOwner annotationOwner = KotlinSignatureUtil.getAnalyzableAnnotationOwner(element);
if (annotationOwner == null) { if (annotationOwner == null) {
continue; return;
} }
JavaResolveExtension resolveExtension = JavaResolveExtension.INSTANCE$; JavaResolveExtension resolveExtension = JavaResolveExtension.INSTANCE$;
@@ -102,7 +134,7 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
DeclarationDescriptor memberDescriptor = getDescriptorForMember(javaDescriptorResolver, annotationOwner); DeclarationDescriptor memberDescriptor = getDescriptorForMember(javaDescriptorResolver, annotationOwner);
if (memberDescriptor == null) continue; if (memberDescriptor == null) return;
List<String> errors = bindingContext.get(JavaBindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, memberDescriptor); List<String> errors = bindingContext.get(JavaBindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, memberDescriptor);
boolean hasSignatureAnnotation = KotlinSignatureUtil.findKotlinSignatureAnnotation(annotationOwner) != null; boolean hasSignatureAnnotation = KotlinSignatureUtil.findKotlinSignatureAnnotation(annotationOwner) != null;
@@ -111,7 +143,6 @@ public class KotlinSignatureInJavaMarkerProvider implements LineMarkerProvider {
result.add(new MyLineMarkerInfo((PsiModifierListOwner) element, errors, hasSignatureAnnotation)); result.add(new MyLineMarkerInfo((PsiModifierListOwner) element, errors, hasSignatureAnnotation));
} }
} }
}
@Nullable @Nullable
private static DeclarationDescriptor getDescriptorForMember( private static DeclarationDescriptor getDescriptorForMember(