package com.haskforce.highlighting.annotation; import com.haskforce.highlighting.annotation.external.TypeInfoUtil; import com.intellij.lang.documentation.AbstractDocumentationProvider; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.VisualPosition; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import org.jetbrains.annotations.Nullable; /** * This is the first version of the DocumentationProvider, the tooltip that can be shown on * hovering (and is also bound to an action). Right now, it just tries to get the type info. */ public class HaskellDocumentationProvider extends AbstractDocumentationProvider { @Override public String generateDoc(PsiElement element, @Nullable PsiElement originalElement) { int startOffset = element.getTextRange().getStartOffset(); int endOffset = element.getTextRange().getEndOffset(); Module module = ModuleUtilCore.findModuleForPsiElement(element); FileDocumentManager fileDocumentManager= FileDocumentManager.getInstance(); VirtualFile projectFile = element.getContainingFile().getVirtualFile(); Document cachedDocument = fileDocumentManager.getCachedDocument(projectFile); if (cachedDocument == null) { return null; } int startLineNumber = cachedDocument.getLineNumber(startOffset); int endLineNumber = cachedDocument.getLineNumber(endOffset); int startColumn = startOffset - cachedDocument.getLineStartOffset(startLineNumber); int endColumn = endOffset - cachedDocument.getLineStartOffset(endLineNumber); // and also correct them for (0,0) vs (1,1) leftmost coordinate (intellij -> ghc) VisualPosition startPosition = TypeInfoUtil.correctFor0BasedVS1Based(new VisualPosition(startLineNumber, startColumn)); VisualPosition endPosition = TypeInfoUtil.correctFor0BasedVS1Based(new VisualPosition(endLineNumber, endColumn)); return TypeInfoUtil.getTypeInfo(module,startPosition,endPosition, projectFile); } }