blob: 49fb313d95937c9c5d6a4ec08f4580fa40868998 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2013 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ant.internal.ui.editor;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.ant.internal.ui.editor.text.XMLTextHover;
import org.eclipse.ant.internal.ui.model.AntElementNode;
import org.eclipse.ant.internal.ui.model.AntModel;
import org.eclipse.ant.internal.ui.model.IAntElement;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Position;
public class OccurrencesFinder {
private AntModel fAntModel;
private AntEditor fEditor;
private int fOffset;
private IDocument fDocument;
public OccurrencesFinder(AntEditor editor, AntModel model, IDocument document, int offset) {
fAntModel = model;
fEditor = editor;
fDocument = document;
fOffset = offset;
}
public List<Position> perform() {
if (fOffset == 0 || fAntModel == null) {
return null;
}
AntElementNode container = fAntModel.getNode(fOffset, false);
if (container == null) {
return null;
}
IRegion region = XMLTextHover.getRegion(fEditor.getViewer(), fOffset);
if (region != null) {
if (!container.isRegionPotentialReference(region)) {
return null;
}
}
AntElementNode node;
if (container.isFromDeclaration(region)) {
node = container;
} else {
Object potentialNode = fEditor.findTarget(region);
if (!(potentialNode instanceof AntElementNode)) {
return null;
}
node = (AntElementNode) potentialNode;
}
String occurrencesIdentifier = node.getOccurrencesIdentifier();
if (occurrencesIdentifier == null) {
return null;
}
List<IAntElement> nodes = new ArrayList<>(1);
nodes.add(fAntModel.getProjectNode());
List<IAntElement> usages = new ArrayList<>();
usages.add(node);
scanNodesForOccurrences(nodes, usages, occurrencesIdentifier);
String identifier;
try {
identifier = fDocument.get(region.getOffset(), region.getLength());
}
catch (BadLocationException e) {
return null;
}
int length = identifier.length();
if (length == 0) {
return null;
}
List<Position> positions = new ArrayList<>(usages.size());
for (IAntElement currentNode : usages) {
List<Integer> offsets = currentNode.computeIdentifierOffsets(identifier);
if (offsets != null) {
for (int i = 0; i < offsets.size(); i++) {
positions.add(new Position(offsets.get(i).intValue(), length));
}
}
}
return positions;
}
private void scanNodesForOccurrences(List<IAntElement> nodes, List<IAntElement> usages, String identifier) {
for (IAntElement node : nodes) {
if (!usages.contains(node) && node.containsOccurrence(identifier)) {
usages.add(node);
}
if (node.hasChildren()) {
scanNodesForOccurrences(node.getChildNodes(), usages, identifier);
}
}
}
}