| /* |
| * Copyright 2000-2009 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.refactoring.extractclass.usageInfo; |
| |
| import com.intellij.psi.*; |
| import com.intellij.psi.util.PsiTreeUtil; |
| import com.intellij.refactoring.psi.MutationUtils; |
| import com.intellij.refactoring.util.FixableUsageInfo; |
| import com.intellij.util.IncorrectOperationException; |
| import org.jetbrains.annotations.Nullable; |
| |
| public class ReplaceInstanceVariableIncrementDecrement extends FixableUsageInfo { |
| private final PsiExpression reference; |
| private final @Nullable String setterName; |
| private final @Nullable String getterName; |
| private final String delegateName; |
| private final String fieldName; |
| |
| public ReplaceInstanceVariableIncrementDecrement(PsiExpression reference, |
| String delegateName, |
| String setterName, |
| String getterName, |
| String name) { |
| super(reference); |
| this.getterName = getterName; |
| this.setterName = setterName; |
| this.delegateName = delegateName; |
| fieldName = name; |
| final PsiPrefixExpression prefixExpr = PsiTreeUtil.getParentOfType(reference, PsiPrefixExpression.class); |
| if (prefixExpr != null) { |
| this.reference = prefixExpr; |
| } |
| else { |
| this.reference = PsiTreeUtil.getParentOfType(reference, PsiPostfixExpression.class); |
| } |
| } |
| |
| public void fixUsage() throws IncorrectOperationException { |
| |
| final PsiReferenceExpression lhs; |
| final PsiJavaToken sign; |
| if (reference instanceof PsiPrefixExpression) { |
| lhs = (PsiReferenceExpression)((PsiPrefixExpression)reference).getOperand(); |
| sign = ((PsiPrefixExpression)reference).getOperationSign(); |
| } |
| else { |
| lhs = (PsiReferenceExpression)((PsiPostfixExpression)reference).getOperand(); |
| sign = ((PsiPostfixExpression)reference).getOperationSign(); |
| } |
| final PsiElement qualifier = lhs.getQualifier(); |
| final String operator = sign.getText(); |
| final String newExpression; |
| final String strippedOperator = getStrippedOperator(operator); |
| if (qualifier != null) { |
| final String qualifierText = qualifier.getText(); |
| newExpression = qualifierText + '.' + delegateName + '.' + |
| callSetter(qualifierText + '.' + delegateName + '.' + callGetter() + strippedOperator + "1"); |
| } |
| else { |
| newExpression = delegateName + '.' + callSetter(delegateName + '.' + callGetter() + strippedOperator + "1"); |
| } |
| MutationUtils.replaceExpression(newExpression, reference); |
| } |
| |
| private String callGetter() { |
| return (getterName != null ? getterName + "()" : fieldName); |
| } |
| |
| private String callSetter(String rhsText) { |
| return setterName != null ? setterName + "(" + rhsText + ")" : fieldName + "=" + rhsText; |
| } |
| |
| private static String getStrippedOperator(String operator) { |
| return operator.substring(0, operator.length() - 1); |
| } |
| } |