support renderers in kotlin, groovy, etc (in correct context) idea/163.4040
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Tue, 6 Sep 2016 16:08:37 +0000 (19:08 +0300)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Tue, 6 Sep 2016 16:13:47 +0000 (19:13 +0300)
java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsImpl.java
java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java
java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/UserExpressionDescriptorImpl.java
java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CachedEvaluator.java
java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CustomFieldInplaceEditor.java
java/debugger/impl/src/org/jetbrains/java/debugger/JavaDebuggerEditorsProvider.java
platform/xdebugger-api/src/com/intellij/xdebugger/evaluation/XDebuggerEditorsProviderBase.java
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebuggerEditorBase.java

index 4f3ee71e9dc3687e1a172d67c2764534bc6c08e8..8e78429e46a66e697bbc7362331c51351e095851 100644 (file)
@@ -148,8 +148,8 @@ public class DebuggerUtilsImpl extends DebuggerUtilsEx{
   }
 
   @NotNull
-  public static Pair<PsiClass, PsiType> getPsiClassAndType(@Nullable String className, Project project) {
-    PsiClass contextClass = null;
+  public static Pair<PsiElement, PsiType> getPsiClassAndType(@Nullable String className, Project project) {
+    PsiElement contextClass = null;
     PsiType contextType = null;
     if (!StringUtil.isEmpty(className)) {
       PsiPrimitiveType primitiveType = PsiJavaParserFacadeImpl.getPrimitiveType(className);
@@ -160,10 +160,10 @@ public class DebuggerUtilsImpl extends DebuggerUtilsEx{
       else {
         contextClass = findClass(className, project, GlobalSearchScope.allScope(project));
         if (contextClass != null) {
-          contextClass = (PsiClass)contextClass.getNavigationElement();
+          contextClass = contextClass.getNavigationElement();
         }
         if (contextClass instanceof PsiCompiledElement) {
-          contextClass = (PsiClass)((PsiCompiledElement)contextClass).getMirror();
+          contextClass = ((PsiCompiledElement)contextClass).getMirror();
         }
         contextType = getType(className, project);
       }
index 520d7ec65ef23746a9a3b967da6dbd93064c611f..f8b7afa03a577f4f76cd8c5ec99fa3d983880aae 100644 (file)
@@ -29,10 +29,7 @@ import com.intellij.openapi.Disposable;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Pair;
-import com.intellij.psi.JavaCodeFragment;
-import com.intellij.psi.PsiClass;
-import com.intellij.psi.PsiDocumentManager;
-import com.intellij.psi.PsiType;
+import com.intellij.psi.*;
 import com.intellij.psi.impl.source.PsiTypeCodeFragmentImpl;
 import com.intellij.ui.*;
 import com.intellij.ui.components.JBCheckBox;
@@ -208,8 +205,8 @@ class CompoundRendererConfigurable extends JPanel {
     ApplicationManager.getApplication().runReadAction(() -> {
       Project project = myProject;
       if (project != null) {
-        Pair<PsiClass, PsiType> pair = DebuggerUtilsImpl.getPsiClassAndType(qName, project);
-        PsiClass context = pair.first;
+        Pair<PsiElement, PsiType>pair = DebuggerUtilsImpl.getPsiClassAndType(qName, project);
+        PsiElement context = pair.first;
         if (context != null) {
           myLabelEditor.setContext(context);
           myChildrenEditor.setContext(context);
index 9b9e4caa1b85aebe2b6e09ea0c89bbb511ecdca1..e0598029ddffde3cc61aad0e75ca64a6eaa41c63 100644 (file)
@@ -32,8 +32,8 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Pair;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.psi.JavaCodeFragment;
-import com.intellij.psi.PsiClass;
 import com.intellij.psi.PsiCodeFragment;
+import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiType;
 import com.sun.jdi.Type;
 import org.jetbrains.annotations.Nullable;
@@ -69,7 +69,7 @@ public class UserExpressionDescriptorImpl extends EvaluationDescriptor implement
   }
 
   protected PsiCodeFragment getEvaluationCode(final StackFrameContext context) throws EvaluateException {
-    Pair<PsiClass, PsiType> psiClassAndType = DebuggerUtilsImpl.getPsiClassAndType(myTypeName, myProject);
+    Pair<PsiElement, PsiType> psiClassAndType = DebuggerUtilsImpl.getPsiClassAndType(myTypeName, myProject);
     if (psiClassAndType.first == null) {
       throw EvaluateExceptionUtil.createEvaluateException(DebuggerBundle.message("evaluation.error.invalid.type.name", myTypeName));
     }
index 24e458e61ad5906c6c4c4798445ee8aa52cb6908..afbaf03bb741fde99c66759b58a75c2bd9f16667 100644 (file)
@@ -67,7 +67,7 @@ public abstract class CachedEvaluator {
   protected Cache initEvaluatorAndChildrenExpression(final Project project) {
     final Cache cache = new Cache();
     try {
-      Pair<PsiClass, PsiType> psiClassAndType = DebuggerUtilsImpl.getPsiClassAndType(getClassName(), project);
+      Pair<PsiElement, PsiType> psiClassAndType = DebuggerUtilsImpl.getPsiClassAndType(getClassName(), project);
       if (psiClassAndType.first == null) {
         throw EvaluateExceptionUtil.CANNOT_FIND_SOURCE_CLASS;
       }
index 7ba610d5c352b2c130c9367d4ce91b43af8f712c..7ecebbcb3f33705c0f4168d4f1e4db4507d98d75 100644 (file)
@@ -23,7 +23,7 @@ import com.intellij.debugger.settings.NodeRendererSettings;
 import com.intellij.debugger.ui.impl.watch.UserExpressionDescriptorImpl;
 import com.intellij.debugger.ui.impl.watch.ValueDescriptorImpl;
 import com.intellij.openapi.util.Pair;
-import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiType;
 import com.intellij.xdebugger.frame.XValue;
 import com.intellij.xdebugger.frame.XValueNode;
@@ -58,7 +58,7 @@ public class CustomFieldInplaceEditor extends XDebuggerTreeInplaceEditor {
     myExpressionEditor.setExpression(descriptor != null ? TextWithImportsImpl.toXExpression(descriptor.getEvaluationText()) : null);
 
     ValueDescriptorImpl parentDescriptor = ((JavaValue)((XValueContainerNode)node.getParent()).getValueContainer()).getDescriptor();
-    Pair<PsiClass, PsiType> pair = DebuggerUtilsImpl.getPsiClassAndType(getTypeName(parentDescriptor), getProject());
+    Pair<PsiElement, PsiType> pair = DebuggerUtilsImpl.getPsiClassAndType(getTypeName(parentDescriptor), getProject());
     if (pair.first != null) {
       myExpressionEditor.setContext(pair.first);
     }
index f1fa33339f7f4dc14d237c8397e746166d224006..2af4c3caef600ab1b4fb0e71fdd7a413efd83b02 100644 (file)
@@ -56,14 +56,19 @@ public class JavaDebuggerEditorsProvider extends XDebuggerEditorsProviderBase {
     return JavaCodeFragmentFactory.getInstance(project).createExpressionCodeFragment(text, context, null, isPhysical);
   }
 
+  @NotNull
+  @Override
+  public Collection<Language> getSupportedLanguages(@Nullable PsiElement context) {
+    return DebuggerUtilsEx.getCodeFragmentFactories(context).stream()
+      .map(factory -> factory.getFileType().getLanguage())
+      .collect(Collectors.toList());
+  }
+
   @NotNull
   @Override
   public Collection<Language> getSupportedLanguages(@NotNull Project project, @Nullable XSourcePosition sourcePosition) {
     if (sourcePosition != null) {
-      PsiElement context = getContextElement(sourcePosition.getFile(), sourcePosition.getOffset(), project);
-      return DebuggerUtilsEx.getCodeFragmentFactories(context).stream()
-        .map(factory -> factory.getFileType().getLanguage())
-        .collect(Collectors.toList());
+      return getSupportedLanguages(getContextElement(sourcePosition.getFile(), sourcePosition.getOffset(), project));
     }
     return Collections.emptyList();
   }
index 85e3a1e6617413b66f3f3ab13ea19744fe3b8343..7ec9966fabade4b09f49977f1a7b0e0a56fee2a1 100644 (file)
@@ -15,6 +15,7 @@
  */
 package com.intellij.xdebugger.evaluation;
 
+import com.intellij.lang.Language;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vfs.VirtualFile;
@@ -27,6 +28,9 @@ import com.intellij.xdebugger.XSourcePosition;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import java.util.Collection;
+import java.util.Collections;
+
 public abstract class XDebuggerEditorsProviderBase extends XDebuggerEditorsProvider {
   @NotNull
   @Override
@@ -72,6 +76,14 @@ public abstract class XDebuggerEditorsProviderBase extends XDebuggerEditorsProvi
     return createExpressionCodeFragment(project, expression.getExpression(), context, isPhysical);
   }
 
+  @NotNull
+  public Collection<Language> getSupportedLanguages(@Nullable PsiElement context) {
+    if (context != null) {
+      return getSupportedLanguages(context.getProject(), null);
+    }
+    return Collections.emptyList();
+  }
+
   @Nullable
   protected PsiElement getContextElement(@NotNull VirtualFile virtualFile, int offset, @NotNull Project project) {
     return XDebuggerUtil.getInstance().findContextElement(virtualFile, offset, project, false);
index 5c208d253af8fd806643d2459f874187bcafbbdb..2e95dc5af9b7ec2ba1f2d1b11efb165affbe640e 100644 (file)
@@ -108,7 +108,7 @@ public abstract class XDebuggerEditorBase {
 
   private ListPopup createLanguagePopup() {
     DefaultActionGroup actions = new DefaultActionGroup();
-    for (final Language language : getEditorsProvider().getSupportedLanguages(myProject, mySourcePosition)) {
+    for (Language language : getSupportedLanguages()) {
       //noinspection ConstantConditions
       actions.add(new AnAction(language.getDisplayName(), null, language.getAssociatedFileType().getIcon()) {
         @Override
@@ -126,6 +126,17 @@ public abstract class XDebuggerEditorBase {
                                                                false);
   }
 
+  @NotNull
+  private Collection<Language> getSupportedLanguages() {
+    XDebuggerEditorsProvider editorsProvider = getEditorsProvider();
+    if (myContext != null && editorsProvider instanceof XDebuggerEditorsProviderBase) {
+      return ((XDebuggerEditorsProviderBase)editorsProvider).getSupportedLanguages(myContext);
+    }
+    else {
+      return editorsProvider.getSupportedLanguages(myProject, mySourcePosition);
+    }
+  }
+
   protected JPanel decorate(JComponent component, boolean multiline, boolean showEditor) {
     JPanel panel = JBUI.Panels.simplePanel();
 
@@ -182,7 +193,10 @@ public abstract class XDebuggerEditorBase {
     }
     Language language = text.getLanguage();
     if (language == null) {
-      if (mySourcePosition != null) {
+      if (myContext != null) {
+        language = myContext.getLanguage();
+      }
+      if (language == null && mySourcePosition != null) {
         language = LanguageUtil.getFileLanguage(mySourcePosition.getFile());
       }
       if (language == null) {
@@ -191,7 +205,7 @@ public abstract class XDebuggerEditorBase {
       text = new XExpressionImpl(text.getExpression(), language, text.getCustomInfo(), text.getMode());
     }
 
-    Collection<Language> languages = getEditorsProvider().getSupportedLanguages(myProject, mySourcePosition);
+    Collection<Language> languages = getSupportedLanguages();
     boolean many = languages.size() > 1;
 
     if (language != null) {