blob: 28cb862ef2d4244e3a56ccb73e2fe54f86601d8e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2017 NumberFour AG and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* 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;
}
}