mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
groovy string select word2
This commit is contained in:
@@ -157,11 +157,14 @@
|
||||
|
||||
<indexPatternBuilder implementation="org.jetbrains.plugins.groovy.util.GroovyIndexPatternBuilder"/>
|
||||
|
||||
<basicWordSelectionFilter implementation="org.jetbrains.plugins.groovy.editor.selection.GroovyWordSelectionFilter"/>
|
||||
<extendWordSelectionHandler implementation="org.jetbrains.plugins.groovy.editor.selection.GroovyLiteralSelectioner"/>
|
||||
<extendWordSelectionHandler implementation="org.jetbrains.plugins.groovy.editor.selection.GroovyBlockStatementsSelectioner"/>
|
||||
<extendWordSelectionHandler implementation="org.jetbrains.plugins.groovy.editor.selection.GroovyTypeCastSelectioner"/>
|
||||
<extendWordSelectionHandler implementation="org.jetbrains.plugins.groovy.editor.selection.GroovyDocParamsSelectioner"/>
|
||||
<extendWordSelectionHandler implementation="org.jetbrains.plugins.groovy.editor.selection.GroovyArgListSelectioner"/>
|
||||
<extendWordSelectionHandler implementation="org.jetbrains.plugins.groovy.editor.selection.GroovyGStringSelectioner" order="before wordSelectioner"/>
|
||||
<extendWordSelectionHandler implementation="org.jetbrains.plugins.groovy.editor.selection.GroovyParameterListSelectioner"/>
|
||||
|
||||
<methodReferencesSearch implementation="org.jetbrains.plugins.groovy.findUsages.AccessorReferencesSearcher"/>
|
||||
<methodReferencesSearch implementation="org.jetbrains.plugins.groovy.findUsages.MethodLateBoundReferencesSearcher"/>
|
||||
|
||||
+4
-96
@@ -16,111 +16,19 @@
|
||||
|
||||
package org.jetbrains.plugins.groovy.editor.selection;
|
||||
|
||||
import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandler;
|
||||
import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandlerBase;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.util.text.CharArrayUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author ilyas
|
||||
*/
|
||||
public abstract class GroovyBasicSelectioner implements ExtendWordSelectionHandler {
|
||||
|
||||
public abstract class GroovyBasicSelectioner extends ExtendWordSelectionHandlerBase {
|
||||
public List<TextRange> select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) {
|
||||
|
||||
final TextRange originalRange = e.getTextRange();
|
||||
List<TextRange> ranges = expandToWholeLine(editorText, originalRange, true);
|
||||
|
||||
if (ranges.size() == 1 && ranges.contains(originalRange)) {
|
||||
ranges = expandToWholeLine(editorText, originalRange, false);
|
||||
}
|
||||
|
||||
List<TextRange> result = new ArrayList<TextRange>();
|
||||
result.addAll(ranges);
|
||||
return result;
|
||||
List<TextRange> ranges = super.select(e, editorText, cursorOffset, editor);
|
||||
return ranges;
|
||||
}
|
||||
|
||||
static List<TextRange> expandToWholeLine(CharSequence text, TextRange range, boolean isSymmetric) {
|
||||
int textLength = text.length();
|
||||
List<TextRange> result = new ArrayList<TextRange>();
|
||||
|
||||
if (range == null) {
|
||||
return result;
|
||||
}
|
||||
|
||||
boolean hasNewLines = false;
|
||||
|
||||
for (int i = range.getStartOffset(); i < range.getEndOffset(); i++) {
|
||||
char c = text.charAt(i);
|
||||
|
||||
if (c == '\r' || c == '\n') {
|
||||
hasNewLines = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasNewLines) {
|
||||
result.add(range);
|
||||
}
|
||||
|
||||
|
||||
int startOffset = range.getStartOffset();
|
||||
int endOffset = range.getEndOffset();
|
||||
int index1 = CharArrayUtil.shiftBackward(text, startOffset - 1, " \t");
|
||||
if (endOffset > startOffset && text.charAt(endOffset - 1) == '\n' || text.charAt(endOffset - 1) == '\r') {
|
||||
endOffset--;
|
||||
}
|
||||
int index2 = Math.min(textLength, CharArrayUtil.shiftForward(text, endOffset, " \t"));
|
||||
|
||||
if (index1 < 0
|
||||
|| text.charAt(index1) == '\n'
|
||||
|| text.charAt(index1) == '\r'
|
||||
|| index2 == textLength
|
||||
|| text.charAt(index2) == '\n'
|
||||
|| text.charAt(index2) == '\r') {
|
||||
|
||||
if (!isSymmetric) {
|
||||
if (index1 < 0 || text.charAt(index1) == '\n' || text.charAt(index1) == '\r') {
|
||||
startOffset = index1 + 1;
|
||||
}
|
||||
|
||||
if (index2 == textLength || text.charAt(index2) == '\n' || text.charAt(index2) == '\r') {
|
||||
endOffset = index2;
|
||||
if (endOffset < textLength) {
|
||||
endOffset++;
|
||||
if (endOffset < textLength && text.charAt(endOffset - 1) == '\r' && text.charAt(endOffset) == '\n') {
|
||||
endOffset++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result.add(new TextRange(startOffset, endOffset));
|
||||
} else {
|
||||
if ((index1 < 0 || text.charAt(index1) == '\n' || text.charAt(index1) == '\r') &&
|
||||
(index2 == textLength || text.charAt(index2) == '\n' || text.charAt(index2) == '\r')) {
|
||||
startOffset = index1 + 1;
|
||||
endOffset = index2;
|
||||
if (endOffset < textLength) {
|
||||
endOffset++;
|
||||
if (endOffset < textLength && text.charAt(endOffset - 1) == '\r' && text.charAt(endOffset) == '\n') {
|
||||
endOffset++;
|
||||
}
|
||||
}
|
||||
result.add(new TextRange(startOffset, endOffset));
|
||||
} else {
|
||||
result.add(range);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
result.add(range);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
+38
-4
@@ -21,7 +21,9 @@ import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes;
|
||||
import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.mGSTRING_CONTENT;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.util.GrStringUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -40,19 +42,51 @@ public class GroovyLiteralSelectioner extends GroovyBasicSelectioner {
|
||||
if (node == null) return false;
|
||||
ASTNode[] children = node.getChildren(null);
|
||||
return children.length == 1 &&
|
||||
(children[0].getElementType() == GroovyTokenTypes.mSTRING_LITERAL ||
|
||||
(children[0].getElementType() == GroovyTokenTypes.mSTRING_LITERAL ||
|
||||
children[0].getElementType() == GroovyTokenTypes.mGSTRING_LITERAL);
|
||||
}
|
||||
|
||||
public List<TextRange> select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) {
|
||||
List<TextRange> result = super.select(e, editorText, cursorOffset, editor);
|
||||
|
||||
TextRange range = e.getTextRange();
|
||||
/* TextRange range = e.getTextRange();
|
||||
if (range.getLength() <= 2) {
|
||||
result.add(range);
|
||||
} else {
|
||||
result.add(new TextRange(range.getStartOffset() + 1, range.getEndOffset() - 1));
|
||||
}
|
||||
else {
|
||||
result.add(new TextRange(range.getStartOffset() + 1, range.getEndOffset() - 1));
|
||||
}*/
|
||||
|
||||
int startOffset = -1;
|
||||
int endOffset = -1;
|
||||
final String text = e.getText();
|
||||
final int stringOffset = e.getTextOffset();
|
||||
if (e.getNode().getElementType() == mGSTRING_CONTENT) {
|
||||
int cur;
|
||||
int index = -1;
|
||||
while (true) {
|
||||
cur = text.indexOf('\n', index + 1);
|
||||
if (cur < 0 || cur + stringOffset > cursorOffset) break;
|
||||
index = cur;
|
||||
}
|
||||
if (index >= 0) {
|
||||
startOffset = stringOffset + index + 1;
|
||||
}
|
||||
|
||||
index = text.indexOf('\n', cursorOffset - stringOffset);
|
||||
if (index >= 0) {
|
||||
endOffset = stringOffset + index + 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (startOffset >= 0 && endOffset >= 0) {
|
||||
result.add(new TextRange(startOffset, endOffset));
|
||||
}
|
||||
|
||||
final String content = GrStringUtil.removeQuotes(text);
|
||||
|
||||
final int offset = stringOffset + text.indexOf(content);
|
||||
result.add(new TextRange(offset, offset + content.length()));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
/* The following code was generated by JFlex 1.4.1 on 12.10.09 13:24 */
|
||||
/* The following code was generated by JFlex 1.4.1 on 15.10.09 16:49 */
|
||||
|
||||
/*
|
||||
* Copyright 2000-2007 JetBrains s.r.o.
|
||||
@@ -19,14 +19,15 @@ package org.jetbrains.plugins.groovy.lang.lexer;
|
||||
|
||||
import com.intellij.lexer.FlexLexer;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
|
||||
import java.util.Stack;
|
||||
import java.util.*;
|
||||
import java.lang.reflect.Field;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
|
||||
/**
|
||||
* This class is a scanner generated by
|
||||
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1
|
||||
* on 12.10.09 13:24 from the specification file
|
||||
* on 15.10.09 16:49 from the specification file
|
||||
* <tt>groovy.flex</tt>
|
||||
*/
|
||||
public class _GroovyLexer implements FlexLexer, GroovyTokenTypes {
|
||||
@@ -213,7 +214,7 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes {
|
||||
"\0\u0460\0\u04a6\0\u04ec\0\u0532\0\u0578\0\u05be\0\u0604\0\u064a"+
|
||||
"\0\u0690\0\u06d6\0\u0690\0\u071c\0\u0762\0\u07a8\0\u07ee\0\u0834"+
|
||||
"\0\u087a\0\u08c0\0\u0906\0\u094c\0\u0992\0\u09d8\0\u0a1e\0\u0a64"+
|
||||
"\0\u0aaa\0\u0af0\0\u0b36\0\u0690\0\u0b7c\0\u0bc2\0\u0c08\0\u0c4e"+
|
||||
"\0\u0aaa\0\u0af0\0\u0b36\0\u087a\0\u0b7c\0\u0bc2\0\u0c08\0\u0c4e"+
|
||||
"\0\u0c94\0\u0cda\0\u0690\0\u0690\0\u0d20\0\u0d66\0\u0690\0\u0690"+
|
||||
"\0\u0690\0\u0690\0\u0690\0\u0690\0\u0dac\0\u0df2\0\u0690\0\u0e38"+
|
||||
"\0\u0e7e\0\u0ec4\0\u0f0a\0\u0690\0\u0690\0\u0f50\0\u0f96\0\u0fdc"+
|
||||
@@ -762,23 +763,22 @@ public class _GroovyLexer implements FlexLexer, GroovyTokenTypes {
|
||||
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 =
|
||||
"\21\0\1\1\6\0\1\11\1\1\1\11\20\1\1\11"+
|
||||
"\6\1\2\11\2\1\6\11\2\1\1\11\4\1\2\11"+
|
||||
"\6\1\1\11\1\1\2\11\1\1\1\11\2\1\1\0"+
|
||||
"\2\11\1\7\1\1\1\11\1\1\2\3\1\11\1\1"+
|
||||
"\1\11\2\1\2\11\2\1\3\11\1\1\1\11\2\1"+
|
||||
"\5\11\5\1\1\11\2\1\1\11\1\1\1\11\1\3"+
|
||||
"\1\11\3\1\1\11\1\1\1\11\1\1\1\0\3\1"+
|
||||
"\1\11\1\1\2\11\1\1\6\11\2\0\15\1\5\11"+
|
||||
"\1\0\1\1\1\11\11\1\2\0\2\1\1\0\1\1"+
|
||||
"\2\11\1\1\1\11\1\1\1\0\1\11\1\0\6\11"+
|
||||
"\21\1\1\0\2\1\2\5\3\0\2\1\1\0\3\1"+
|
||||
"\2\0\3\1\1\5\1\0\2\1\1\11\1\1\1\0"+
|
||||
"\17\1\2\11\14\1\1\11\1\1\1\11\1\1\4\11"+
|
||||
"\1\0\25\1\2\11\1\0\10\1\2\11\30\1\3\0"+
|
||||
"\1\1\1\0\1\11\24\1\1\15\1\0\5\1\1\11"+
|
||||
"\1\0\21\1\2\0\1\1\1\0\24\1\1\0\15\1"+
|
||||
"\2\0\63\1";
|
||||
"\21\0\1\1\6\0\1\11\1\1\1\11\27\1\2\11"+
|
||||
"\2\1\6\11\2\1\1\11\4\1\2\11\6\1\1\11"+
|
||||
"\1\1\2\11\1\1\1\11\2\1\1\0\2\11\1\7"+
|
||||
"\1\1\1\11\1\1\2\3\1\11\1\1\1\11\2\1"+
|
||||
"\2\11\2\1\3\11\1\1\1\11\2\1\5\11\5\1"+
|
||||
"\1\11\2\1\1\11\1\1\1\11\1\3\1\11\3\1"+
|
||||
"\1\11\1\1\1\11\1\1\1\0\3\1\1\11\1\1"+
|
||||
"\2\11\1\1\6\11\2\0\15\1\5\11\1\0\1\1"+
|
||||
"\1\11\11\1\2\0\2\1\1\0\1\1\2\11\1\1"+
|
||||
"\1\11\1\1\1\0\1\11\1\0\6\11\21\1\1\0"+
|
||||
"\2\1\2\5\3\0\2\1\1\0\3\1\2\0\3\1"+
|
||||
"\1\5\1\0\2\1\1\11\1\1\1\0\17\1\2\11"+
|
||||
"\14\1\1\11\1\1\1\11\1\1\4\11\1\0\25\1"+
|
||||
"\2\11\1\0\10\1\2\11\30\1\3\0\1\1\1\0"+
|
||||
"\1\11\24\1\1\15\1\0\5\1\1\11\1\0\21\1"+
|
||||
"\2\0\1\1\1\0\24\1\1\0\15\1\2\0\63\1";
|
||||
|
||||
private static int [] zzUnpackAttribute() {
|
||||
int [] result = new int[482];
|
||||
|
||||
@@ -125,7 +125,7 @@ mNUM_BIG_DECIMAL = {mNUM_INT_PART} ( ("." {mDIGIT}+ {mEXPONENT}? {mBIG_SUFFIX}?)
|
||||
|
||||
mLETTER = [:letter:] | "_"
|
||||
|
||||
mIDENT = {mLETTER} ({mLETTER} | {mDIGIT} | \$)*
|
||||
mIDENT = ({mLETTER}|\$) ({mLETTER} | {mDIGIT} | \$)*
|
||||
mIDENT_NOBUCKS = {mLETTER} ({mLETTER} | {mDIGIT})*
|
||||
|
||||
|
||||
|
||||
-4
@@ -137,10 +137,6 @@ public class GrModifierListImpl extends GroovyPsiElementImpl implements GrModifi
|
||||
}
|
||||
}
|
||||
|
||||
if (parent instanceof GrTypeDefinition && PsiModifier.STATIC.equals(modifier)) {
|
||||
if (((GrTypeDefinition)parent).getContainingClass() == null) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -234,7 +234,8 @@ public class GrStringUtil {
|
||||
final GrClosableBlock closableBlock = ((GrStringInjection)child).getClosableBlock();
|
||||
final GrReferenceExpression refExpr = (GrReferenceExpression)closableBlock.getStatements()[0];
|
||||
final GrReferenceExpression copy = (GrReferenceExpression)refExpr.copy();
|
||||
closableBlock.replace(copy);
|
||||
final ASTNode oldNode = closableBlock.getNode();
|
||||
oldNode.getTreeParent().replaceChild(oldNode, copy.getNode());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -423,7 +423,7 @@ public class PsiUtil {
|
||||
if (qualifier != null) {
|
||||
if (qualifier instanceof GrReferenceExpression) {
|
||||
PsiElement qualifierResolved = ((GrReferenceExpression)qualifier).resolve();
|
||||
if (qualifierResolved instanceof PsiClass) { //static context
|
||||
if (qualifierResolved instanceof PsiClass || qualifierResolved instanceof PsiPackage) { //static context
|
||||
if (owner instanceof PsiClass) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -33,8 +33,22 @@ public class GroovyActionsTest extends LightCodeInsightFixtureTestCase {
|
||||
}
|
||||
|
||||
public void testSelectWordBeforeMethod() throws Throwable {
|
||||
doTestForSelectWord(1);
|
||||
}
|
||||
|
||||
public void testSWInGString1() throws Exception {doTestForSelectWord(1);}
|
||||
public void testSWInGString2() throws Exception {doTestForSelectWord(2);}
|
||||
public void testSWInGString3() throws Exception {doTestForSelectWord(3);}
|
||||
public void testSWInGString4() throws Exception {doTestForSelectWord(4);}
|
||||
public void testSWInGString5() throws Exception {doTestForSelectWord(5);}
|
||||
public void testSWInParameterList() throws Exception {doTestForSelectWord(3);}
|
||||
|
||||
private void doTestForSelectWord(int count) throws Exception {
|
||||
myFixture.configureByFile(getTestName(false) + ".groovy");
|
||||
performEditorAction(IdeActions.ACTION_EDITOR_SELECT_WORD_AT_CARET);
|
||||
myFixture.getEditor().getSettings().setCamelWords(true);
|
||||
for (int i = 0; i < count; i++) {
|
||||
performEditorAction(IdeActions.ACTION_EDITOR_SELECT_WORD_AT_CARET);
|
||||
}
|
||||
myFixture.checkResultByFile(getTestName(false) + "_after.groovy");
|
||||
}
|
||||
|
||||
|
||||
@@ -183,4 +183,8 @@ public class GroovyHighlightingTest extends LightCodeInsightFixtureTestCase {
|
||||
}
|
||||
|
||||
public void testRawOverridedMethod() throws Exception {doTest();}
|
||||
|
||||
public void testFQNJavaClassesUsages() throws Exception {
|
||||
doTest();
|
||||
}
|
||||
}
|
||||
+1
@@ -42,6 +42,7 @@ public class StatementsParsingTest extends GroovyParsingTestCase {
|
||||
public void testDeclaration$decl7() throws Throwable { doTest(); }
|
||||
public void testDeclaration$decl8() throws Throwable { doTest(); }
|
||||
public void testDeclaration$decl9() throws Throwable { doTest(); }
|
||||
public void testDeclaration$dollar() throws Throwable {doTest();}
|
||||
public void testDeclaration$groovyMain() throws Throwable { doTest(); }
|
||||
public void testDeclaration$GRVY1451() throws Throwable { doTest("declaration/GRVY-1451.test"); }
|
||||
public void testDeclaration$methodCallAsMultiDecl() throws Throwable { doTest(); }
|
||||
|
||||
Reference in New Issue
Block a user