Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Unified Diff: editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartDoubleClickSelector.java

Issue 121733002: Fix double-clicking in string interpolation (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartDoubleClickSelector.java
diff --git a/editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartDoubleClickSelector.java b/editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartDoubleClickSelector.java
index 2ddd39dfd37d4d2676becf30e5757b8389c7cdab..008e5d4e6b959d87b6cd08664760fe9ae8a4ca7a 100644
--- a/editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartDoubleClickSelector.java
+++ b/editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartDoubleClickSelector.java
@@ -13,6 +13,12 @@
*/
package com.google.dart.tools.ui.internal.text.dart;
+import com.google.dart.engine.ast.ASTNode;
+import com.google.dart.engine.ast.InterpolationExpression;
+import com.google.dart.engine.ast.InterpolationString;
+import com.google.dart.engine.ast.SimpleIdentifier;
+import com.google.dart.engine.ast.visitor.NodeLocator;
+import com.google.dart.tools.ui.internal.text.editor.CompilationUnitEditor;
import com.google.dart.tools.ui.internal.text.functions.DartPairMatcher;
import com.google.dart.tools.ui.internal.text.functions.ISourceVersionDependent;
import com.google.dart.tools.ui.text.editor.tmp.JavaScriptCore;
@@ -26,6 +32,8 @@ import org.eclipse.jface.text.Region;
/**
* Double click strategy aware of Java identifier syntax rules.
+ *
+ * @coverage dart.editor.ui.text
*/
public class DartDoubleClickSelector implements ITextDoubleClickStrategy, ISourceVersionDependent {
@@ -99,9 +107,8 @@ public class DartDoubleClickSelector implements ITextDoubleClickStrategy, ISourc
++offset;
}
- offset = anchor; // use to not select the previous word when right
-// behind it
-// offset= anchor - 1; // use to select the previous word when right behind it
+ offset = anchor; // use to not select the previous word when right behind it
+// offset = anchor - 1; // use to select the previous word when right behind it
while (offset >= min) {
c = document.getChar(offset);
if (!backward(c, offset)) {
@@ -325,7 +332,21 @@ public class DartDoubleClickSelector implements ITextDoubleClickStrategy, ISourc
if (region != null && region.getLength() >= 2) {
textViewer.setSelectedRange(region.getOffset() + 1, region.getLength() - 2);
} else {
- region = selectWord(document, offset);
+ CompilationUnitEditor editor = ((CompilationUnitEditor.AdaptedSourceViewer) textViewer).getEditor();
+ NodeLocator locator = new NodeLocator(offset);
+ ASTNode node = locator.searchWithin(editor.getInputUnit());
+ if (node instanceof SimpleIdentifier) {
+ region = new Region(node.getOffset(), node.getLength());
+ } else if (node instanceof InterpolationString) {
+ region = computeStringRegion(node);
+ if (region == null) {
+ region = selectWord(document, offset);
+ }
+ } else if (node instanceof InterpolationExpression) {
+ region = new Region(node.getOffset(), node.getLength());
+ } else {
+ region = selectWord(document, offset);
+ }
textViewer.setSelectedRange(region.getOffset(), region.getLength());
}
}
@@ -336,6 +357,32 @@ public class DartDoubleClickSelector implements ITextDoubleClickStrategy, ISourc
fWordDetector.setSourceVersion(version);
}
+ protected IRegion computeStringRegion(ASTNode node) {
+ int start = node.getOffset();
+ int originalStart = start;
+ int end = node.getEnd();
+ InterpolationString str = (InterpolationString) node;
+ String chars = str.getContents().getLexeme();
+ if (chars != null && chars.length() > 0) {
+ char ch = chars.charAt(0);
+ if (ch == '\'' || ch == '"') {
+ start += 1;
+ }
+ if (start == originalStart || chars.length() > 1) {
+ ch = chars.charAt(chars.length() - 1);
+ if (ch == '\'' || ch == '"') {
+ end -= 1;
+ }
+ }
+ return new Region(start, end - start);
+ }
+ return null; // should not happen
+ }
+
+ protected void selectExpression(ASTNode node, ITextViewer textViewer) {
+ textViewer.setSelectedRange(node.getOffset(), node.getLength());
+ }
+
protected IRegion selectWord(IDocument document, int anchor) {
return fWordDetector.getWordSelection(document, anchor);
}
« no previous file with comments | « no previous file | editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/text/dart/DartStringDoubleClickSelector.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698