rewrite JavaScriptDebugAware to simplify support evaluate/variable view
authorVladimir Krivosheev <vladimir.krivosheev@jetbrains.com>
Wed, 21 Jan 2015 20:55:28 +0000 (21:55 +0100)
committerVladimir Krivosheev <vladimir.krivosheev@jetbrains.com>
Wed, 21 Jan 2015 20:55:28 +0000 (21:55 +0100)
implement dart quick evaluate
initial GWT quick evaluate
improve uglified quick evaluate

platform/script-debugger/backend/src/org/jetbrains/debugger/ValueModifierUtil.java
platform/script-debugger/backend/src/org/jetbrains/debugger/sourcemap/MappingList.java
platform/script-debugger/debugger-ui/src/com/jetbrains/javascript/debugger/ExpressionInfoFactory.java [new file with mode: 0644]
platform/script-debugger/debugger-ui/src/com/jetbrains/javascript/debugger/JavaScriptDebugAware.java
platform/script-debugger/debugger-ui/src/com/jetbrains/javascript/debugger/NameMapper.java

index f903a705f37fa3a5dbd8c5f90957e78774774d86..1945a21e2b7d8cadbed000a887d077d803d49161 100644 (file)
@@ -41,7 +41,8 @@ public final class ValueModifierUtil {
       });
   }
 
-  public static String propertyNamesToString(List<String> list, boolean quotedAware) {
+  @NotNull
+  public static String propertyNamesToString(@NotNull List<String> list, boolean quotedAware) {
     StringBuilder builder = new StringBuilder();
     for (int i = list.size() - 1; i >= 0; i--) {
       String name = list.get(i);
index 03819858f3edf224278955e97fbfcfe9f68cf8b1..77620bd4e11f90a6062f6312bcb94d0359fb2b19 100644 (file)
@@ -67,9 +67,10 @@ public abstract class MappingList {
           }
         }
         else {
-          MappingEntry nextMapping = getNextOnTheSameLine(middle, false);
           // https://code.google.com/p/google-web-toolkit/issues/detail?id=9103
-          if (nextMapping == null || column > getColumn(nextMapping)) {
+          // We skipIfColumnEquals because GWT has two entries — source position equals, but generated no. We must use first entry (at least, in case of GWT it is correct)
+          MappingEntry nextMapping = getNextOnTheSameLine(middle);
+          if (nextMapping == null) {
             return middle;
           }
           else {
diff --git a/platform/script-debugger/debugger-ui/src/com/jetbrains/javascript/debugger/ExpressionInfoFactory.java b/platform/script-debugger/debugger-ui/src/com/jetbrains/javascript/debugger/ExpressionInfoFactory.java
new file mode 100644 (file)
index 0000000..fa845b6
--- /dev/null
@@ -0,0 +1,11 @@
+package com.jetbrains.javascript.debugger;
+
+import com.intellij.openapi.editor.Document;
+import com.intellij.psi.PsiElement;
+import com.intellij.xdebugger.evaluation.ExpressionInfo;
+import org.jetbrains.annotations.NotNull;
+
+public interface ExpressionInfoFactory {
+  @NotNull
+  ExpressionInfo create(@NotNull PsiElement element, @NotNull Document document);
+}
index 1397fe001f62223be1fd63fc71b5498011413013..c0cad703e30dafd436cacf74b91450c17ffb1635 100644 (file)
@@ -3,8 +3,7 @@ package com.jetbrains.javascript.debugger;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.extensions.ExtensionPointName;
 import com.intellij.openapi.fileTypes.FileType;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.TextRange;
+import com.intellij.openapi.fileTypes.LanguageFileType;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiFile;
 import com.intellij.xdebugger.breakpoints.XLineBreakpointType;
@@ -17,12 +16,12 @@ public abstract class JavaScriptDebugAware {
   public static final ExtensionPointName<JavaScriptDebugAware> EP_NAME = ExtensionPointName.create("com.jetbrains.javaScriptDebugAware");
 
   @Nullable
-  public FileType getFileType() {
+  protected LanguageFileType getFileType() {
     return null;
   }
 
   @Nullable
-  public XLineBreakpointType<?> getBreakpointTypeClass(@NotNull Project project) {
+  public Class<? extends XLineBreakpointType<?>> getBreakpointTypeClass() {
     return null;
   }
 
@@ -34,32 +33,26 @@ public abstract class JavaScriptDebugAware {
     return true;
   }
 
-  @Nullable
-  public TextRange getRangeForNamedElement(@NotNull PsiElement element, @Nullable PsiElement parent, int offset) {
-    return null;
+  public final boolean canGetEvaluationInfo(@NotNull PsiFile file) {
+    return file.getFileType().equals(getFileType());
   }
 
   @Nullable
-  public ExpressionInfo getEvaluationInfo(@NotNull PsiElement element, @NotNull Document document, @NotNull Project project) {
-    return null;
+  public final ExpressionInfo getEvaluationInfo(@NotNull PsiFile file, int offset, @NotNull Document document, @NotNull ExpressionInfoFactory expressionInfoFactory) {
+    PsiElement element = file.findElementAt(offset);
+    return element == null ? null : getEvaluationInfo(element, document, expressionInfoFactory);
   }
 
   @Nullable
-  public static JavaScriptDebugAware find(@Nullable FileType fileType) {
-    if (fileType == null) {
-      return null;
-    }
+  protected abstract ExpressionInfo getEvaluationInfo(@NotNull PsiElement elementAtOffset, @NotNull Document document, @NotNull ExpressionInfoFactory expressionInfoFactory);
 
+  public static boolean isBreakpointAware(@NotNull FileType fileType) {
     for (JavaScriptDebugAware debugAware : EP_NAME.getExtensions()) {
-      if (fileType.equals(debugAware.getFileType())) {
-        return debugAware;
+      if (debugAware.getBreakpointTypeClass() == null && fileType.equals(debugAware.getFileType())) {
+        return true;
       }
     }
-    return null;
-  }
-
-  public static boolean isBreakpointAware(@Nullable FileType fileType) {
-    return find(fileType) != null;
+    return false;
   }
 
   @Nullable
index 1689becba35fdfc03a8c681c5823e750e9b3ff25..62093435e017e2f331840aa4762c0a4522f2acfe 100644 (file)
@@ -13,7 +13,7 @@ import org.jetbrains.debugger.sourcemap.SourceMap;
 import java.util.Map;
 
 public final class NameMapper {
-  public static final CharMatcher NAME_TRIMMER = CharMatcher.INVISIBLE.or(CharMatcher.anyOf(",()[]{}="));
+  private static final CharMatcher NAME_TRIMMER = CharMatcher.INVISIBLE.or(CharMatcher.anyOf(",()[]{}="));
 
   private final Document document;
   private final Document generatedDocument;
@@ -41,7 +41,7 @@ public final class NameMapper {
     MappingEntry sourceEntry = sourceMappings.get(line, offset - document.getLineStartOffset(line));
     String sourceEntryName = sourceEntry == null ? null : sourceEntry.getName();
     if (sourceEntry != null) {
-      String generatedName = NAME_TRIMMER.trimFrom(getGeneratedName(generatedDocument, sourceMap, sourceEntry));
+      String generatedName = trimName(getGeneratedName(generatedDocument, sourceMap, sourceEntry));
       if (!generatedName.isEmpty()) {
         String sourceName = sourceEntryName;
         if (sourceName == null) {
@@ -51,13 +51,6 @@ public final class NameMapper {
           }
         }
 
-        // GWT - button_0_g$ = new Button_5_g$('Click me');
-        // so, we should remove all after "="
-        int i = generatedName.indexOf('=');
-        if (i > 0) {
-          generatedName = NAME_TRIMMER.trimFrom(generatedName.substring(0, i));
-        }
-
         if (nameMappings == null) {
           nameMappings = new THashMap<String, String>();
         }
@@ -66,6 +59,15 @@ public final class NameMapper {
     }
   }
 
+  @NotNull
+  public static String trimName(@NotNull CharSequence rawGeneratedName) {
+    String generatedName = NAME_TRIMMER.trimFrom(rawGeneratedName);
+    // GWT - button_0_g$ = new Button_5_g$('Click me');
+    // so, we should remove all after "="
+    int i = generatedName.indexOf('=');
+    return i > 0 ? NAME_TRIMMER.trimFrom(generatedName.substring(0, i)) : generatedName;
+  }
+
   @NotNull
   private static CharSequence getGeneratedName(@NotNull Document document, @NotNull SourceMap sourceMap, @NotNull MappingEntry sourceEntry) {
     int lineStartOffset = document.getLineStartOffset(sourceEntry.getGeneratedLine());