Search code examples
javaeclipseeclipse-jdt

How to get all the references of static field with JDT


I found Java: Find all callers of a method – get all methods that call a particular method that gives a hint on how to find all the callers of a specific method.

Then, how to get the users of a static field?

For example, when I have static z in AnotherClass, and it is accessed with ClassA, how to get the IMethod ClassA#moved?

public class AnotherClass {
    public static int z = 20;
    ....
}


public class ClassA {
    public int moved(int x, int y)
    {
        int temp = AnotherClass.z;
    }

Solution

  • The example is base on the org.eclipse.jdt.internal.* classes, I think you don't need to take so much effort to do this, since JDT SearchEngine API is full-featured. In your case, the following code will be enough:

        IWorkspace workspace = ResourcesPlugin.getWorkspace();
        IWorkspaceRoot root = workspace.getRoot();
        IProject plainProject = root.getProject("some project");
        IJavaProject javaProject = JavaCore.create(plainProject);
        try {
            IType type = javaProject.findType("foo.bar.AnotherClass");
            IField field = type.getField("z");
            //IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
            IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { plainProject });
            SearchPattern searchParttern = SearchPattern.createPattern(field,
                    IJavaSearchConstants.REFERENCES);
            SearchRequestor requestor = new SearchRequestor() {
                @Override
                public void acceptSearchMatch(SearchMatch match) {
                    System.out.println(match.getElement());
                }
            };
            SearchEngine searchEngine = new SearchEngine();
            searchEngine.search(searchParttern,
                    new SearchParticipant[] { SearchEngine.getDefaultSearchParticipant() }, scope,
                    requestor, new NullProgressMonitor());
        } catch (Exception e) {
            // some exception handling you need to do
        }