-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
HasParentNode.java
98 lines (86 loc) · 3.34 KB
/
HasParentNode.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
* Copyright (C) 2007-2010 Júlio Vilmar Gesser.
* Copyright (C) 2011, 2013-2016 The JavaParser Team.
*
* This file is part of JavaParser.
*
* JavaParser can be used either under the terms of
* a) the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* b) the terms of the Apache License
*
* You should have received a copy of both licenses in LICENCE.LGPL and
* LICENCE.APACHE. Please refer to those files for details.
*
* JavaParser is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*/
package com.github.javaparser;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.observer.Observable;
import java.util.Optional;
import java.util.function.Predicate;
/**
* An object that can have a parent node.
*/
public interface HasParentNode<T> extends Observable {
/**
* Returns the parent node, or {@code null} if no parent is set.
*/
Optional<Node> getParentNode();
/**
* Sets the parent node.
*
* @param parentNode the parent node, or {@code null} to set no parent.
* @return return {@code this}
*/
T setParentNode(Node parentNode);
/**
* Returns the parent node from the perspective of the children of this node.
* <p>
* That is, this method returns {@code this} for everything except {@code NodeList}. A {@code NodeList} returns its
* parent node instead. This is because a {@code NodeList} sets the parent of all its children to its own parent
* node (see {@link com.github.javaparser.ast.NodeList} for details).
*/
Node getParentNodeForChildren();
/**
* @deprecated use {@link #findAncestor(Class)}.
*/
@Deprecated
default <N> Optional<N> getAncestorOfType(Class<N> classType) {
return findAncestor(classType);
}
/**
* @deprecated use {@link #findAncestor(Class)}.
*/
@Deprecated
default <N> Optional<N> findParent(Class<N> type) {
return findAncestor(type);
}
/**
* Walks the parents of this node and returns the first node of type {@code type}, or {@code empty()} if none is
* found. The given type may also be an interface type, such as one of the {@code NodeWith...} interface types.
*/
default <N> Optional<N> findAncestor(Class<N> type) {
return findAncestor(type, x -> true);
}
/**
* Walks the parents of this node and returns the first node of type {@code type} that matches {@code predicate}, or
* {@code empty()} if none is found. The given type may also be an interface type, such as one of the
* {@code NodeWith...} interface types.
*/
default <N> Optional<N> findAncestor(Class<N> type, Predicate<N> predicate) {
Optional<Node> possibleParent = getParentNode();
while (possibleParent.isPresent()) {
Node parent = possibleParent.get();
if (type.isAssignableFrom(parent.getClass()) && predicate.test(type.cast(parent))) {
return Optional.of(type.cast(parent));
}
possibleParent = parent.getParentNode();
}
return Optional.empty();
}
}