package mit.edu.concurrencyrefactorings.util; import java.util.ArrayList; import java.util.List; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.Message; public class MessageUtil { public static final int NODE_ONLY= 0; public static final int INCLUDE_FIRST_PARENT= 1; public static final int INCLUDE_ALL_PARENTS= 2; private static final Message[] EMPTY_MESSAGES= new Message[0]; public static Message[] getMessages(ASTNode node, int flags) { ASTNode root= node.getRoot(); if (!(root instanceof CompilationUnit)) return EMPTY_MESSAGES; Message[] messages= ((CompilationUnit)root).getMessages(); if (root == node) return messages; final int iterations= computeIterations(flags); List<Message> result= new ArrayList<Message>(5); for (int i= 0; i < messages.length; i++) { Message message= messages[i]; ASTNode temp= node; int count= iterations; do { int nodeOffset= temp.getStartPosition(); int messageOffset= message.getStartPosition(); if (nodeOffset <= messageOffset && messageOffset < nodeOffset + temp.getLength()) { result.add(message); count= 0; } else { count--; } } while ((temp= temp.getParent()) != null && count > 0); } return result.toArray(new Message[result.size()]); } private static int computeIterations(int flags) { switch (flags) { case NODE_ONLY: return 1; case INCLUDE_ALL_PARENTS: return Integer.MAX_VALUE; case INCLUDE_FIRST_PARENT: return 2; default: return 1; } } }