diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/inference/ContractInferenceIndex.kt b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/inference/ContractInferenceIndex.kt index 1fbe3826f869..0c3820db73f7 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/inference/ContractInferenceIndex.kt +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/inference/ContractInferenceIndex.kt @@ -49,10 +49,8 @@ private class InferenceVisitor(val tree : LighterAST) : RecursiveLighterASTNodeW private fun gatherFields(aClass: LighterASTNode) { val fields = LightTreeUtil.getChildrenOfType(tree, aClass, FIELD) for (field in fields) { - val modifierList = LightTreeUtil.firstChildOfType(tree, field, MODIFIER_LIST) val fieldName = JavaLightTreeUtil.getNameIdentifierText(tree, field) - if (modifierList != null && fieldName != null && - tree.getChildren(modifierList).any { modifier -> modifier.tokenType === JavaTokenType.VOLATILE_KEYWORD }) { + if (fieldName != null && JavaLightTreeUtil.hasExplicitModifier(tree, field, JavaTokenType.VOLATILE_KEYWORD)) { volatileFieldNames.add(fieldName) } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/inference/PurityInferenceVisitor.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/inference/PurityInferenceVisitor.java index f09e4e2f5c96..5dbfcd178b4a 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/inference/PurityInferenceVisitor.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/inference/PurityInferenceVisitor.java @@ -52,11 +52,9 @@ class PurityInferenceVisitor { if (qualifier == null || qualifier.getTokenType() == THIS_EXPRESSION) { if (myVolatileFieldNames.contains(JavaLightTreeUtil.getNameIdentifierText(tree, element))) { LighterASTNode target = new FileLocalResolver(tree).resolveLocally(element).getTarget(); - if (target != null && target.getTokenType() == FIELD) { - LighterASTNode modifierList = LightTreeUtil.firstChildOfType(tree, target, MODIFIER_LIST); - hasVolatileReads |= modifierList != null && - tree.getChildren(modifierList).stream() - .anyMatch(modifier -> modifier.getTokenType() == JavaTokenType.VOLATILE_KEYWORD); + if (target != null && target.getTokenType() == FIELD && + JavaLightTreeUtil.hasExplicitModifier(tree, target, JavaTokenType.VOLATILE_KEYWORD)) { + hasVolatileReads = true; } } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaLightTreeUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaLightTreeUtil.java index 892e65a68c47..13172856645e 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaLightTreeUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaLightTreeUtil.java @@ -21,6 +21,7 @@ import com.intellij.psi.JavaTokenType; import com.intellij.psi.impl.cache.RecordUtil; import com.intellij.psi.impl.source.tree.ElementType; import com.intellij.psi.impl.source.tree.LightTreeUtil; +import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -73,4 +74,19 @@ public class JavaLightTreeUtil { } return expression; } + + /** + * Returns true if given element (which is modifier list owner) has given explicit modifier + * + * @param tree an AST tree + * @param modifierListOwner element to check modifier of + * @param modifierKeyword modifier to look for (e.g. {@link JavaTokenType#VOLATILE_KEYWORD} + * @return true if given element has given explicit modifier + */ + public static boolean hasExplicitModifier(@NotNull LighterAST tree, + @Nullable LighterASTNode modifierListOwner, + @NotNull IElementType modifierKeyword) { + LighterASTNode modifierList = LightTreeUtil.firstChildOfType(tree, modifierListOwner, MODIFIER_LIST); + return LightTreeUtil.firstChildOfType(tree, modifierList, modifierKeyword) != null; + } }