JavaLightTreeUtil#hasExplicitModifier extracted (IDEA-CR-32927)

This commit is contained in:
Tagir Valeev
2018-05-24 14:35:23 +07:00
parent 872427d9f6
commit 04a18bd221
3 changed files with 20 additions and 8 deletions
@@ -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)
}
}
@@ -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;
}
}
}
@@ -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;
}
}