提交 75092449 编写于 作者: D Dmitry Jemerov

action to show type of selected expression or expression under caret

上级 8786c6a6
...@@ -14,7 +14,11 @@ ...@@ -14,7 +14,11 @@
</project-components> </project-components>
<actions> <actions>
<!-- Add your actions here --> <action id="ShowJetExpressionType" class="org.jetbrains.jet.plugin.actions.ShowExpressionTypeAction"
text="Show Expression Type">
<keyboard-shortcut keymap="$default" first-keystroke="control shift Q"/>
<add-to-group group-id="CodeMenu" anchor="last"/>
</action>
</actions> </actions>
<extensions defaultExtensionNs="com.intellij"> <extensions defaultExtensionNs="com.intellij">
......
package org.jetbrains.jet.plugin.actions;
import com.intellij.codeInsight.CodeInsightUtilBase;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.plugin.JetLanguage;
/**
* @author yole
*/
public class ShowExpressionTypeAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
Editor editor = e.getData(PlatformDataKeys.EDITOR);
PsiFile psiFile = e.getData(LangDataKeys.PSI_FILE);
assert editor != null && psiFile != null;
JetExpression expression;
BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache((JetFile) psiFile);
if (editor.getSelectionModel().hasSelection()) {
int startOffset = editor.getSelectionModel().getSelectionStart();
int endOffset = editor.getSelectionModel().getSelectionEnd();
expression = CodeInsightUtilBase.findElementInRange(psiFile, startOffset, endOffset,
JetExpression.class, JetLanguage.INSTANCE);
}
else {
int offset = editor.getCaretModel().getOffset();
expression = PsiTreeUtil.getParentOfType(psiFile.findElementAt(offset), JetExpression.class);
while (expression != null && bindingContext.getExpressionType(expression) == null) {
expression = PsiTreeUtil.getParentOfType(expression, JetExpression.class);
}
if (expression != null) {
editor.getSelectionModel().setSelection(expression.getTextRange().getStartOffset(),
expression.getTextRange().getEndOffset());
}
}
if (expression != null) {
JetType type = bindingContext.getExpressionType(expression);
if (type != null) {
HintManager.getInstance().showInformationHint(editor, type.toString());
}
}
}
@Override
public void update(AnActionEvent e) {
Editor editor = e.getData(PlatformDataKeys.EDITOR);
PsiFile psiFile = e.getData(LangDataKeys.PSI_FILE);
e.getPresentation().setEnabled(editor != null && psiFile instanceof JetFile);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册