/* * $Id$ * * SARL is an general-purpose agent programming language. * More details on http://www.sarl.io * * Copyright (C) 2014-2017 the original authors or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.sarl.lang.actionprototype; import java.util.Iterator; import java.util.List; import java.util.Map; import com.google.common.base.Strings; /** * Provides additional function signatures according the semantic * associated to the parameter's default values. * * @author $Author: sgalland$ * @version $FullVersion$ * @mavengroupid $GroupId$ * @mavenartifactid $ArtifactId$ */ public class DefaultInferredPrototype implements InferredPrototype { private final List<InferredStandardParameter> originalParameters; private final Map<ActionParameterTypes, List<InferredStandardParameter>> inferredParameters; private final FormalParameterProvider parameters; private final ActionParameterTypes parameterKey; private final QualifiedActionName key; /** * @param key - key used to store this signature into a {@link IActionPrototypeProvider}. * @param parameters - list of formal parameters. * @param parameterKey - key for the formal parameters. * @param originalParameters - original parameters. * @param inferredParameters - list of inferred parameters. */ protected DefaultInferredPrototype( QualifiedActionName key, FormalParameterProvider parameters, ActionParameterTypes parameterKey, List<InferredStandardParameter> originalParameters, Map<ActionParameterTypes, List<InferredStandardParameter>> inferredParameters) { this.key = key; this.parameters = parameters; this.parameterKey = parameterKey; this.originalParameters = originalParameters; this.inferredParameters = inferredParameters; } @Override public QualifiedActionName getActionName() { return this.key; } @Override public Map<ActionParameterTypes, List<InferredStandardParameter>> getInferredParameterTypes() { return this.inferredParameters; } @Override public List<InferredStandardParameter> getOriginalParameterTypes() { return this.originalParameters; } @Override public FormalParameterProvider getFormalParameters() { return this.parameters; } @Override public ActionParameterTypes getFormalParameterTypes() { return this.parameterKey; } @Override public boolean isVarargs() { return this.parameterKey.isVarArg(); } @Override public Iterable<ActionParameterTypes> getParameterTypeAlternatives() { return new Iterable<ActionParameterTypes>() { @Override public Iterator<ActionParameterTypes> iterator() { return new SignatureKeyIterator( getFormalParameterTypes(), getInferredParameterTypes().keySet().iterator()); } }; } private void toParameterString(StringBuilder buffer, int param, boolean isVarArg) { final String name = this.parameters.getFormalParameterName(param); buffer.append((!Strings.isNullOrEmpty(name)) ? name : null); buffer.append(" : "); //$NON-NLS-1$ final String type = this.parameters.getFormalParameterType(param, isVarArg); buffer.append((!Strings.isNullOrEmpty(type)) ? type : null); } private void toParameterString(StringBuilder buffer) { if (this.parameters.getFormalParameterCount() > 0) { final int lastParamIndex = this.parameters.getFormalParameterCount() - 1; for (int i = 0; i < lastParamIndex; ++i) { toParameterString(buffer, i, false); buffer.append(", "); //$NON-NLS-1$ } toParameterString(buffer, lastParamIndex, isVarargs()); } } @Override public String toString() { final StringBuilder b = new StringBuilder(); toParameterString(b); return b.toString(); } @Override public String toString(String functionName) { final StringBuilder b = new StringBuilder(); b.append(functionName); if (this.parameters.getFormalParameterCount() > 0) { b.append("("); //$NON-NLS-1$ toParameterString(b); b.append(")"); //$NON-NLS-1$ } return b.toString(); } /** Iterator of the types of the action parameters. * * @author $Author: sgalland$ * @version $FullVersion$ * @mavengroupid $GroupId$ * @mavenartifactid $ArtifactId$ */ private static class SignatureKeyIterator implements Iterator<ActionParameterTypes> { private ActionParameterTypes first; private final Iterator<ActionParameterTypes> it; SignatureKeyIterator(ActionParameterTypes first, Iterator<ActionParameterTypes> it) { this.first = first; this.it = it; } @Override public boolean hasNext() { return this.first != null || this.it.hasNext(); } @Override public ActionParameterTypes next() { if (this.first != null) { final ActionParameterTypes first = this.first; this.first = null; return first; } return this.it.next(); } @Override public void remove() { throw new UnsupportedOperationException(); } } }