From 5c2a2001e314300ac5aa317bd68634a953ec8164 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 12 Aug 2014 15:19:13 +0200 Subject: [PATCH] check enum constants for variables that can be passed as arguments --- ...riablePassedAsArgumentExcludedVisitor.java | 54 +++++++------------ .../VariablePassedAsArgumentVisitor.java | 28 +++++----- .../MismatchedCollectionQueryUpdate.java | 14 +++++ .../MismatchedStringBuilderQueryUpdate.java | 12 +++++ 4 files changed, 58 insertions(+), 50 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariablePassedAsArgumentExcludedVisitor.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariablePassedAsArgumentExcludedVisitor.java index 69710a084904..f7778e0a89bc 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariablePassedAsArgumentExcludedVisitor.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariablePassedAsArgumentExcludedVisitor.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. @@ -44,14 +44,29 @@ class VariablePassedAsArgumentExcludedVisitor extends JavaRecursiveElementVisito } @Override - public void visitMethodCallExpression(@NotNull PsiMethodCallExpression call) { + public void visitCallExpression(PsiCallExpression callExpression) { if (passed) { return; } - super.visitMethodCallExpression(call); + super.visitCallExpression(callExpression); + visitCall(callExpression); + } + + @Override + public void visitEnumConstant(PsiEnumConstant enumConstant) { + if (passed) { + return; + } + super.visitEnumConstant(enumConstant); + visitCall(enumConstant); + } + + private void visitCall(PsiCall call) { final PsiExpressionList argumentList = call.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - for (PsiExpression argument : arguments) { + if (argumentList == null) { + return; + } + for (PsiExpression argument : argumentList.getExpressions()) { if (!VariableAccessUtils.mayEvaluateToVariable(argument, variable, myBuilderPattern)) { continue; } @@ -69,35 +84,6 @@ class VariablePassedAsArgumentExcludedVisitor extends JavaRecursiveElementVisito } } - @Override - public void visitNewExpression(@NotNull PsiNewExpression newExpression) { - if (passed) { - return; - } - super.visitNewExpression(newExpression); - final PsiExpressionList argumentList = newExpression.getArgumentList(); - if (argumentList == null) { - return; - } - final PsiExpression[] arguments = argumentList.getExpressions(); - for (PsiExpression argument : arguments) { - if (!VariableAccessUtils.mayEvaluateToVariable(argument, variable, myBuilderPattern)) { - continue; - } - final PsiMethod constructor = newExpression.resolveConstructor(); - if (constructor != null) { - final PsiClass aClass = constructor.getContainingClass(); - if (aClass != null) { - final String name = aClass.getQualifiedName(); - if (excludes.contains(name)) { - continue; - } - } - } - passed = true; - } - } - public boolean isPassed() { return passed; } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariablePassedAsArgumentVisitor.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariablePassedAsArgumentVisitor.java index 7938fbc5c696..92082cea9e27 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariablePassedAsArgumentVisitor.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariablePassedAsArgumentVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2011 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. @@ -37,33 +37,29 @@ class VariablePassedAsArgumentVisitor extends JavaRecursiveElementVisitor { } @Override - public void visitMethodCallExpression(@NotNull PsiMethodCallExpression call) { + public void visitCallExpression(PsiCallExpression callExpression) { + super.visitCallExpression(callExpression); if (passed) { return; } - super.visitMethodCallExpression(call); - final PsiExpressionList argumentList = call.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - for (PsiExpression argument : arguments) { - if (VariableAccessUtils.mayEvaluateToVariable(argument, variable)) { - passed = true; - break; - } - } + visitCall(callExpression); } @Override - public void visitNewExpression(@NotNull PsiNewExpression newExpression) { + public void visitEnumConstant(PsiEnumConstant enumConstant) { if (passed) { return; } - super.visitNewExpression(newExpression); - final PsiExpressionList argumentList = newExpression.getArgumentList(); + super.visitEnumConstant(enumConstant); + visitCall(enumConstant); + } + + private void visitCall(PsiCall call) { + final PsiExpressionList argumentList = call.getArgumentList(); if (argumentList == null) { return; } - final PsiExpression[] arguments = argumentList.getExpressions(); - for (PsiExpression argument : arguments) { + for (PsiExpression argument : argumentList.getExpressions()) { if (VariableAccessUtils.mayEvaluateToVariable(argument, variable)) { passed = true; break; diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_collection_query_update/MismatchedCollectionQueryUpdate.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_collection_query_update/MismatchedCollectionQueryUpdate.java index 5c53674cd15b..5af84ecb21e7 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_collection_query_update/MismatchedCollectionQueryUpdate.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_collection_query_update/MismatchedCollectionQueryUpdate.java @@ -275,4 +275,18 @@ class SimpleAdd { return null; } +} +class EnumConstant { + private static final List CONSTANT_ARRAY = new ArrayList(); + static { + CONSTANT_ARRAY.add("asdf"); + } + + enum SomeEnum { + ITEM(CONSTANT_ARRAY); // passed as argument + private final List myPatterns; + SomeEnum(List patterns) { + myPatterns = patterns; + } + } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_string_builder_query_update/MismatchedStringBuilderQueryUpdate.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_string_builder_query_update/MismatchedStringBuilderQueryUpdate.java index c8d9fb80cf19..2274472eb2fa 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_string_builder_query_update/MismatchedStringBuilderQueryUpdate.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/mismatched_string_builder_query_update/MismatchedStringBuilderQueryUpdate.java @@ -31,3 +31,15 @@ interface List { interface Consumer { void accept(T t); } +class EnumConstant { + private static final StringBuilder sb = new StringBuilder(); + static { + sb.append(""); + } + + enum SomeEnum { + ITEM(sb); // passed as argument + + SomeEnum(StringBuilder sb) {} + } +}