NodeList.java revision f64e8f570cb375692d112e03d095040e88d109ab
176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti/* 276f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Copyright (C) 2007-2010 Júlio Vilmar Gesser. 376f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Copyright (C) 2011, 2013-2016 The JavaParser Team. 476f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 576f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * This file is part of JavaParser. 676f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 776f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * JavaParser can be used either under the terms of 876f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * a) the GNU Lesser General Public License as published by 976f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * the Free Software Foundation, either version 3 of the License, or 1076f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * (at your option) any later version. 1176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * b) the terms of the Apache License 1276f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 1376f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * You should have received a copy of both licenses in LICENCE.LGPL and 1476f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * LICENCE.APACHE. Please refer to those files for details. 1576f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 1676f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * JavaParser is distributed in the hope that it will be useful, 1776f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * but WITHOUT ANY WARRANTY; without even the implied warranty of 1876f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1976f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * GNU Lesser General Public License for more details. 2076f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti */ 2176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti 22515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggenpackage com.github.javaparser.ast; 23515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 24db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggenimport com.github.javaparser.HasParentNode; 250f8bbe61c2d7132846b8ad13804ae70d62c5c8bcDanny van Bruggenimport com.github.javaparser.ast.observer.AstObserver; 260f8bbe61c2d7132846b8ad13804ae70d62c5c8bcDanny van Bruggenimport com.github.javaparser.ast.observer.Observable; 27515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggenimport com.github.javaparser.ast.visitor.GenericVisitor; 28008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilienimport com.github.javaparser.ast.visitor.Visitable; 29515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggenimport com.github.javaparser.ast.visitor.VoidVisitor; 30515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 316d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassettiimport java.util.*; 32c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettiimport java.util.function.Consumer; 33c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettiimport java.util.function.Predicate; 34c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettiimport java.util.function.UnaryOperator; 356d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassettiimport java.util.stream.Stream; 366d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 37515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen/** 38db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen * A list of nodes. 399dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen * It usually has a parent node. 4015c2aa05f936720e8f7efdedbbc68450a6f27fb3Danny van Bruggen * Unlike normal Nodes, this does not mean that it is a child of that parent. 419dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen * Instead, this list will make every node it contains a child of its parent. 429dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen * This way, a NodeList does not create an extra level inside the AST. 43515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen * 44515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen * @param <N> the type of nodes contained. 45515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen */ 46c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettipublic class NodeList<N extends Node> implements List<N>, Iterable<N>, HasParentNode<NodeList<N>>, Visitable, Observable { 47515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen private List<N> innerList = new ArrayList<>(0); 48515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 49db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen private Node parentNode; 50db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 51263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti private List<AstObserver> observers = new ArrayList<>(); 526d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 53515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public NodeList() { 54f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen this((Node) null); 55515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 56515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 57515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public NodeList(Node parent) { 58515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen setParentNode(parent); 59515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 60515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 61796e7f15567eeeef96e224d8d00c27fdf1248413Danny van Bruggen public NodeList(NodeList<N> n) { 62796e7f15567eeeef96e224d8d00c27fdf1248413Danny van Bruggen this.addAll(n); 63796e7f15567eeeef96e224d8d00c27fdf1248413Danny van Bruggen } 64796e7f15567eeeef96e224d8d00c27fdf1248413Danny van Bruggen 65f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 66f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean add(N node) { 676d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti notifyElementAdded(innerList.size(), node); 68515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen own(node); 69f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.add(node); 70515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 71515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 72515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen private void own(N node) { 73515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen if (node == null) { 74515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return; 75515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 76515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen setAsParentNodeOf(node); 77515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 78515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 79515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public boolean remove(Node node) { 80c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti int index = innerList.indexOf(node); 81c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti if (index != -1) { 82c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti notifyElementRemoved(index, node); 83c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti node.setParentNode(null); 84c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti } 859dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen return innerList.remove(node); 86515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 87515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 889dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen @SafeVarargs 89515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public static <X extends Node> NodeList<X> nodeList(X... nodes) { 90515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen final NodeList<X> nodeList = new NodeList<>(); 919dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen Collections.addAll(nodeList, nodes); 92515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return nodeList; 93515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 94515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 95515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public static <X extends Node> NodeList<X> nodeList(Collection<X> nodes) { 96515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen final NodeList<X> nodeList = new NodeList<>(); 97515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen for (X node : nodes) { 98515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen nodeList.add(node); 99515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 100515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return nodeList; 101515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 102515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 103515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public static <X extends Node> NodeList<X> nodeList(NodeList<X> nodes) { 104515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen final NodeList<X> nodeList = new NodeList<>(); 1059dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen nodeList.addAll(nodes); 106515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return nodeList; 107515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 108515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 109515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public boolean contains(N node) { 110515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.contains(node); 111515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 112515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 113f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 114515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public Stream<N> stream() { 115515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.stream(); 116515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 117515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 118f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 119515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public int size() { 120515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.size(); 121515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 122515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 123f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 124515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public N get(int i) { 125515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.get(i); 126515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 127515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 128515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen @Override 129515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public Iterator<N> iterator() { 130515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen // TODO take care of "Iterator.remove" 131515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.iterator(); 132515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 133515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 134f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 135f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public N set(int index, N element) { 136c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti notifyElementRemoved(index, innerList.get(index)); 137c7d2927625db7201d35d891e1751c91edfebd285Federico Tomassetti notifyElementAdded(index, element); 138515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen setAsParentNodeOf(element); 139f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.set(index, element); 140515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 141515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 142f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 143f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public N remove(int index) { 144263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti notifyElementRemoved(index, innerList.get(index)); 145f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien N remove = innerList.remove(index); 146f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien if (remove != null) 147f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien remove.setParentNode(null); 148f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return remove; 149515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 150515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 151f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 152515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public boolean isEmpty() { 153515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.isEmpty(); 154515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 155515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 156f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 157515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public void sort(Comparator<? super N> comparator) { 158515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen Collections.sort(innerList, comparator); 159515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 160515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 161515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public void addAll(NodeList<N> otherList) { 162515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen for (N node : otherList) { 163515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen add(node); 164515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 165515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 166515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 167f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 168f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void add(int index, N node) { 1696d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti notifyElementAdded(index, node); 170515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen own(node); 171515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen innerList.add(index, node); 172515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 173db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 174db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen @Override 175008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien public Optional<Node> getParentNode() { 176008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien return Optional.ofNullable(parentNode); 177db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 178db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 179008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien /** 180008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien * Sets the parentNode 1814296abb695b767f7471dd255d0679516183b062aDanny van Bruggen * 182008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien * @param parentNode the parentNode 183008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien * @return this, the NodeList 184008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien */ 185db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen @Override 186db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public NodeList<N> setParentNode(Node parentNode) { 187db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen this.parentNode = parentNode; 188db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen setAsParentNodeOf(innerList); 189db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen return this; 190db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 191db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 192db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen @Override 193db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public Node getParentNodeForChildren() { 194db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen return parentNode; 195db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 196db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 197008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien @Override 198db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) { 199db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen return v.visit(this, arg); 200db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 201db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 202008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien @Override 203db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public <A> void accept(final VoidVisitor<A> v, final A arg) { 204db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen v.visit(this, arg); 205db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 206db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 207f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 208f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.lang.Iterable#forEach(java.util.function.Consumer) 209f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 210f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 211f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void forEach(Consumer<? super N> action) { 212f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien innerList.forEach(action); 213f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 214f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 215f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 216f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#contains(java.lang.Object) 217f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 218f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 219f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean contains(Object o) { 220f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.contains(o); 221f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 222f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 223f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 224f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#toArray() 225f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 226f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 227f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public Object[] toArray() { 228f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.toArray(); 229f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 230f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 231f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 232f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#toArray(java.lang.Object[]) 233f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 234f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 235f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public <T> T[] toArray(T[] a) { 236f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.toArray(a); 237f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 238f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 239f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 240f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#remove(java.lang.Object) 241f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 242f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 243f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean remove(Object o) { 244ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti if (o instanceof Node) { 2454296abb695b767f7471dd255d0679516183b062aDanny van Bruggen return remove((Node) o); 246ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti } else { 247ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti return false; 248ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti } 249f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 250f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 251f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 252f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#containsAll(java.util.Collection) 253f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 254f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 255f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean containsAll(Collection<?> c) { 256f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.containsAll(c); 257f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 258f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 259f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 260f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#addAll(java.util.Collection) 261f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 262f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 263f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean addAll(Collection<? extends N> c) { 2649dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen c.forEach(this::add); 2653e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti return !c.isEmpty(); 266f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 267f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 268f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 269f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#addAll(int, java.util.Collection) 270f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 271f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 272f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean addAll(int index, Collection<? extends N> c) { 273150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti for (N e : c) { 274150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti add(index++, e); 2753e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti } 276150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti return !c.isEmpty(); 277f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 278f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 279f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 280f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#removeAll(java.util.Collection) 281f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 282f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 283f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean removeAll(Collection<?> c) { 284ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti boolean changed = false; 285ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti for (Object e : c) { 286ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti changed = remove(e) || changed; 287f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 288ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti return changed; 289f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 290f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 291f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 292f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#retainAll(java.util.Collection) 293f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 294f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 295f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean retainAll(Collection<?> c) { 296cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti boolean changed = false; 297cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti for (Object e : this.stream().filter(it -> !c.contains(it)).toArray()) { 298cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti if (!c.contains(e)) { 299cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti changed = remove(e) || changed; 300cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti } 301cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti } 302cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti return changed; 303f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 304f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 305f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 306f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#replaceAll(java.util.function.UnaryOperator) 307f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 308f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 309f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void replaceAll(UnaryOperator<N> operator) { 3104296abb695b767f7471dd255d0679516183b062aDanny van Bruggen for (int i = 0; i < this.size(); i++) { 31134ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti set(i, operator.apply(this.get(i))); 31234ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti } 313f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 314f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 315f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 316f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.Collection#removeIf(java.util.function.Predicate) 317f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 318f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 319f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean removeIf(Predicate<? super N> filter) { 32055d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti boolean changed = false; 3214296abb695b767f7471dd255d0679516183b062aDanny van Bruggen for (Object e : this.stream().filter(filter).toArray()) { 32255d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti changed = remove(e) || changed; 32355d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti } 32455d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti return changed; 325f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 326f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 327f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 328f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#clear() 329f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 330f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 331f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void clear() { 3324a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti while (!isEmpty()) { 3334a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti remove(0); 3344a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti } 335f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 336f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 337f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 338f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#equals(java.lang.Object) 339f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 340f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 341f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean equals(Object o) { 342f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.equals(o); 343f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 344f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 345f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 346f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#hashCode() 347f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 348f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 349f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public int hashCode() { 350f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.hashCode(); 351f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 352f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 353f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 354f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#indexOf(java.lang.Object) 355f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 356f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 357f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public int indexOf(Object o) { 358f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.indexOf(o); 359f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 360f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 361f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 362f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#lastIndexOf(java.lang.Object) 363f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 364f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 365f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public int lastIndexOf(Object o) { 366f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.lastIndexOf(o); 367f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 368f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 369f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 370f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#listIterator() 371f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 372f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 373f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public ListIterator<N> listIterator() { 374f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.listIterator(); 375f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 376f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 377f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 378f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#listIterator(int) 379f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 380f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 381f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public ListIterator<N> listIterator(int index) { 382f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.listIterator(index); 383f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 384f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 385f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 386f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.Collection#parallelStream() 387f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 388f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 389f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public Stream<N> parallelStream() { 390f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.parallelStream(); 391f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 392f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 393f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 394f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#subList(int, int) 395f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 396f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 397f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public List<N> subList(int fromIndex, int toIndex) { 398f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.subList(fromIndex, toIndex); 399f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 400f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 401f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 402f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#spliterator() 403f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 404f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 405f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public Spliterator<N> spliterator() { 406f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.spliterator(); 407c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassetti } 408263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti 4096d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti private void notifyElementAdded(int index, Node nodeAddedOrRemoved) { 41017c60f99a730acb68276303e7c6fcdf0a376258cFederico Tomassetti this.observers.forEach(o -> o.listChange(this, AstObserver.ListChangeType.ADDITION, index, nodeAddedOrRemoved)); 4116d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti } 4126d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 4136d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti private void notifyElementRemoved(int index, Node nodeAddedOrRemoved) { 41417c60f99a730acb68276303e7c6fcdf0a376258cFederico Tomassetti this.observers.forEach(o -> o.listChange(this, AstObserver.ListChangeType.REMOVAL, index, nodeAddedOrRemoved)); 4156d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti } 4166d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 4176d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti @Override 418263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti public void unregister(AstObserver observer) { 4196d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti this.observers.remove(observer); 4206d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti } 4216d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 4226d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti @Override 423263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti public void register(AstObserver observer) { 4246d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti this.observers.add(observer); 425263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti } 426263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti 427263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti @Override 428263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti public boolean isRegistered(AstObserver observer) { 429263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti return this.observers.contains(observer); 430f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 431f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 432f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen /** 433f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen * Replaces the first node that is equal to "old" with "replacement". 434f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen * 435f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen * @return true if a replacement has happened. 436f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen */ 437f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen public boolean replace(N old, N replacement) { 438f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen int i = indexOf(old); 439f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen if (i == -1) { 440f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen return false; 441f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen } 442f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen set(i, replacement); 443f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen return true; 444f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen } 445515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen} 446