diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml
index 7f3404bb41f..20edfcd71ec 100644
--- a/idea/src/META-INF/plugin.xml
+++ b/idea/src/META-INF/plugin.xml
@@ -135,6 +135,7 @@
+
diff --git a/idea/src/org/jetbrains/jet/plugin/editor/wordSelection/JetListSelectioner.java b/idea/src/org/jetbrains/jet/plugin/editor/wordSelection/JetListSelectioner.java
new file mode 100644
index 00000000000..09ac4a416dd
--- /dev/null
+++ b/idea/src/org/jetbrains/jet/plugin/editor/wordSelection/JetListSelectioner.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2010-2012 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jetbrains.jet.plugin.editor.wordSelection;
+
+import com.intellij.codeInsight.editorActions.wordSelection.BasicSelectioner;
+import com.intellij.lang.ASTNode;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.tree.TokenSet;
+import org.jetbrains.jet.lang.psi.JetParameterList;
+import org.jetbrains.jet.lang.psi.JetTypeArgumentList;
+import org.jetbrains.jet.lang.psi.JetTypeParameterList;
+import org.jetbrains.jet.lang.psi.JetValueArgumentList;
+import org.jetbrains.jet.lexer.JetTokens;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author Evgeny Gerashchenko
+ * @since 4/23/12
+ */
+public class JetListSelectioner extends BasicSelectioner {
+ @Override
+ public boolean canSelect(PsiElement e) {
+ return e instanceof JetParameterList || e instanceof JetValueArgumentList ||
+ e instanceof JetTypeParameterList || e instanceof JetTypeArgumentList;
+ }
+
+ @Override
+ public List select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) {
+ ASTNode node = e.getNode();
+ ASTNode startNode = node.findChildByType(TokenSet.create(JetTokens.LPAR, JetTokens.LT));
+ ASTNode endNode = node.findChildByType(TokenSet.create(JetTokens.RPAR, JetTokens.GT));
+ if (startNode != null && endNode != null) {
+ return Arrays.asList(new TextRange(startNode.getStartOffset() + 1, endNode.getStartOffset()));
+ } else {
+ return Arrays.asList();
+ }
+ }
+}
diff --git a/idea/testData/wordSelection/TypeArguments.1.kt b/idea/testData/wordSelection/TypeArguments.1.kt
new file mode 100644
index 00000000000..c2720afa24f
--- /dev/null
+++ b/idea/testData/wordSelection/TypeArguments.1.kt
@@ -0,0 +1,3 @@
+fun foo() {
+ foo<Int, B>()
+}
diff --git a/idea/testData/wordSelection/TypeArguments.kt b/idea/testData/wordSelection/TypeArguments.kt
new file mode 100644
index 00000000000..0585d99d48b
--- /dev/null
+++ b/idea/testData/wordSelection/TypeArguments.kt
@@ -0,0 +1,3 @@
+fun foo() {
+ foo<Int, B>()
+}
diff --git a/idea/testData/wordSelection/TypeParameters.1.kt b/idea/testData/wordSelection/TypeParameters.1.kt
new file mode 100644
index 00000000000..332865cfb5a
--- /dev/null
+++ b/idea/testData/wordSelection/TypeParameters.1.kt
@@ -0,0 +1,2 @@
+fun <A, B> foo() {
+}
diff --git a/idea/testData/wordSelection/TypeParameters.kt b/idea/testData/wordSelection/TypeParameters.kt
new file mode 100644
index 00000000000..d8509f74fdc
--- /dev/null
+++ b/idea/testData/wordSelection/TypeParameters.kt
@@ -0,0 +1,2 @@
+fun B> foo() {
+}
diff --git a/idea/testData/wordSelection/ValueArguments.1.kt b/idea/testData/wordSelection/ValueArguments.1.kt
new file mode 100644
index 00000000000..0078192e4dc
--- /dev/null
+++ b/idea/testData/wordSelection/ValueArguments.1.kt
@@ -0,0 +1,3 @@
+fun foo() {
+ foo(1, 2)
+}
diff --git a/idea/testData/wordSelection/ValueArguments.kt b/idea/testData/wordSelection/ValueArguments.kt
new file mode 100644
index 00000000000..54dee47384a
--- /dev/null
+++ b/idea/testData/wordSelection/ValueArguments.kt
@@ -0,0 +1,3 @@
+fun foo() {
+ foo(1, 2)
+}
diff --git a/idea/testData/wordSelection/ValueParameters.1.kt b/idea/testData/wordSelection/ValueParameters.1.kt
new file mode 100644
index 00000000000..df0a9e6bb58
--- /dev/null
+++ b/idea/testData/wordSelection/ValueParameters.1.kt
@@ -0,0 +1,2 @@
+fun foo(a : Array, b : Int) {
+}
diff --git a/idea/testData/wordSelection/ValueParameters.kt b/idea/testData/wordSelection/ValueParameters.kt
new file mode 100644
index 00000000000..1105f741877
--- /dev/null
+++ b/idea/testData/wordSelection/ValueParameters.kt
@@ -0,0 +1,2 @@
+fun foo(a : Array, b : Int) {
+}
diff --git a/idea/tests/org/jetbrains/jet/plugin/WordSelectionTest.java b/idea/tests/org/jetbrains/jet/plugin/WordSelectionTest.java
index 21c82df53b1..82c6031392e 100644
--- a/idea/tests/org/jetbrains/jet/plugin/WordSelectionTest.java
+++ b/idea/tests/org/jetbrains/jet/plugin/WordSelectionTest.java
@@ -35,6 +35,22 @@ public class WordSelectionTest extends LightCodeInsightFixtureTestCase {
doTest(6);
}
+ public void testTypeArguments() {
+ doTest(1);
+ }
+
+ public void testValueArguments() {
+ doTest(1);
+ }
+
+ public void testTypeParameters() {
+ doTest(1);
+ }
+
+ public void testValueParameters() {
+ doTest(1);
+ }
+
private void doTest(int howMany) {
String testName = getTestName(false);
String[] afterFiles = new String[howMany];