01: /*
02: * Spoon - http://spoon.gforge.inria.fr/
03: * Copyright (C) 2006 INRIA Futurs <renaud.pawlak@inria.fr>
04: *
05: * This software is governed by the CeCILL-C License under French law and
06: * abiding by the rules of distribution of free software. You can use, modify
07: * and/or redistribute the software under the terms of the CeCILL-C license as
08: * circulated by CEA, CNRS and INRIA at http://www.cecill.info.
09: *
10: * This program is distributed in the hope that it will be useful, but WITHOUT
11: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12: * FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details.
13: *
14: * The fact that you are presently reading this means that you have had
15: * knowledge of the CeCILL-C license and that you accept its terms.
16: */
17:
18: package spoon.reflect.visitor;
19:
20: import java.util.ArrayList;
21: import java.util.List;
22:
23: import spoon.reflect.reference.CtReference;
24:
25: /**
26: * A simple visitor that takes a reference filter and returns all the references
27: * that match it.
28: */
29:
30: public class ReferenceQueryVisitor<T extends CtReference> extends
31: CtScanner {
32: ReferenceFilter<T> filter;
33:
34: List<T> result = new ArrayList<T>();
35:
36: /**
37: * Constructs a reference query visitor with a given reference filter.
38: */
39: public ReferenceQueryVisitor(ReferenceFilter<T> filter) {
40: super ();
41: this .filter = filter;
42: }
43:
44: /**
45: * Gets the result (references matching the filter).
46: */
47: public List<T> getResult() {
48: return result;
49: }
50:
51: @SuppressWarnings("unchecked")
52: @Override
53: public void scan(CtReference reference) {
54: if (reference == null)
55: return;
56: if (filter.getType().isAssignableFrom(reference.getClass())) {
57: if (filter.matches((T) reference)) {
58: result.add((T) reference);
59: }
60: }
61: super.scan(reference);
62: }
63: }
|