blob: 8bbba54bdbe9fa2e229ef5e786ff15f331386fe8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2017 NumberFour AG and others.
*
* 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:
* NumberFour AG - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.internal.core;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.Assert;
import org.eclipse.dltk.annotations.Nullable;
import org.eclipse.dltk.core.ICodeSelection;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.ISourceRange;
import org.eclipse.dltk.utils.ArrayIterator;
import org.eclipse.dltk.utils.MultiArrayIterator;
/**
* Default implementation of {@link ICodeSelection}.
*/
class CodeSelection implements ICodeSelection {
@Nullable
private final IModelElement[] modelElements;
@Nullable
private final Object[] foreignElements;
@Nullable
private final Map<Object, ISourceRange> ranges;
public CodeSelection(IModelElement[] modelElements,
Object[] foreignElements, Map<Object, ISourceRange> ranges) {
Assert.isLegal(modelElements != null || foreignElements != null);
if (modelElements != null) {
Assert.isLegal(modelElements.length != 0);
}
if (foreignElements != null) {
Assert.isLegal(foreignElements.length != 0);
}
this.modelElements = modelElements;
this.foreignElements = foreignElements;
this.ranges = ranges;
}
@Override
public int size() {
return (modelElements != null ? modelElements.length : 0)
+ (foreignElements != null ? foreignElements.length : 0);
}
@Override
public Object[] toArray() {
if (modelElements != null && foreignElements == null) {
return modelElements;
} else if (modelElements == null && foreignElements != null) {
return foreignElements;
} else {
final Object[] result = new Object[modelElements.length
+ foreignElements.length];
System.arraycopy(modelElements, 0, result, 0, modelElements.length);
System.arraycopy(foreignElements, 0, result, modelElements.length,
foreignElements.length);
return result;
}
}
@Override
public List<Object> toList() {
if (modelElements != null && foreignElements == null) {
return Arrays.asList((Object[]) modelElements);
} else if (modelElements == null && foreignElements != null) {
return Arrays.asList(foreignElements);
} else {
final List<Object> result = new ArrayList<>(
modelElements.length + foreignElements.length);
Collections.addAll(result, modelElements);
Collections.addAll(result, foreignElements);
return result;
}
}
@Override
public Iterator<Object> iterator() {
if (modelElements != null && foreignElements == null) {
return new ArrayIterator<>(modelElements);
} else if (modelElements == null && foreignElements != null) {
return new ArrayIterator<>(foreignElements);
} else {
return new MultiArrayIterator<>(modelElements,
foreignElements);
}
}
@Override
public List<IModelElement> getModelElements() {
return modelElements != null ? Arrays.asList(modelElements)
: Collections.<IModelElement> emptyList();
}
@Override
public ISourceRange rangeOf(Object element) {
return ranges != null ? ranges.get(element) : null;
}
}