/*
* This file is part of Skript.
*
* Skript is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Skript is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Skript. If not, see <http://www.gnu.org/licenses/>.
*
*
* Copyright 2011-2014 Peter Güttinger
*
*/
package ch.njol.skript.lang;
import java.lang.reflect.Array;
import org.eclipse.jdt.annotation.Nullable;
import ch.njol.skript.lang.util.SimpleLiteral;
import ch.njol.skript.util.Utils;
/**
* A list of literals. Can contain {@link UnparsedLiteral}s.
*
* @author Peter Güttinger
*/
public class LiteralList<T> extends ExpressionList<T> implements Literal<T> {
public LiteralList(final Literal<? extends T>[] literals, final Class<T> returnType, final boolean and) {
super(literals, returnType, and);
}
public LiteralList(final Literal<? extends T>[] literals, final Class<T> returnType, final boolean and, final LiteralList<?> source) {
super(literals, returnType, and, source);
}
@SuppressWarnings("null")
@Override
public T[] getArray() {
return getArray(null);
}
@SuppressWarnings("null")
@Override
public T getSingle() {
return getSingle(null);
}
@SuppressWarnings("null")
@Override
public T[] getAll() {
return getAll(null);
}
@SuppressWarnings("unchecked")
@Override
@Nullable
public <R> Literal<? extends R> getConvertedExpression(final Class<R>... to) {
final Literal<? extends R>[] exprs = new Literal[expressions.length];
final Class<?>[] classes = new Class[expressions.length];
for (int i = 0; i < exprs.length; i++) {
if ((exprs[i] = (Literal<? extends R>) expressions[i].getConvertedExpression(to)) == null)
return null;
classes[i] = exprs[i].getReturnType();
}
return new LiteralList<R>(exprs, (Class<R>) Utils.getSuperType(classes), and, this);
}
@Override
public Literal<? extends T>[] getExpressions() {
return (Literal<? extends T>[]) super.getExpressions();
}
@Override
public Expression<T> simplify() {
boolean isSimpleList = true;
for (int i = 0; i < expressions.length; i++)
isSimpleList &= expressions[i].isSingle();
if (isSimpleList) {
@SuppressWarnings("unchecked")
final T[] values = (T[]) Array.newInstance(getReturnType(), expressions.length);
for (int i = 0; i < values.length; i++)
values[i] = ((Literal<? extends T>) expressions[i]).getSingle();
return new SimpleLiteral<T>(values, getReturnType(), and);
}
return this;
}
}