diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml
index aac36d31f2d..5a9f30decb1 100644
--- a/idea/src/META-INF/plugin.xml
+++ b/idea/src/META-INF/plugin.xml
@@ -14,7 +14,11 @@
-
+
+
+
+
diff --git a/idea/src/org/jetbrains/jet/plugin/actions/ShowExpressionTypeAction.java b/idea/src/org/jetbrains/jet/plugin/actions/ShowExpressionTypeAction.java
new file mode 100644
index 00000000000..8c452841f10
--- /dev/null
+++ b/idea/src/org/jetbrains/jet/plugin/actions/ShowExpressionTypeAction.java
@@ -0,0 +1,61 @@
+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);
+ }
+}