use of org.eclipse.xtext.util.ITextRegion in project xtext-core by eclipse.
the class RegionDiffFormatter method collectRegionsToFormat.
protected Collection<ITextRegion> collectRegionsToFormat(ITextRegionAccessDiff regions) {
List<ITextRegion> result = Lists.newArrayList();
for (ITextSegmentDiff diff : regions.getRegionDifferences()) {
int offset = diff.getModifiedFirstRegion().getOffset();
int length = diff.getModifiedLastRegion().getEndOffset() - offset;
ITextSegment region = regions.regionForOffset(offset, length);
result.add(region);
}
return result;
}
use of org.eclipse.xtext.util.ITextRegion in project xtext-core by eclipse.
the class DefaultFoldingRangeProvider method buildSignificantRegion.
protected ITextRegion buildSignificantRegion(ITextRegion significantRegion, INode node) {
if (significantRegion == null || node == null) {
return null;
}
int offset = significantRegion.getOffset();
int endOffset = significantRegion.getOffset() + significantRegion.getLength();
int startLine;
int endLine;
if (significantRegion instanceof ITextRegionWithLineInformation) {
ITextRegionWithLineInformation lineInfoRegion = (ITextRegionWithLineInformation) significantRegion;
startLine = lineInfoRegion.getLineNumber() + 1;
endLine = lineInfoRegion.getEndLineNumber() + 1;
} else {
startLine = NodeModelUtils.getLineAndColumn(node, offset).getLine();
endLine = NodeModelUtils.getLineAndColumn(node, endOffset).getLine();
}
if (startLine != endLine) {
/*
* The Eclipse IDE can only use the significant region if it starts and ends on the same line.
* Therefore, we here calculate the index of the end of the line.
*/
for (int index = offset; index < endOffset; index++) {
LineAndColumn lineInfo = NodeModelUtils.getLineAndColumn(node, index);
if (lineInfo.getLine() != startLine) {
return new TextRegion(offset, index - offset - 1);
}
}
}
return significantRegion;
}
use of org.eclipse.xtext.util.ITextRegion in project xtext-core by eclipse.
the class HoverService method createContext.
protected HoverContext createContext(Document document, XtextResource resource, int offset) {
EObject crossLinkedEObject = eObjectAtOffsetHelper.resolveCrossReferencedElementAt(resource, offset);
if (crossLinkedEObject != null) {
if (crossLinkedEObject.eIsProxy()) {
return null;
}
IParseResult parseResult = resource.getParseResult();
if (parseResult == null) {
return null;
}
ILeafNode leafNode = NodeModelUtils.findLeafNodeAtOffset(parseResult.getRootNode(), offset);
if (leafNode != null && leafNode.isHidden() && leafNode.getOffset() == offset) {
leafNode = NodeModelUtils.findLeafNodeAtOffset(parseResult.getRootNode(), offset - 1);
}
if (leafNode == null) {
return null;
}
ITextRegion leafRegion = leafNode.getTextRegion();
return new HoverContext(document, resource, offset, leafRegion, crossLinkedEObject);
}
EObject element = eObjectAtOffsetHelper.resolveElementAt(resource, offset);
if (element == null) {
return null;
}
ITextRegion region = locationInFileProvider.getSignificantTextRegion(element);
return new HoverContext(document, resource, offset, region, element);
}
use of org.eclipse.xtext.util.ITextRegion in project xtext-core by eclipse.
the class DefaultDocumentHighlightService method getDocumentHighlights.
public List<DocumentHighlight> getDocumentHighlights(final XtextResource resource, final int offset) {
if (resource == null) {
if (LOGGER.isDebugEnabled()) {
LOGGER.warn("Resource was null.");
}
return emptyList();
}
final URI uri = resource.getURI();
if (offset < 0) {
if (LOGGER.isDebugEnabled()) {
LOGGER.warn("Invalid offset argument. Offset must be a non-negative integer for resource: " + uri);
}
return emptyList();
}
final IParseResult parseResult = resource.getParseResult();
if (parseResult == null) {
if (LOGGER.isDebugEnabled()) {
LOGGER.warn("Parse result was null for resource: " + uri);
}
return emptyList();
}
final ICompositeNode rootNode = parseResult.getRootNode();
final String docContent = rootNode.getText();
final int docLength = docContent.length();
if (offset >= docLength) {
if (LOGGER.isDebugEnabled()) {
LOGGER.warn("Offset exceeds document lenght. Document was " + docLength + " and offset was: " + offset + " for resource: " + uri);
}
return emptyList();
}
final EObject selectedElement = offsetHelper.resolveElementAt(resource, offset);
if (!isDocumentHighlightAvailableFor(selectedElement, resource, offset)) {
return emptyList();
}
final Supplier<Document> docSupplier = Suppliers.memoize(() -> new Document(UNUSED_VERSION, docContent));
Iterable<URI> targetURIs = getTargetURIs(selectedElement);
if (!(targetURIs instanceof TargetURIs)) {
final TargetURIs result = targetURIsProvider.get();
result.addAllURIs(targetURIs);
targetURIs = result;
}
final Builder<DocumentHighlight> resultBuilder = ImmutableList.<DocumentHighlight>builder();
final Acceptor acceptor = (Acceptor2) (source, sourceURI, eReference, index, targetOrProxy, targetURI) -> {
final ITextRegion region = locationInFileProvider.getSignificantTextRegion(source, eReference, index);
if (!isNullOrEmpty(region)) {
resultBuilder.add(textRegionTransformer.apply(docSupplier.get(), region, DocumentHighlightKind.Read));
}
};
referenceFinder.findReferences((TargetURIs) targetURIs, resource, acceptor, new NullProgressMonitor());
if (resource.equals(selectedElement.eResource())) {
final ITextRegion region = locationInFileProvider.getSignificantTextRegion(selectedElement);
if (!isNullOrEmpty(region)) {
resultBuilder.add(textRegionTransformer.apply(docSupplier.get(), region, DocumentHighlightKind.Write));
}
}
return FluentIterable.from(resultBuilder.build()).toSortedList(comparator);
}
use of org.eclipse.xtext.util.ITextRegion in project xtext-core by eclipse.
the class DocumentExtensions method newLocation.
public Location newLocation(EObject object) {
Resource resource = object.eResource();
ITextRegion textRegion = locationInFileProvider.getSignificantTextRegion(object);
return newLocation(resource, textRegion);
}
Aggregations