/* * 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-2013 Peter Güttinger * */ package ch.njol.skript.lang.function; import org.eclipse.jdt.annotation.Nullable; import ch.njol.skript.Skript; import ch.njol.skript.classes.ClassInfo; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ParseContext; import ch.njol.skript.lang.SkriptParser; import ch.njol.skript.lang.Variable; import ch.njol.skript.lang.VariableString; import ch.njol.skript.lang.util.SimpleLiteral; import ch.njol.skript.log.RetainingLogHandler; import ch.njol.skript.log.SkriptLogger; import ch.njol.skript.util.Utils; public final class Parameter<T> { final String name; final ClassInfo<T> type; @Nullable final Expression<? extends T> def; final boolean single; public Parameter(final String name, final ClassInfo<T> type, final boolean single, final @Nullable Expression<? extends T> def) { this.name = name; this.type = type; this.def = def; this.single = single; } public ClassInfo<T> getType() { return type; } @SuppressWarnings("unchecked") @Nullable public static <T> Parameter<T> newInstance(final String name, final ClassInfo<T> type, final boolean single, final @Nullable String def) { if (!Variable.isValidVariableName(name, false, false)) { Skript.error("An argument's name must be a valid variable name, and cannot be a list variable."); return null; } Expression<? extends T> d = null; if (def != null) { // if (def.startsWith("%") && def.endsWith("%")) { // final RetainingLogHandler log = SkriptLogger.startRetainingLog(); // try { // d = new SkriptParser("" + def.substring(1, def.length() - 1), SkriptParser.PARSE_EXPRESSIONS, ParseContext.FUNCTION_DEFAULT).parseExpression(type.getC()); // if (d == null) { // log.printErrors("Can't understand this expression: " + def + ""); // return null; // } // log.printLog(); // } finally { // log.stop(); // } // } else { final RetainingLogHandler log = SkriptLogger.startRetainingLog(); try { if (type.getC() == String.class) { if (def.startsWith("\"") && def.endsWith("\"")) d = (Expression<? extends T>) VariableString.newInstance("" + def.substring(1, def.length() - 1)); else d = (Expression<? extends T>) new SimpleLiteral<String>(def, false); } else { d = new SkriptParser(def, SkriptParser.PARSE_LITERALS, ParseContext.DEFAULT).parseExpression(type.getC()); } if (d == null) { log.printErrors("'" + def + "' is not " + type.getName().withIndefiniteArticle()); return null; } log.printLog(); } finally { log.stop(); } // } } return new Parameter<T>(name, type, single, d); } @Override public String toString() { return name + ": " + Utils.toEnglishPlural(type.getCodeName(), !single) + (def != null ? " = " + def.toString(null, true) : ""); } }