diff options
Diffstat (limited to 'plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh')
18 files changed, 395 insertions, 332 deletions
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties index 04419fb871e9..efeb65889a93 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties @@ -2093,4 +2093,6 @@ bigdecimal.legacy.method.quickfix=Use 'RoundingMode' enum constant serializable.stores.non.serializable.display.name=Serializable object implicitly stores non-Serializable object serializable.lambda.stores.non.serializable.problem.descriptor=Serializable lambda implicitly stores non-Serializable object of type ''{0}'' serializable.local.class.stores.non.serializable.problem.descriptor=Serializable local class ''{1}'' implicitly stores non-Serializable object of type ''{0}'' -serializable.anonymous.class.stores.non.serializable.problem.descriptor=Serializable anonymous class implicitly stores non-Serializable object of type ''{0}''
\ No newline at end of file +serializable.anonymous.class.stores.non.serializable.problem.descriptor=Serializable anonymous class implicitly stores non-Serializable object of type ''{0}'' +assignment.to.lambda.parameter.display.name=Assignment to lambda parameter +assignment.to.lambda.parameter.problem.descriptor=Assignment to lambda parameter <code>#ref</code> #loc diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/BaseInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/BaseInspection.java index 1b079275a49f..8be9ce07a5ef 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/BaseInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/BaseInspection.java @@ -27,6 +27,7 @@ import com.intellij.profile.codeInspection.InspectionProjectProfileManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.ui.DocumentAdapter; +import com.intellij.util.ReflectionUtil; import com.intellij.util.ui.UIUtil; import com.siyeh.ig.telemetry.InspectionGadgetsTelemetry; import org.jetbrains.annotations.Nls; @@ -37,7 +38,6 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.text.Document; -import java.lang.reflect.Field; import java.text.NumberFormat; import java.text.ParseException; import java.util.List; @@ -104,46 +104,33 @@ public abstract class BaseInspection extends BaseJavaBatchLocalInspectionTool { return visitor; } - protected JFormattedTextField prepareNumberEditor(@NonNls String fieldName) { - try { - final NumberFormat formatter = NumberFormat.getIntegerInstance(); - formatter.setParseIntegerOnly(true); - final JFormattedTextField valueField = new JFormattedTextField(formatter); - final Field field = getClass().getField(fieldName); - valueField.setValue(field.get(this)); - valueField.setColumns(2); - - // hack to work around text field becoming unusably small sometimes when using GridBagLayout - valueField.setMinimumSize(valueField.getPreferredSize()); - - UIUtil.fixFormattedField(valueField); - final Document document = valueField.getDocument(); - document.addDocumentListener(new DocumentAdapter() { - @Override - public void textChanged(DocumentEvent evt) { - try { - valueField.commitEdit(); - final Number number = (Number)valueField.getValue(); - field.set(BaseInspection.this, - Integer.valueOf(number.intValue())); - } - catch (IllegalAccessException e) { - LOG.error(e); - } - catch (ParseException e) { - // No luck this time. Will update the field when correct value is entered. - } + protected JFormattedTextField prepareNumberEditor(@NonNls final String fieldName) { + final NumberFormat formatter = NumberFormat.getIntegerInstance(); + formatter.setParseIntegerOnly(true); + final JFormattedTextField valueField = new JFormattedTextField(formatter); + Object value = ReflectionUtil.getField(getClass(), this, null, fieldName); + valueField.setValue(value); + valueField.setColumns(2); + + // hack to work around text field becoming unusably small sometimes when using GridBagLayout + valueField.setMinimumSize(valueField.getPreferredSize()); + + UIUtil.fixFormattedField(valueField); + final Document document = valueField.getDocument(); + document.addDocumentListener(new DocumentAdapter() { + @Override + public void textChanged(DocumentEvent evt) { + try { + valueField.commitEdit(); + final Number number = (Number)valueField.getValue(); + ReflectionUtil.setField(BaseInspection.this.getClass(), BaseInspection.this, int.class, fieldName, number.intValue()); } - }); - return valueField; - } - catch (NoSuchFieldException e) { - LOG.error(e); - } - catch (IllegalAccessException e) { - LOG.error(e); - } - return null; + catch (ParseException e) { + // No luck this time. Will update the field when correct value is entered. + } + } + }); + return valueField; } protected static void parseString(String string, List<String>... outs) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/abstraction/OverlyStrongTypeCastInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/abstraction/OverlyStrongTypeCastInspection.java index bf185ea030ce..e979a678c4d8 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/abstraction/OverlyStrongTypeCastInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/abstraction/OverlyStrongTypeCastInspection.java @@ -175,6 +175,9 @@ public class OverlyStrongTypeCastInspection extends BaseInspection { if (castTypeElement == null) { return; } + if (operand instanceof PsiFunctionalExpression && !LambdaUtil.isFunctionalType(expectedType)) { + return; + } registerError(castTypeElement, expectedType); } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/AssignmentToCatchBlockParameterInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/AssignmentToCatchBlockParameterInspection.java index 3eb05ecc5a26..737996ed64dd 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/AssignmentToCatchBlockParameterInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/AssignmentToCatchBlockParameterInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2014 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. @@ -15,68 +15,27 @@ */ package com.siyeh.ig.assignment; -import com.intellij.psi.*; +import com.intellij.psi.PsiCatchSection; +import com.intellij.psi.PsiElement; import com.siyeh.InspectionGadgetsBundle; -import com.siyeh.ig.BaseInspection; -import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.fixes.ExtractParameterAsLocalVariableFix; -import com.siyeh.ig.psiutils.WellFormednessUtils; import org.jetbrains.annotations.NotNull; -public class AssignmentToCatchBlockParameterInspection - extends BaseInspection { +public class AssignmentToCatchBlockParameterInspection extends BaseAssignmentToParameterInspection { @Override @NotNull public String getDisplayName() { - return InspectionGadgetsBundle.message( - "assignment.to.catch.block.parameter.display.name"); + return InspectionGadgetsBundle.message("assignment.to.catch.block.parameter.display.name"); } @Override @NotNull public String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message( - "assignment.to.catch.block.parameter.problem.descriptor"); + return InspectionGadgetsBundle.message("assignment.to.catch.block.parameter.problem.descriptor"); } @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new ExtractParameterAsLocalVariableFix(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new AssignmentToCatchBlockParameterVisitor(); - } - - private static class AssignmentToCatchBlockParameterVisitor - extends BaseInspectionVisitor { - - @Override - public void visitAssignmentExpression( - @NotNull PsiAssignmentExpression expression) { - super.visitAssignmentExpression(expression); - if (!WellFormednessUtils.isWellFormed(expression)) { - return; - } - final PsiExpression lhs = expression.getLExpression(); - if (!(lhs instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression reference = - (PsiReferenceExpression)lhs; - final PsiElement variable = reference.resolve(); - if (!(variable instanceof PsiParameter)) { - return; - } - final PsiParameter parameter = (PsiParameter)variable; - final PsiElement declarationScope = parameter.getDeclarationScope(); - if (!(declarationScope instanceof PsiCatchSection)) { - return; - } - registerError(lhs); - } + protected boolean isCorrectScope(PsiElement declarationScope) { + return declarationScope instanceof PsiCatchSection; } } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/AssignmentToLambdaParameterInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/AssignmentToLambdaParameterInspection.java new file mode 100644 index 000000000000..4694a0152e12 --- /dev/null +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/AssignmentToLambdaParameterInspection.java @@ -0,0 +1,58 @@ +/* + * 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.assignment; + +import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiLambdaExpression; +import com.intellij.psi.PsiLocalVariable; +import com.siyeh.InspectionGadgetsBundle; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +/** + * @author Bas Leijdekkers + */ +public class AssignmentToLambdaParameterInspection extends BaseAssignmentToParameterInspection { + + @Nls + @NotNull + @Override + public String getDisplayName() { + return InspectionGadgetsBundle.message("assignment.to.lambda.parameter.display.name"); + } + + @NotNull + @Override + protected String buildErrorString(Object... infos) { + return InspectionGadgetsBundle.message("assignment.to.lambda.parameter.problem.descriptor"); + } + + @Override + @Nullable + public JComponent createOptionsPanel() { + return new SingleCheckboxOptionsPanel(InspectionGadgetsBundle.message( + "assignment.to.method.parameter.ignore.transformation.option"), this, "ignoreTransformationOfOriginalParameter"); + } + + @Override + protected boolean isCorrectScope(PsiElement declarationScope) { + return declarationScope instanceof PsiLambdaExpression; + } +} diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/AssignmentToMethodParameterInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/AssignmentToMethodParameterInspection.java index ae616c40d42a..56dbecc83d6b 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/AssignmentToMethodParameterInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/AssignmentToMethodParameterInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2009 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2014 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. @@ -15,22 +15,16 @@ */ package com.siyeh.ig.assignment; -import com.intellij.psi.*; -import com.intellij.psi.tree.IElementType; import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; import com.siyeh.InspectionGadgetsBundle; -import com.siyeh.ig.BaseInspection; -import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.fixes.ExtractParameterAsLocalVariableFix; -import com.siyeh.ig.psiutils.VariableAccessUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -public class AssignmentToMethodParameterInspection - extends BaseInspection { +public class AssignmentToMethodParameterInspection extends BaseAssignmentToParameterInspection { @SuppressWarnings({"PublicField"}) public boolean ignoreTransformationOfOriginalParameter = false; @@ -38,134 +32,23 @@ public class AssignmentToMethodParameterInspection @Override @NotNull public String getDisplayName() { - return InspectionGadgetsBundle.message( - "assignment.to.method.parameter.display.name"); + return InspectionGadgetsBundle.message("assignment.to.method.parameter.display.name"); } @Override @NotNull public String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message( - "assignment.to.method.parameter.problem.descriptor"); + return InspectionGadgetsBundle.message("assignment.to.method.parameter.problem.descriptor"); } @Override @Nullable public JComponent createOptionsPanel() { return new SingleCheckboxOptionsPanel(InspectionGadgetsBundle.message( - "assignment.to.method.parameter.ignore.transformation.option"), this, - "ignoreTransformationOfOriginalParameter"); + "assignment.to.method.parameter.ignore.transformation.option"), this, "ignoreTransformationOfOriginalParameter"); } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new ExtractParameterAsLocalVariableFix(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new AssignmentToMethodParameterVisitor(); - } - - private class AssignmentToMethodParameterVisitor - extends BaseInspectionVisitor { - - @Override - public void visitAssignmentExpression( - @NotNull PsiAssignmentExpression expression) { - super.visitAssignmentExpression(expression); - final PsiExpression lhs = expression.getLExpression(); - final PsiParameter parameter = getMethodParameter(lhs); - if (parameter == null) { - return; - } - if (ignoreTransformationOfOriginalParameter) { - final PsiExpression rhs = expression.getRExpression(); - if (rhs != null && VariableAccessUtils.variableIsUsed(parameter, rhs)) { - return; - } - final IElementType tokenType = - expression.getOperationTokenType(); - if (tokenType == JavaTokenType.PLUSEQ || - tokenType == JavaTokenType.MINUSEQ || - tokenType == JavaTokenType.ASTERISKEQ || - tokenType == JavaTokenType.DIVEQ || - tokenType == JavaTokenType.ANDEQ || - tokenType == JavaTokenType.OREQ || - tokenType == JavaTokenType.XOREQ || - tokenType == JavaTokenType.PERCEQ || - tokenType == JavaTokenType.LTLTEQ || - tokenType == JavaTokenType.GTGTEQ || - tokenType == JavaTokenType.GTGTGTEQ) { - return; - } - } - registerError(lhs); - } - - @Override - public void visitPrefixExpression( - @NotNull PsiPrefixExpression expression) { - if (ignoreTransformationOfOriginalParameter) { - return; - } - super.visitPrefixExpression(expression); - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSPLUS) && - !tokenType.equals(JavaTokenType.MINUSMINUS)) { - return; - } - final PsiExpression operand = expression.getOperand(); - if (operand == null) { - return; - } - final PsiParameter parameter = getMethodParameter(operand); - if (parameter == null) { - return; - } - registerError(operand); - } - - @Override - public void visitPostfixExpression( - @NotNull PsiPostfixExpression expression) { - if (ignoreTransformationOfOriginalParameter) { - return; - } - super.visitPostfixExpression(expression); - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSPLUS) && - !tokenType.equals(JavaTokenType.MINUSMINUS)) { - return; - } - final PsiExpression operand = expression.getOperand(); - final PsiParameter parameter = getMethodParameter(operand); - if (parameter == null) { - return; - } - registerError(operand); - } - - @Nullable - private PsiParameter getMethodParameter(PsiExpression expression) { - if (!(expression instanceof PsiReferenceExpression)) { - return null; - } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)expression; - final PsiElement variable = referenceExpression.resolve(); - if (!(variable instanceof PsiParameter)) { - return null; - } - final PsiParameter parameter = (PsiParameter)variable; - final PsiElement declarationScope = parameter.getDeclarationScope(); - if (declarationScope instanceof PsiCatchSection) { - return null; - } - if (declarationScope instanceof PsiForeachStatement) { - return null; - } - return parameter; - } + protected boolean isCorrectScope(PsiElement declarationScope) { + return declarationScope instanceof PsiMethod; } }
\ No newline at end of file diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/BaseAssignmentToParameterInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/BaseAssignmentToParameterInspection.java new file mode 100644 index 000000000000..7f27c6bf762a --- /dev/null +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/assignment/BaseAssignmentToParameterInspection.java @@ -0,0 +1,141 @@ +/* + * 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.assignment; + +import com.intellij.psi.*; +import com.intellij.psi.tree.IElementType; +import com.siyeh.ig.BaseInspection; +import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.ig.InspectionGadgetsFix; +import com.siyeh.ig.fixes.ExtractParameterAsLocalVariableFix; +import com.siyeh.ig.psiutils.ParenthesesUtils; +import com.siyeh.ig.psiutils.VariableAccessUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Bas Leijdekkers + */ +public abstract class BaseAssignmentToParameterInspection extends BaseInspection { + + @SuppressWarnings({"PublicField"}) + public boolean ignoreTransformationOfOriginalParameter = false; + + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new ExtractParameterAsLocalVariableFix(); + } + + protected abstract boolean isCorrectScope(PsiElement declarationScope); + + @Override + public final BaseInspectionVisitor buildVisitor() { + return new AssignmentToParameterVisitor(); + } + + private class AssignmentToParameterVisitor extends BaseInspectionVisitor { + + @Override + public void visitAssignmentExpression(@NotNull PsiAssignmentExpression expression) { + super.visitAssignmentExpression(expression); + final PsiExpression lhs = expression.getLExpression(); + final PsiParameter parameter = getParameter(lhs); + if (parameter == null) { + return; + } + if (ignoreTransformationOfOriginalParameter) { + final PsiExpression rhs = expression.getRExpression(); + if (rhs != null && VariableAccessUtils.variableIsUsed(parameter, rhs)) { + return; + } + final IElementType tokenType = + expression.getOperationTokenType(); + if (tokenType == JavaTokenType.PLUSEQ || + tokenType == JavaTokenType.MINUSEQ || + tokenType == JavaTokenType.ASTERISKEQ || + tokenType == JavaTokenType.DIVEQ || + tokenType == JavaTokenType.ANDEQ || + tokenType == JavaTokenType.OREQ || + tokenType == JavaTokenType.XOREQ || + tokenType == JavaTokenType.PERCEQ || + tokenType == JavaTokenType.LTLTEQ || + tokenType == JavaTokenType.GTGTEQ || + tokenType == JavaTokenType.GTGTGTEQ) { + return; + } + } + registerError(lhs); + } + + @Override + public void visitPrefixExpression(@NotNull PsiPrefixExpression expression) { + if (ignoreTransformationOfOriginalParameter) { + return; + } + super.visitPrefixExpression(expression); + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSPLUS) && !tokenType.equals(JavaTokenType.MINUSMINUS)) { + return; + } + final PsiExpression operand = expression.getOperand(); + if (operand == null) { + return; + } + final PsiParameter parameter = getParameter(operand); + if (parameter == null) { + return; + } + registerError(operand); + } + + @Override + public void visitPostfixExpression(@NotNull PsiPostfixExpression expression) { + if (ignoreTransformationOfOriginalParameter) { + return; + } + super.visitPostfixExpression(expression); + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSPLUS) && !tokenType.equals(JavaTokenType.MINUSMINUS)) { + return; + } + final PsiExpression operand = expression.getOperand(); + final PsiParameter parameter = getParameter(operand); + if (parameter == null) { + return; + } + registerError(operand); + } + + @Nullable + private PsiParameter getParameter(PsiExpression expression) { + expression = ParenthesesUtils.stripParentheses(expression); + if (!(expression instanceof PsiReferenceExpression)) { + return null; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)expression; + final PsiElement variable = referenceExpression.resolve(); + if (!(variable instanceof PsiParameter)) { + return null; + } + final PsiParameter parameter = (PsiParameter)variable; + final PsiElement declarationScope = parameter.getDeclarationScope(); + if (!isCorrectScope(declarationScope)) { + return null; + } + return parameter; + } + } +} diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/ThrowableResultOfMethodCallIgnoredInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/ThrowableResultOfMethodCallIgnoredInspection.java index cbf33121dd44..080a6e58c409 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/ThrowableResultOfMethodCallIgnoredInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/ThrowableResultOfMethodCallIgnoredInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2008-2011 Bas Leijdekkers + * Copyright 2008-2014 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import com.intellij.psi.*; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.Query; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; @@ -57,11 +58,10 @@ public class ThrowableResultOfMethodCallIgnoredInspection extends BaseInspectionVisitor { @Override - public void visitMethodCallExpression( - PsiMethodCallExpression expression) { + public void visitMethodCallExpression(PsiMethodCallExpression expression) { super.visitMethodCallExpression(expression); PsiElement parent = expression.getParent(); - while (parent instanceof PsiParenthesizedExpression) { + while (parent instanceof PsiParenthesizedExpression || parent instanceof PsiTypeCastExpression) { parent = parent.getParent(); } if (parent instanceof PsiReturnStatement || diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/ScopeUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/ScopeUtils.java index 368f1a13d773..cd61a938f8c1 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/ScopeUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/ScopeUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2014 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. @@ -17,6 +17,7 @@ package com.siyeh.ig.dataflow; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; +import com.siyeh.ig.psiutils.ParenthesesUtils; import com.siyeh.ig.psiutils.PsiElementOrderComparator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -86,7 +87,7 @@ class ScopeUtils { final PsiExpression expression = statement.getExpression(); if (expression instanceof PsiAssignmentExpression) { final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)expression; - final PsiExpression lExpression = assignmentExpression.getLExpression(); + final PsiExpression lExpression = ParenthesesUtils.stripParentheses(assignmentExpression.getLExpression()); if (!lExpression.equals(referenceElement)) { commonParent = PsiTreeUtil.getParentOfType(commonParent, PsiCodeBlock.class); } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/ExtractParameterAsLocalVariableFix.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/ExtractParameterAsLocalVariableFix.java index 31a7987f40f1..277d95359624 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/ExtractParameterAsLocalVariableFix.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/ExtractParameterAsLocalVariableFix.java @@ -26,6 +26,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.util.Query; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.InspectionGadgetsFix; +import com.siyeh.ig.psiutils.ParenthesesUtils; import org.jetbrains.annotations.NotNull; public class ExtractParameterAsLocalVariableFix @@ -46,8 +47,15 @@ public class ExtractParameterAsLocalVariableFix @Override public void doFix(Project project, ProblemDescriptor descriptor) { - final PsiReferenceExpression parameterReference = - (PsiReferenceExpression)descriptor.getPsiElement(); + final PsiElement element = descriptor.getPsiElement(); + if (!(element instanceof PsiExpression)) { + return; + } + final PsiExpression expression = ParenthesesUtils.stripParentheses((PsiExpression)element); + if (!(expression instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression parameterReference = (PsiReferenceExpression)expression; final PsiElement target = parameterReference.resolve(); if (!(target instanceof PsiParameter)) { return; @@ -102,12 +110,12 @@ public class ExtractParameterAsLocalVariableFix if (reference == null) { return; } - final PsiElement element = reference.getElement(); - if (!(element instanceof PsiReferenceExpression)) { + final PsiElement referenceElement = reference.getElement(); + if (!(referenceElement instanceof PsiReferenceExpression)) { return; } final PsiReferenceExpression firstReference = - (PsiReferenceExpression)element; + (PsiReferenceExpression)referenceElement; final PsiElement[] children = body.getChildren(); final int startIndex; final int endIndex; diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/TypeParameterExtendsFinalClassInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/TypeParameterExtendsFinalClassInspection.java index 9992f57f39dd..132193f02451 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/TypeParameterExtendsFinalClassInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/inheritance/TypeParameterExtendsFinalClassInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2013 Bas Leijdekkers + * Copyright 2006-2014 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Query; @@ -79,7 +80,8 @@ public class TypeParameterExtendsFinalClassInspection extends BaseInspection { final PsiElement parent = element.getParent(); if (parent instanceof PsiTypeParameter) { final PsiTypeParameter typeParameter = (PsiTypeParameter)parent; - replaceTypeParameterAndReferencesWithType(typeParameter); + replaceTypeParameterUsagesWithType(typeParameter); + typeParameter.delete(); } else if (parent instanceof PsiTypeElement) { final PsiTypeElement typeElement = (PsiTypeElement)parent; @@ -91,25 +93,18 @@ public class TypeParameterExtendsFinalClassInspection extends BaseInspection { } } - private static void replaceTypeParameterAndReferencesWithType(PsiTypeParameter typeParameter) { - final PsiReferenceList extendsList = typeParameter.getExtendsList(); - final PsiClassType[] referenceElements = extendsList.getReferencedTypes(); - if (referenceElements.length < 1) { - return; - } - final PsiClass finalClass = referenceElements[0].resolve(); - if (finalClass == null) { + private static void replaceTypeParameterUsagesWithType(PsiTypeParameter typeParameter) { + final PsiClassType[] types = typeParameter.getExtendsList().getReferencedTypes(); + if (types.length < 1) { return; } final Project project = typeParameter.getProject(); - final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); - final PsiJavaCodeReferenceElement classReference = factory.createClassReferenceElement(finalClass); + final PsiJavaCodeReferenceElement classReference = JavaPsiFacade.getElementFactory(project).createReferenceElementByType(types[0]); final Query<PsiReference> query = ReferencesSearch.search(typeParameter, typeParameter.getUseScope()); for (PsiReference reference : query) { final PsiElement referenceElement = reference.getElement(); referenceElement.replace(classReference); } - typeParameter.delete(); } } @@ -123,6 +118,9 @@ public class TypeParameterExtendsFinalClassInspection extends BaseInspection { @Override public void visitTypeParameter(PsiTypeParameter classParameter) { super.visitTypeParameter(classParameter); + if (!PsiUtil.isLanguageLevel5OrHigher(classParameter)) { + return; + } final PsiClassType[] extendsListTypes = classParameter.getExtendsListTypes(); if (extendsListTypes.length < 1) { return; @@ -140,6 +138,9 @@ public class TypeParameterExtendsFinalClassInspection extends BaseInspection { @Override public void visitTypeElement(PsiTypeElement typeElement) { + if (!PsiUtil.isLanguageLevel5OrHigher(typeElement)) { + return; + } super.visitTypeElement(typeElement); final PsiType type = typeElement.getType(); if (!(type instanceof PsiWildcardType)) { @@ -155,6 +156,17 @@ public class TypeParameterExtendsFinalClassInspection extends BaseInspection { if (aClass == null || !aClass.hasModifierProperty(PsiModifier.FINAL)) { return; } + if (aClass.hasTypeParameters() && !PsiUtil.isLanguageLevel8OrHigher(typeElement)) { + final PsiType[] parameters = classType.getParameters(); + if (parameters.length == 0) { + return; + } + for (PsiType parameter : parameters) { + if (parameter instanceof PsiWildcardType) { + return; + } + } + } if (!shouldReport(typeElement)) { return; } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/j2me/SimplifiableIfStatementInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/j2me/SimplifiableIfStatementInspection.java index 66ea85532660..000563d0312d 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/j2me/SimplifiableIfStatementInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/j2me/SimplifiableIfStatementInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2013 Bas Leijdekkers + * Copyright 2006-2014 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,19 +19,21 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; +import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.IncorrectOperationException; 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.*; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; + public class SimplifiableIfStatementInspection extends BaseInspection { @Override @@ -280,21 +282,68 @@ public class SimplifiableIfStatementInspection extends BaseInspection { } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { + public void doFix(Project project, ProblemDescriptor descriptor) { final PsiElement element = descriptor.getPsiElement(); final PsiIfStatement ifStatement = (PsiIfStatement)element.getParent(); - final String newStatement = calculateReplacementStatement(ifStatement); - if (newStatement == null) { + List<PsiComment> before = new ArrayList<PsiComment>(); + List<PsiComment> after = new ArrayList<PsiComment>(); + collectComments(ifStatement, true, before, after); + final String newStatementText = calculateReplacementStatement(ifStatement); + if (newStatementText == null) { return; } + final StringBuilder codeBlockText = new StringBuilder("{\n"); + for (PsiComment comment : before) { + codeBlockText.append(comment.getText()).append('\n'); + } + codeBlockText.append(newStatementText).append('\n'); + for (PsiComment comment : after) { + codeBlockText.append(comment.getText()).append('\n'); + } + codeBlockText.append('}'); if (ifStatement.getElseBranch() == null) { final PsiElement nextStatement = PsiTreeUtil.skipSiblingsForward(ifStatement, PsiWhiteSpace.class); if (nextStatement != null) { nextStatement.delete(); } } - PsiReplacementUtil.replaceStatement(ifStatement, newStatement); + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); + final PsiCodeBlock codeBlock = psiFacade.getElementFactory().createCodeBlockFromText(codeBlockText.toString(), ifStatement); + final PsiElement parent = ifStatement.getParent(); + PsiElement child = codeBlock.getFirstBodyElement(); + final PsiElement end = codeBlock.getLastBodyElement(); + while (true) { + parent.addBefore(child, ifStatement); + if (child == end) { + break; + } + child = child.getNextSibling(); + } + ifStatement.delete(); + CodeStyleManager.getInstance(project).reformat(parent); + } + + private static void collectComments(PsiElement element, boolean first, List<PsiComment> before, List<PsiComment> after) { + if (element instanceof PsiComment) { + if (first) { + before.add((PsiComment)element); + } + else { + after.add((PsiComment)element); + } + return; + } + for (PsiElement child : element.getChildren()) { + if (child instanceof PsiKeyword) { + final PsiKeyword keyword = (PsiKeyword)child; + if (keyword.getTokenType() == JavaTokenType.ELSE_KEYWORD) { + first = false; + } + } + else { + collectComments(child, first, before, after); + } + } } } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/maturity/TodoCommentInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/maturity/TodoCommentInspection.java index 9b79d5453758..72ac229533ec 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/maturity/TodoCommentInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/maturity/TodoCommentInspection.java @@ -15,40 +15,38 @@ */ package com.siyeh.ig.maturity; +import com.intellij.codeInspection.BaseJavaBatchLocalInspectionTool; +import com.intellij.codeInspection.InspectionManager; +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.psi.PsiComment; +import com.intellij.psi.PsiFile; +import com.intellij.psi.search.PsiTodoSearchHelper; +import com.intellij.psi.search.TodoItem; +import com.intellij.psi.util.PsiTreeUtil; import com.siyeh.InspectionGadgetsBundle; -import com.siyeh.ig.BaseInspection; -import com.siyeh.ig.BaseInspectionVisitor; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public class TodoCommentInspection extends BaseInspection { +import java.util.ArrayList; +import java.util.List; - @Override - @NotNull - public String getDisplayName() { - return InspectionGadgetsBundle.message("todo.comment.display.name"); - } +public class TodoCommentInspection extends BaseJavaBatchLocalInspectionTool { + @Nullable @Override - @NotNull - public String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message("todo.comment.problem.descriptor"); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ClassWithoutToStringVisitor(); - } - - private static class ClassWithoutToStringVisitor - extends BaseInspectionVisitor { + public ProblemDescriptor[] checkFile(@NotNull PsiFile file, @NotNull InspectionManager manager, boolean isOnTheFly) { + final PsiTodoSearchHelper searchHelper = PsiTodoSearchHelper.SERVICE.getInstance(file.getProject()); + final TodoItem[] todoItems = searchHelper.findTodoItems(file); - @Override - public void visitComment(PsiComment comment) { - super.visitComment(comment); - if (TodoUtil.isTodoComment(comment)) { - registerError(comment); + final List<ProblemDescriptor> result = new ArrayList<ProblemDescriptor>(); + for (TodoItem todoItem : todoItems) { + final PsiComment comment = PsiTreeUtil.getParentOfType(file.findElementAt(todoItem.getTextRange().getStartOffset()), PsiComment.class, false); + if (comment != null) { + result.add(manager.createProblemDescriptor(comment, InspectionGadgetsBundle.message("todo.comment.problem.descriptor"), isOnTheFly, + null, ProblemHighlightType.GENERIC_ERROR_OR_WARNING)); } } + return result.toArray(new ProblemDescriptor[result.size()]); } }
\ No newline at end of file diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/maturity/TodoUtil.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/maturity/TodoUtil.java deleted file mode 100644 index a75f9185bf3e..000000000000 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/maturity/TodoUtil.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2003-2005 Dave Griffith - * - * 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.maturity; - -import com.intellij.openapi.util.TextRange; -import com.intellij.psi.PsiComment; -import com.intellij.psi.PsiFile; -import com.intellij.psi.search.PsiTodoSearchHelper; -import com.intellij.psi.search.TodoItem; - -public class TodoUtil { - private TodoUtil() { - super(); - } - - public static boolean isTodoComment(PsiComment comment) { - final PsiFile file = comment.getContainingFile(); - final PsiTodoSearchHelper searchHelper = PsiTodoSearchHelper.SERVICE.getInstance(comment.getProject()); - final TodoItem[] todoItems = searchHelper.findTodoItems(file); - for (final TodoItem todoItem : todoItems) { - final TextRange commentTextRange = comment.getTextRange(); - final TextRange todoTextRange = todoItem.getTextRange(); - if (commentTextRange.contains(todoTextRange)) { - return true; - } - } - return false; - } -}
\ No newline at end of file diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerializableInnerClassHasSerialVersionUIDFieldVisitor.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerializableInnerClassHasSerialVersionUIDFieldVisitor.java index 26cbe4b72c0f..0a7d282dbb0a 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerializableInnerClassHasSerialVersionUIDFieldVisitor.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerializableInnerClassHasSerialVersionUIDFieldVisitor.java @@ -15,10 +15,7 @@ */ package com.siyeh.ig.serialization; -import com.intellij.psi.PsiAnonymousClass; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiModifier; -import com.intellij.psi.PsiModifierListOwner; +import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.siyeh.HardcodedMethodConstants; @@ -39,12 +36,13 @@ class SerializableInnerClassHasSerialVersionUIDFieldVisitor @Override public void visitClass(@NotNull PsiClass aClass) { // no call to super, so it doesn't drill down - if (aClass.isInterface() || aClass.isAnnotationType() || - aClass.isEnum()) { + if (aClass.isInterface() || aClass.isAnnotationType() || aClass.isEnum()) { return; } - if (inspection.ignoreAnonymousInnerClasses && - aClass instanceof PsiAnonymousClass) { + if (aClass instanceof PsiTypeParameter) { + return; + } + if (inspection.ignoreAnonymousInnerClasses && aClass instanceof PsiAnonymousClass) { return; } if (aClass.findFieldByName(HardcodedMethodConstants.SERIAL_VERSION_UID, false) != null) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerializableInnerClassWithNonSerializableOuterClassVisitor.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerializableInnerClassWithNonSerializableOuterClassVisitor.java index e629e7485250..7596c3f57bfa 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerializableInnerClassWithNonSerializableOuterClassVisitor.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/serialization/SerializableInnerClassWithNonSerializableOuterClassVisitor.java @@ -15,10 +15,7 @@ */ package com.siyeh.ig.serialization; -import com.intellij.psi.PsiAnonymousClass; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiModifier; -import com.intellij.psi.PsiModifierListOwner; +import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.siyeh.ig.BaseInspectionVisitor; @@ -37,12 +34,13 @@ class SerializableInnerClassWithNonSerializableOuterClassVisitor @Override public void visitClass(@NotNull PsiClass aClass) { - if (aClass.isInterface() || aClass.isAnnotationType() || - aClass.isEnum()) { + if (aClass.isInterface() || aClass.isAnnotationType() || aClass.isEnum()) { return; } - if (inspection.ignoreAnonymousInnerClasses && - aClass instanceof PsiAnonymousClass) { + if (aClass instanceof PsiTypeParameter) { + return; + } + if (inspection.ignoreAnonymousInnerClasses && aClass instanceof PsiAnonymousClass) { return; } final PsiClass containingClass = PsiTreeUtil.getParentOfType(aClass, PsiClass.class); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryThisInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryThisInspection.java index aa2d3ea2fce1..6c4051066ad5 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryThisInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/UnnecessaryThisInspection.java @@ -15,6 +15,7 @@ */ package com.siyeh.ig.style; +import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil; import com.intellij.codeInspection.CleanupLocalInspectionTool; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.ProblemHighlightType; @@ -136,6 +137,9 @@ public class UnnecessaryThisInspection extends BaseInspection implements Cleanup if (!VariableSearchUtils.variableNameResolvesToTarget(referenceName, variable, expression)) { return; } + if (variable instanceof PsiField && HighlightUtil.isIllegalForwardReferenceToField(expression, (PsiField)variable, true) != null) { + return; + } registerError(thisExpression, ProblemHighlightType.LIKE_UNUSED_SYMBOL); } else { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/threading/AccessToNonThreadSafeStaticFieldFromInstanceInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/threading/AccessToNonThreadSafeStaticFieldFromInstanceInspectionBase.java index b051e2e653a2..b4d67d6a5b89 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/threading/AccessToNonThreadSafeStaticFieldFromInstanceInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/threading/AccessToNonThreadSafeStaticFieldFromInstanceInspectionBase.java @@ -44,7 +44,11 @@ public class AccessToNonThreadSafeStaticFieldFromInstanceInspectionBase extends @SuppressWarnings("PublicField") public final ExternalizableStringSet nonThreadSafeClasses = - new ExternalizableStringSet("java.text.SimpleDateFormat", "java.util.Calendar"); + new ExternalizableStringSet("java.text.SimpleDateFormat", + "java.text.MessageFormat", + "java.text.DecimalFormat", + "java.text.ChoiceFormat", + "java.util.Calendar"); @NonNls @SuppressWarnings({"PublicField"}) |