| /* |
| * Copyright 2000-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 com.intellij.codeInsight.editorActions.wordSelection; |
| |
| import com.intellij.openapi.editor.Editor; |
| import com.intellij.openapi.util.TextRange; |
| import com.intellij.psi.*; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import java.util.Arrays; |
| import java.util.Collections; |
| import java.util.List; |
| |
| /** |
| * @author Danila Ponomarenko |
| */ |
| public class VarargsSelectioner extends BasicSelectioner { |
| @Override |
| public boolean canSelect(PsiElement e) { |
| return e instanceof PsiExpressionList; |
| } |
| |
| @Override |
| public List<TextRange> select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) { |
| if (!(e instanceof PsiExpressionList)) { |
| return Collections.emptyList(); |
| } |
| |
| final PsiExpressionList expressionList = (PsiExpressionList)e; |
| final PsiParameterList parameterList = getParameterList(expressionList); |
| |
| if (parameterList == null) { |
| return Collections.emptyList(); |
| } |
| |
| final PsiExpression[] varargArgs = getVarargArgs(parameterList, expressionList); |
| |
| if (varargArgs.length == 0) { |
| return Collections.emptyList(); |
| } |
| |
| final TextRange firstExpressionRange = varargArgs[0].getTextRange(); |
| final TextRange lastExpressionRange = varargArgs[varargArgs.length - 1].getTextRange(); |
| |
| |
| return Collections.singletonList(new TextRange(firstExpressionRange.getStartOffset(), lastExpressionRange.getEndOffset())); |
| } |
| |
| @NotNull |
| private static PsiExpression[] getVarargArgs(@NotNull PsiParameterList parameterList, |
| @NotNull PsiExpressionList expressionList) { |
| final PsiParameter[] parameters = parameterList.getParameters(); |
| final PsiExpression[] expressions = expressionList.getExpressions(); |
| |
| if (parameters.length == 0 || expressions.length == 0) { |
| return PsiExpression.EMPTY_ARRAY; |
| } |
| |
| final int varargIndex = parameters.length - 1; |
| final PsiParameter varargParam = parameters[varargIndex]; |
| if (!varargParam.isVarArgs() || parameters.length > expressions.length) { |
| return PsiExpression.EMPTY_ARRAY; |
| } |
| |
| return Arrays.copyOfRange(expressions, varargIndex, expressions.length); |
| } |
| |
| @Nullable |
| private static PsiParameterList getParameterList(@NotNull PsiExpressionList list) { |
| if (!(list.getParent() instanceof PsiMethodCallExpression)) { |
| return null; |
| } |
| final PsiMethod method = ((PsiMethodCallExpression)list.getParent()).resolveMethod(); |
| |
| return method != null ? method.getParameterList() : null; |
| } |
| } |