mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-10-06 06:21:16 +07:00
IG inline fixes: use inline method processor;
if simple getter is inlined in simple expr statement - it should be deleted (IDEA-127135)
This commit is contained in:
-198
@@ -1,198 +0,0 @@
|
||||
/*
|
||||
* Copyright 2003-2011 Dave Griffith, Bas Leijdekkers
|
||||
*
|
||||
* 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.siyeh.ig.performance;
|
||||
|
||||
import com.intellij.codeInspection.ProblemDescriptor;
|
||||
import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.search.searches.OverridingMethodsSearch;
|
||||
import com.intellij.psi.util.PropertyUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.Query;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import com.siyeh.ig.BaseInspection;
|
||||
import com.siyeh.ig.BaseInspectionVisitor;
|
||||
import com.siyeh.ig.InspectionGadgetsFix;
|
||||
import com.siyeh.ig.PsiReplacementUtil;
|
||||
import com.siyeh.ig.psiutils.ClassUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
public class CallToSimpleGetterInClassInspection extends BaseInspection {
|
||||
|
||||
@SuppressWarnings("UnusedDeclaration")
|
||||
public boolean ignoreGetterCallsOnOtherObjects = false;
|
||||
|
||||
@SuppressWarnings("UnusedDeclaration")
|
||||
public boolean onlyReportPrivateGetter = false;
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getID() {
|
||||
return "CallToSimpleGetterFromWithinClass";
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getDisplayName() {
|
||||
return InspectionGadgetsBundle.message("call.to.simple.getter.in.class.display.name");
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String buildErrorString(Object... infos) {
|
||||
return InspectionGadgetsBundle.message("call.to.simple.getter.in.class.problem.descriptor");
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public JComponent createOptionsPanel() {
|
||||
final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this);
|
||||
optionsPanel.addCheckbox(InspectionGadgetsBundle.message("call.to.simple.getter.in.class.ignore.option"),
|
||||
"ignoreGetterCallsOnOtherObjects");
|
||||
optionsPanel.addCheckbox(InspectionGadgetsBundle.message("call.to.private.simple.getter.in.class.option"),
|
||||
"onlyReportPrivateGetter");
|
||||
return optionsPanel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InspectionGadgetsFix buildFix(Object... infos) {
|
||||
return new InlineCallFix();
|
||||
}
|
||||
|
||||
private static class InlineCallFix extends InspectionGadgetsFix {
|
||||
@NotNull
|
||||
@Override
|
||||
public String getFamilyName() {
|
||||
return getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getName() {
|
||||
return InspectionGadgetsBundle.message("call.to.simple.getter.in.class.inline.quickfix");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException {
|
||||
final PsiElement methodIdentifier = descriptor.getPsiElement();
|
||||
final PsiReferenceExpression methodExpression = (PsiReferenceExpression)methodIdentifier.getParent();
|
||||
if (methodExpression == null) {
|
||||
return;
|
||||
}
|
||||
final PsiMethodCallExpression call = (PsiMethodCallExpression)methodExpression.getParent();
|
||||
if (call == null) {
|
||||
return;
|
||||
}
|
||||
final PsiMethod method = call.resolveMethod();
|
||||
if (method == null) {
|
||||
return;
|
||||
}
|
||||
final PsiCodeBlock body = method.getBody();
|
||||
if (body == null) {
|
||||
return;
|
||||
}
|
||||
final PsiStatement[] statements = body.getStatements();
|
||||
final PsiReturnStatement returnStatement = (PsiReturnStatement)statements[0];
|
||||
final PsiExpression returnValue = returnStatement.getReturnValue();
|
||||
if (!(returnValue instanceof PsiReferenceExpression)) {
|
||||
return;
|
||||
}
|
||||
final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)returnValue;
|
||||
final PsiField field = (PsiField)referenceExpression.resolve();
|
||||
if (field == null) {
|
||||
return;
|
||||
}
|
||||
final String fieldName = field.getName();
|
||||
if (fieldName == null) {
|
||||
return;
|
||||
}
|
||||
final PsiExpression qualifier = methodExpression.getQualifierExpression();
|
||||
if (qualifier == null) {
|
||||
final JavaPsiFacade facade = JavaPsiFacade.getInstance(call.getProject());
|
||||
final PsiResolveHelper resolveHelper = facade.getResolveHelper();
|
||||
final PsiVariable variable = resolveHelper.resolveReferencedVariable(fieldName, call);
|
||||
if (variable == null) {
|
||||
return;
|
||||
}
|
||||
if (variable.equals(field)) {
|
||||
PsiReplacementUtil.replaceExpression(call, fieldName);
|
||||
}
|
||||
else {
|
||||
PsiReplacementUtil.replaceExpression(call, "this." + fieldName);
|
||||
}
|
||||
}
|
||||
else {
|
||||
PsiReplacementUtil.replaceExpression(call, qualifier.getText() + '.' + fieldName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public BaseInspectionVisitor buildVisitor() {
|
||||
return new CallToSimpleGetterInClassVisitor();
|
||||
}
|
||||
|
||||
private class CallToSimpleGetterInClassVisitor extends BaseInspectionVisitor {
|
||||
|
||||
@Override
|
||||
public void visitMethodCallExpression(@NotNull PsiMethodCallExpression call) {
|
||||
super.visitMethodCallExpression(call);
|
||||
final PsiClass containingClass = ClassUtils.getContainingClass(call);
|
||||
if (containingClass == null) {
|
||||
return;
|
||||
}
|
||||
final PsiMethod method = call.resolveMethod();
|
||||
if (method == null) {
|
||||
return;
|
||||
}
|
||||
if (!containingClass.equals(method.getContainingClass())) {
|
||||
return;
|
||||
}
|
||||
final PsiReferenceExpression methodExpression = call.getMethodExpression();
|
||||
final PsiExpression qualifier = methodExpression.getQualifierExpression();
|
||||
if (qualifier != null && !(qualifier instanceof PsiThisExpression)) {
|
||||
if (ignoreGetterCallsOnOtherObjects) {
|
||||
return;
|
||||
}
|
||||
final PsiType type = qualifier.getType();
|
||||
if (!(type instanceof PsiClassType)) {
|
||||
return;
|
||||
}
|
||||
final PsiClassType classType = (PsiClassType)type;
|
||||
final PsiClass qualifierClass = classType.resolve();
|
||||
if (!containingClass.equals(qualifierClass)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!PropertyUtil.isSimpleGetter(method)) {
|
||||
return;
|
||||
}
|
||||
if (onlyReportPrivateGetter && !method.hasModifierProperty(PsiModifier.PRIVATE)) {
|
||||
return;
|
||||
}
|
||||
final Query<PsiMethod> query = OverridingMethodsSearch.search(method, true);
|
||||
final PsiMethod overridingMethod = query.findFirst();
|
||||
if (overridingMethod != null) {
|
||||
return;
|
||||
}
|
||||
registerMethodCallError(call);
|
||||
}
|
||||
}
|
||||
}
|
||||
+103
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Copyright 2000-2014 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.siyeh.ig.performance;
|
||||
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.search.searches.OverridingMethodsSearch;
|
||||
import com.intellij.psi.util.PropertyUtil;
|
||||
import com.intellij.util.Query;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import com.siyeh.ig.BaseInspection;
|
||||
import com.siyeh.ig.BaseInspectionVisitor;
|
||||
import com.siyeh.ig.psiutils.ClassUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class CallToSimpleGetterInClassInspectionBase extends BaseInspection {
|
||||
@SuppressWarnings("UnusedDeclaration")
|
||||
public boolean ignoreGetterCallsOnOtherObjects = false;
|
||||
@SuppressWarnings("UnusedDeclaration")
|
||||
public boolean onlyReportPrivateGetter = false;
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getID() {
|
||||
return "CallToSimpleGetterFromWithinClass";
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getDisplayName() {
|
||||
return InspectionGadgetsBundle.message("call.to.simple.getter.in.class.display.name");
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String buildErrorString(Object... infos) {
|
||||
return InspectionGadgetsBundle.message("call.to.simple.getter.in.class.problem.descriptor");
|
||||
}
|
||||
|
||||
@Override
|
||||
public BaseInspectionVisitor buildVisitor() {
|
||||
return new CallToSimpleGetterInClassVisitor();
|
||||
}
|
||||
|
||||
private class CallToSimpleGetterInClassVisitor extends BaseInspectionVisitor {
|
||||
|
||||
@Override
|
||||
public void visitMethodCallExpression(@NotNull PsiMethodCallExpression call) {
|
||||
super.visitMethodCallExpression(call);
|
||||
final PsiClass containingClass = ClassUtils.getContainingClass(call);
|
||||
if (containingClass == null) {
|
||||
return;
|
||||
}
|
||||
final PsiMethod method = call.resolveMethod();
|
||||
if (method == null) {
|
||||
return;
|
||||
}
|
||||
if (!containingClass.equals(method.getContainingClass())) {
|
||||
return;
|
||||
}
|
||||
final PsiReferenceExpression methodExpression = call.getMethodExpression();
|
||||
final PsiExpression qualifier = methodExpression.getQualifierExpression();
|
||||
if (qualifier != null && !(qualifier instanceof PsiThisExpression)) {
|
||||
if (ignoreGetterCallsOnOtherObjects) {
|
||||
return;
|
||||
}
|
||||
final PsiType type = qualifier.getType();
|
||||
if (!(type instanceof PsiClassType)) {
|
||||
return;
|
||||
}
|
||||
final PsiClassType classType = (PsiClassType)type;
|
||||
final PsiClass qualifierClass = classType.resolve();
|
||||
if (!containingClass.equals(qualifierClass)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!PropertyUtil.isSimpleGetter(method)) {
|
||||
return;
|
||||
}
|
||||
if (onlyReportPrivateGetter && !method.hasModifierProperty(PsiModifier.PRIVATE)) {
|
||||
return;
|
||||
}
|
||||
final Query<PsiMethod> query = OverridingMethodsSearch.search(method, true);
|
||||
final PsiMethod overridingMethod = query.findFirst();
|
||||
if (overridingMethod != null) {
|
||||
return;
|
||||
}
|
||||
registerMethodCallError(call);
|
||||
}
|
||||
}
|
||||
}
|
||||
-201
@@ -1,201 +0,0 @@
|
||||
/*
|
||||
* Copyright 2003-2011 Dave Griffith, Bas Leijdekkers
|
||||
*
|
||||
* 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.siyeh.ig.performance;
|
||||
|
||||
import com.intellij.codeInspection.ProblemDescriptor;
|
||||
import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.search.searches.OverridingMethodsSearch;
|
||||
import com.intellij.psi.util.PropertyUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.Query;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import com.siyeh.ig.BaseInspection;
|
||||
import com.siyeh.ig.BaseInspectionVisitor;
|
||||
import com.siyeh.ig.InspectionGadgetsFix;
|
||||
import com.siyeh.ig.PsiReplacementUtil;
|
||||
import com.siyeh.ig.psiutils.ClassUtils;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
public class CallToSimpleSetterInClassInspection extends BaseInspection {
|
||||
|
||||
@SuppressWarnings("UnusedDeclaration")
|
||||
public boolean ignoreSetterCallsOnOtherObjects = false;
|
||||
|
||||
@SuppressWarnings("UnusedDeclaration")
|
||||
public boolean onlyReportPrivateSetter = false;
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getID() {
|
||||
return "CallToSimpleSetterFromWithinClass";
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getDisplayName() {
|
||||
return InspectionGadgetsBundle.message("call.to.simple.setter.in.class.display.name");
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String buildErrorString(Object... infos) {
|
||||
return InspectionGadgetsBundle.message("call.to.simple.setter.in.class.problem.descriptor");
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public JComponent createOptionsPanel() {
|
||||
final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this);
|
||||
optionsPanel.addCheckbox(InspectionGadgetsBundle.message("call.to.simple.setter.in.class.ignore.option"),
|
||||
"ignoreSetterCallsOnOtherObjects");
|
||||
optionsPanel.addCheckbox(InspectionGadgetsBundle.message("call.to.private.setter.in.class.option"),
|
||||
"onlyReportPrivateSetter");
|
||||
return optionsPanel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InspectionGadgetsFix buildFix(Object... infos) {
|
||||
return new InlineCallFix();
|
||||
}
|
||||
|
||||
private static class InlineCallFix extends InspectionGadgetsFix {
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getName() {
|
||||
return InspectionGadgetsBundle.message("call.to.simple.setter.in.class.inline.quickfix");
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getFamilyName() {
|
||||
return getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doFix(Project project, ProblemDescriptor descriptor)
|
||||
throws IncorrectOperationException {
|
||||
final PsiElement methodIdentifier = descriptor.getPsiElement();
|
||||
final PsiReferenceExpression methodExpression = (PsiReferenceExpression)methodIdentifier.getParent();
|
||||
if (methodExpression == null) {
|
||||
return;
|
||||
}
|
||||
final PsiMethodCallExpression call = (PsiMethodCallExpression)methodExpression.getParent();
|
||||
if (call == null) {
|
||||
return;
|
||||
}
|
||||
final PsiExpressionList argumentList = call.getArgumentList();
|
||||
final PsiExpression[] arguments = argumentList.getExpressions();
|
||||
final PsiExpression argument = arguments[0];
|
||||
final PsiMethod method = call.resolveMethod();
|
||||
if (method == null) {
|
||||
return;
|
||||
}
|
||||
final PsiCodeBlock body = method.getBody();
|
||||
if (body == null) {
|
||||
return;
|
||||
}
|
||||
final PsiStatement[] statements = body.getStatements();
|
||||
final PsiExpressionStatement assignmentStatement = (PsiExpressionStatement)statements[0];
|
||||
final PsiAssignmentExpression assignment = (PsiAssignmentExpression)assignmentStatement.getExpression();
|
||||
final PsiExpression qualifier = methodExpression.getQualifierExpression();
|
||||
final PsiReferenceExpression lhs = (PsiReferenceExpression)assignment.getLExpression();
|
||||
final PsiField field = (PsiField)lhs.resolve();
|
||||
if (field == null) {
|
||||
return;
|
||||
}
|
||||
final String fieldName = field.getName();
|
||||
if (qualifier == null) {
|
||||
final JavaPsiFacade manager = JavaPsiFacade.getInstance(call.getProject());
|
||||
final PsiResolveHelper resolveHelper = manager.getResolveHelper();
|
||||
final PsiVariable variable = resolveHelper.resolveReferencedVariable(fieldName, call);
|
||||
if (variable == null) {
|
||||
return;
|
||||
}
|
||||
@NonNls final String newExpression;
|
||||
if (variable.equals(field)) {
|
||||
newExpression = fieldName + " = " + argument.getText();
|
||||
}
|
||||
else {
|
||||
newExpression = "this." + fieldName + " = " + argument.getText();
|
||||
}
|
||||
PsiReplacementUtil.replaceExpression(call, newExpression);
|
||||
}
|
||||
else {
|
||||
final String newExpression = qualifier.getText() + '.' + fieldName + " = " + argument.getText();
|
||||
PsiReplacementUtil.replaceExpression(call, newExpression);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public BaseInspectionVisitor buildVisitor() {
|
||||
return new CallToSimpleSetterInClassVisitor();
|
||||
}
|
||||
|
||||
private class CallToSimpleSetterInClassVisitor extends BaseInspectionVisitor {
|
||||
|
||||
@Override
|
||||
public void visitMethodCallExpression(@NotNull PsiMethodCallExpression call) {
|
||||
super.visitMethodCallExpression(call);
|
||||
final PsiClass containingClass = ClassUtils.getContainingClass(call);
|
||||
if (containingClass == null) {
|
||||
return;
|
||||
}
|
||||
final PsiMethod method = call.resolveMethod();
|
||||
if (method == null) {
|
||||
return;
|
||||
}
|
||||
if (!containingClass.equals(method.getContainingClass())) {
|
||||
return;
|
||||
}
|
||||
final PsiReferenceExpression methodExpression = call.getMethodExpression();
|
||||
final PsiExpression qualifier = methodExpression.getQualifierExpression();
|
||||
if (qualifier != null && !(qualifier instanceof PsiThisExpression)) {
|
||||
if (ignoreSetterCallsOnOtherObjects) {
|
||||
return;
|
||||
}
|
||||
final PsiType type = qualifier.getType();
|
||||
if (!(type instanceof PsiClassType)) {
|
||||
return;
|
||||
}
|
||||
final PsiClassType classType = (PsiClassType)type;
|
||||
final PsiClass qualifierClass = classType.resolve();
|
||||
if (!containingClass.equals(qualifierClass)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!PropertyUtil.isSimpleSetter(method)) {
|
||||
return;
|
||||
}
|
||||
if (onlyReportPrivateSetter && !method.hasModifierProperty(PsiModifier.PRIVATE)) {
|
||||
return;
|
||||
}
|
||||
final Query<PsiMethod> query = OverridingMethodsSearch.search(method, true);
|
||||
final PsiMethod overridingMethod = query.findFirst();
|
||||
if (overridingMethod != null) {
|
||||
return;
|
||||
}
|
||||
registerMethodCallError(call);
|
||||
}
|
||||
}
|
||||
}
|
||||
+103
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Copyright 2000-2014 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.siyeh.ig.performance;
|
||||
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.search.searches.OverridingMethodsSearch;
|
||||
import com.intellij.psi.util.PropertyUtil;
|
||||
import com.intellij.util.Query;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import com.siyeh.ig.BaseInspection;
|
||||
import com.siyeh.ig.BaseInspectionVisitor;
|
||||
import com.siyeh.ig.psiutils.ClassUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class CallToSimpleSetterInClassInspectionBase extends BaseInspection {
|
||||
@SuppressWarnings("UnusedDeclaration")
|
||||
public boolean ignoreSetterCallsOnOtherObjects = false;
|
||||
@SuppressWarnings("UnusedDeclaration")
|
||||
public boolean onlyReportPrivateSetter = false;
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getID() {
|
||||
return "CallToSimpleSetterFromWithinClass";
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getDisplayName() {
|
||||
return InspectionGadgetsBundle.message("call.to.simple.setter.in.class.display.name");
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String buildErrorString(Object... infos) {
|
||||
return InspectionGadgetsBundle.message("call.to.simple.setter.in.class.problem.descriptor");
|
||||
}
|
||||
|
||||
@Override
|
||||
public BaseInspectionVisitor buildVisitor() {
|
||||
return new CallToSimpleSetterInClassVisitor();
|
||||
}
|
||||
|
||||
private class CallToSimpleSetterInClassVisitor extends BaseInspectionVisitor {
|
||||
|
||||
@Override
|
||||
public void visitMethodCallExpression(@NotNull PsiMethodCallExpression call) {
|
||||
super.visitMethodCallExpression(call);
|
||||
final PsiClass containingClass = ClassUtils.getContainingClass(call);
|
||||
if (containingClass == null) {
|
||||
return;
|
||||
}
|
||||
final PsiMethod method = call.resolveMethod();
|
||||
if (method == null) {
|
||||
return;
|
||||
}
|
||||
if (!containingClass.equals(method.getContainingClass())) {
|
||||
return;
|
||||
}
|
||||
final PsiReferenceExpression methodExpression = call.getMethodExpression();
|
||||
final PsiExpression qualifier = methodExpression.getQualifierExpression();
|
||||
if (qualifier != null && !(qualifier instanceof PsiThisExpression)) {
|
||||
if (ignoreSetterCallsOnOtherObjects) {
|
||||
return;
|
||||
}
|
||||
final PsiType type = qualifier.getType();
|
||||
if (!(type instanceof PsiClassType)) {
|
||||
return;
|
||||
}
|
||||
final PsiClassType classType = (PsiClassType)type;
|
||||
final PsiClass qualifierClass = classType.resolve();
|
||||
if (!containingClass.equals(qualifierClass)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!PropertyUtil.isSimpleSetter(method)) {
|
||||
return;
|
||||
}
|
||||
if (onlyReportPrivateSetter && !method.hasModifierProperty(PsiModifier.PRIVATE)) {
|
||||
return;
|
||||
}
|
||||
final Query<PsiMethod> query = OverridingMethodsSearch.search(method, true);
|
||||
final PsiMethod overridingMethod = query.findFirst();
|
||||
if (overridingMethod != null) {
|
||||
return;
|
||||
}
|
||||
registerMethodCallError(call);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,52 +16,54 @@
|
||||
package com.siyeh.ig.fixes;
|
||||
|
||||
import com.intellij.codeInspection.ProblemDescriptor;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.psi.PsiMethodCallExpression;
|
||||
import com.intellij.psi.PsiReferenceExpression;
|
||||
import com.intellij.refactoring.JavaRefactoringActionHandlerFactory;
|
||||
import com.intellij.refactoring.RefactoringActionHandler;
|
||||
import com.intellij.refactoring.JavaRefactoringSettings;
|
||||
import com.intellij.refactoring.inline.InlineMethodProcessor;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import com.siyeh.ig.InspectionGadgetsFix;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class InlineCallFix extends InspectionGadgetsFix {
|
||||
@Override
|
||||
@NotNull
|
||||
public String getFamilyName() {
|
||||
return getName();
|
||||
}
|
||||
private String myName;
|
||||
|
||||
public InlineCallFix(String name) {
|
||||
myName = name;
|
||||
}
|
||||
|
||||
public InlineCallFix() {
|
||||
this(InspectionGadgetsBundle.message("inline.call.quickfix"));
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getFamilyName() {
|
||||
return myName;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getName() {
|
||||
return InspectionGadgetsBundle.message("inline.call.quickfix");
|
||||
return getFamilyName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doFix(final Project project, ProblemDescriptor descriptor) {
|
||||
final PsiElement nameElement = descriptor.getPsiElement();
|
||||
final PsiReferenceExpression methodExpression =
|
||||
(PsiReferenceExpression)nameElement.getParent();
|
||||
assert methodExpression != null;
|
||||
final PsiMethodCallExpression methodCallExpression =
|
||||
(PsiMethodCallExpression)methodExpression.getParent();
|
||||
final JavaRefactoringActionHandlerFactory factory =
|
||||
JavaRefactoringActionHandlerFactory.getInstance();
|
||||
final RefactoringActionHandler inlineHandler = factory.createInlineHandler();
|
||||
final Runnable runnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
inlineHandler.invoke(project, new PsiElement[]{methodCallExpression}, null);
|
||||
}
|
||||
};
|
||||
if (ApplicationManager.getApplication().isUnitTestMode()) {
|
||||
runnable.run();
|
||||
}
|
||||
else {
|
||||
ApplicationManager.getApplication().invokeLater(runnable, project.getDisposed());
|
||||
}
|
||||
final PsiReferenceExpression methodExpression = (PsiReferenceExpression)nameElement.getParent();
|
||||
if (methodExpression == null) return;
|
||||
final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)methodExpression.getParent();
|
||||
final PsiMethod method = methodCallExpression.resolveMethod();
|
||||
if (method == null) return;
|
||||
inline(project, methodExpression, method);
|
||||
}
|
||||
|
||||
protected void inline(Project project, PsiReferenceExpression methodExpression, PsiMethod method) {
|
||||
new InlineMethodProcessor(project, method, methodExpression, null, true,
|
||||
JavaRefactoringSettings.getInstance().RENAME_SEARCH_IN_COMMENTS_FOR_METHOD,
|
||||
JavaRefactoringSettings.getInstance().RENAME_SEARCH_FOR_TEXT_FOR_METHOD).inlineMethodCall(methodExpression);
|
||||
}
|
||||
}
|
||||
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright 2003-2011 Dave Griffith, Bas Leijdekkers
|
||||
*
|
||||
* 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.siyeh.ig.performance;
|
||||
|
||||
import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiExpressionStatement;
|
||||
import com.intellij.psi.PsiMethod;
|
||||
import com.intellij.psi.PsiReferenceExpression;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import com.siyeh.ig.InspectionGadgetsFix;
|
||||
import com.siyeh.ig.fixes.InlineCallFix;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
public class CallToSimpleGetterInClassInspection extends CallToSimpleGetterInClassInspectionBase {
|
||||
@Override
|
||||
@Nullable
|
||||
public JComponent createOptionsPanel() {
|
||||
final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this);
|
||||
optionsPanel.addCheckbox(InspectionGadgetsBundle.message("call.to.simple.getter.in.class.ignore.option"),
|
||||
"ignoreGetterCallsOnOtherObjects");
|
||||
optionsPanel.addCheckbox(InspectionGadgetsBundle.message("call.to.private.simple.getter.in.class.option"),
|
||||
"onlyReportPrivateGetter");
|
||||
return optionsPanel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InspectionGadgetsFix buildFix(Object... infos) {
|
||||
return new InlineOrDeleteCallFix(InspectionGadgetsBundle.message("call.to.simple.getter.in.class.inline.quickfix"));
|
||||
}
|
||||
|
||||
private static class InlineOrDeleteCallFix extends InlineCallFix {
|
||||
public InlineOrDeleteCallFix(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void inline(Project project, PsiReferenceExpression methodExpression, PsiMethod method) {
|
||||
final PsiElement statement = methodExpression.getParent().getParent();
|
||||
if (statement instanceof PsiExpressionStatement) {
|
||||
statement.delete();
|
||||
} else {
|
||||
super.inline(project, methodExpression, method);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright 2003-2011 Dave Griffith, Bas Leijdekkers
|
||||
*
|
||||
* 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.siyeh.ig.performance;
|
||||
|
||||
import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
|
||||
import com.siyeh.InspectionGadgetsBundle;
|
||||
import com.siyeh.ig.InspectionGadgetsFix;
|
||||
import com.siyeh.ig.fixes.InlineCallFix;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
public class CallToSimpleSetterInClassInspection extends CallToSimpleSetterInClassInspectionBase {
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public JComponent createOptionsPanel() {
|
||||
final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this);
|
||||
optionsPanel.addCheckbox(InspectionGadgetsBundle.message("call.to.simple.setter.in.class.ignore.option"),
|
||||
"ignoreSetterCallsOnOtherObjects");
|
||||
optionsPanel.addCheckbox(InspectionGadgetsBundle.message("call.to.private.setter.in.class.option"),
|
||||
"onlyReportPrivateSetter");
|
||||
return optionsPanel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InspectionGadgetsFix buildFix(Object... infos) {
|
||||
return new InlineCallFix(InspectionGadgetsBundle.message("call.to.simple.setter.in.class.inline.quickfix"));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user