blob: 8d9429a1caf798deb242fc9f946adb9a5a8bbde0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 xored software, Inc.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* xored software, Inc. - initial API and Implementation (Vladislav Kuzkokov)
*******************************************************************************/
package org.eclipse.dltk.javascript.core.dom.rewrite;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.dltk.core.ISourceRange;
import org.eclipse.dltk.core.search.SearchMatch;
import org.eclipse.dltk.javascript.core.dom.DomPackage;
import org.eclipse.dltk.javascript.core.dom.Node;
import org.eclipse.dltk.javascript.core.dom.Source;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
public class NodeFinder {
public static Node findNode(Node node, int left, int right) {
TreeIterator<EObject> it = node.eAllContents();
Node before = null;
Node after = null;
while (it.hasNext()) {
Node cur = (Node) it.next();
if (cur.getEnd() <= left) {
if (before == null || cur.getEnd() >= before.getEnd()
&& cur.getBegin() > before.getBegin())
before = cur;
else
it.prune();
}
if (cur.getBegin() >= right) {
if (after == null || cur.getBegin() <= after.getBegin()
&& cur.getEnd() < after.getEnd())
after = cur;
else
it.prune();
}
if (left <= cur.getBegin() && cur.getEnd() <= right) {
return cur;
}
// check for atomic expressions
if (cur.getBegin() <= left && right <= cur.getEnd()) {
switch (cur.eClass().getClassifierID()) {
case DomPackage.BOOLEAN_LITERAL:
case DomPackage.NULL_LITERAL:
case DomPackage.NUMERIC_LITERAL:
case DomPackage.REGULAR_EXPRESSION_LITERAL:
case DomPackage.STRING_LITERAL:
case DomPackage.THIS_EXPRESSION:
case DomPackage.VARIABLE_REFERENCE:
case DomPackage.IDENTIFIER:
return cur;
}
}
}
return after == null ? before == null ? null : before : after;
}
public static Node[] findNodes(Source cuNode,
Iterable<SearchMatch> searchResults) {
List<Node> result = new ArrayList<Node>();
for (SearchMatch match : searchResults) {
Node node = findNode(cuNode, match);
if (node != null)
result.add(node);
}
return result.toArray(new Node[result.size()]);
}
public static Node findNode(Source cuNode, SearchMatch searchResult) {
Node selectedNode = NodeFinder.findNode(cuNode,
searchResult.getOffset(), searchResult.getOffset()
+ searchResult.getLength());
if (selectedNode == null)
return null;
return selectedNode;
}
public static Node findNode(Source cuNode, ISourceRange sourceRange) {
Node selectedNode = NodeFinder.findNode(cuNode,
sourceRange.getOffset(),
sourceRange.getOffset() + sourceRange.getLength());
if (selectedNode == null)
return null;
return selectedNode;
}
public static Node findEnclosingNode(Node node) {
while (true) {
node = (Node) node.eContainer();
if (node == null)
return null;
switch (node.eClass().getClassifierID()) {
case DomPackage.FUNCTION_EXPRESSION:
case DomPackage.GETTER_ASSIGNMENT:
case DomPackage.SETTER_ASSIGNMENT:
case DomPackage.SOURCE:
return node;
}
}
}
}