/*
* $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.mwe2.codebuilder.fragments;
import javax.inject.Inject;
import javax.inject.Provider;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtend2.lib.StringConcatenationClient;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.common.types.JvmParameterizedTypeReference;
import org.eclipse.xtext.common.types.JvmVoid;
import org.eclipse.xtext.common.types.TypesFactory;
import org.eclipse.xtext.common.types.access.IJvmTypeProvider;
import org.eclipse.xtext.resource.IFragmentProvider;
import org.eclipse.xtext.util.EmfFormatter;
import org.eclipse.xtext.util.Strings;
import org.eclipse.xtext.xbase.XExpression;
import org.eclipse.xtext.xbase.XFeatureCall;
import org.eclipse.xtext.xbase.lib.Procedures;
import org.eclipse.xtext.xbase.lib.Pure;
import org.eclipse.xtext.xtext.generator.model.GuiceModuleAccess.BindingFactory;
import org.eclipse.xtext.xtext.generator.model.JavaFileAccess;
import org.eclipse.xtext.xtext.generator.model.TypeReference;
import io.sarl.lang.mwe2.codebuilder.extractor.CodeElementExtractor;
/** Generator of the builder for formal parameters.
*
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
public class FormalParameterBuilderFragment extends AbstractSubCodeBuilderFragment {
/** Replies the implementation for the formal parameter builder.
*
* @return the implementation.
*/
@Pure
public TypeReference getFormalParameterBuilderImpl() {
return getCodeElementExtractor().getElementBuilderImpl("FormalParameter"); //$NON-NLS-1$
}
/** Replies the custom implementation for the formal parameter builder.
*
* @return the custom implementation.
*/
@Pure
public TypeReference getFormalParameterBuilderImplCustom() {
return getCodeElementExtractor().getElementBuilderImplCustom("FormalParameter"); //$NON-NLS-1$
}
@Override
public void generate() {
generateIFormalParameterBuilder();
generateFormalParameterBuilderImpl();
if (getCodeBuilderConfig().isISourceAppendableEnable()) {
generateFormalParameterAppender();
}
super.generate();
}
@Override
public void generateRuntimeBindings(BindingFactory factory) {
super.generateRuntimeBindings(factory);
bindTypeReferences(factory,
getFormalParameterBuilderInterface(),
getFormalParameterBuilderImpl(),
getFormalParameterBuilderImplCustom());
}
/** Generate the formal parameter builder interface.
*/
protected void generateIFormalParameterBuilder() {
final TypeReference builder = getFormalParameterBuilderInterface();
final StringConcatenationClient content = new StringConcatenationClient() {
@Override
protected void appendTo(TargetStringConcatenation it) {
it.append("/** Builder of a " + getLanguageName() //$NON-NLS-1$
+ " formal parameter."); //$NON-NLS-1$
it.newLine();
it.append(" */"); //$NON-NLS-1$
it.newLine();
it.append("@SuppressWarnings(\"all\")"); //$NON-NLS-1$
it.newLine();
it.append("public interface "); //$NON-NLS-1$
it.append(builder.getSimpleName());
it.append(" {"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
it.append(generateMembers(true, false));
it.append("}"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
}
};
final JavaFileAccess javaFile = getFileAccessFactory().createJavaFile(builder, content);
javaFile.writeTo(getSrcGen());
}
/** Generate the formal parameter builder implementation.
*/
protected void generateFormalParameterBuilderImpl() {
final TypeReference builderInterface = getFormalParameterBuilderInterface();
final TypeReference builder = getFormalParameterBuilderImpl();
final StringConcatenationClient content = new StringConcatenationClient() {
@Override
protected void appendTo(TargetStringConcatenation it) {
it.append("/** Builder of a " + getLanguageName() //$NON-NLS-1$
+ " formal parameter."); //$NON-NLS-1$
it.newLine();
it.append(" */"); //$NON-NLS-1$
it.newLine();
it.append("@SuppressWarnings(\"all\")"); //$NON-NLS-1$
it.newLine();
it.append("public class "); //$NON-NLS-1$
it.append(builder.getSimpleName());
it.append(" extends "); //$NON-NLS-1$
it.append(getAbstractBuilderImpl());
it.append(" implements "); //$NON-NLS-1$
it.append(builderInterface);
it.append(" {"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
it.append(generateMembers(false, false));
it.append("}"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
}
};
final JavaFileAccess javaFile = getFileAccessFactory().createJavaFile(builder, content);
javaFile.writeTo(getSrcGen());
}
/** Generate the formal parameter appender.
*/
protected void generateFormalParameterAppender() {
final CodeElementExtractor.ElementDescription parameter = getCodeElementExtractor().getFormalParameter();
final String accessor = "get" //$NON-NLS-1$
+ Strings.toFirstUpper(parameter.getElementType().getSimpleName()) + "()"; //$NON-NLS-1$
final TypeReference builderInterface = getFormalParameterBuilderInterface();
final TypeReference appender = getCodeElementExtractor().getElementAppenderImpl("FormalParameter"); //$NON-NLS-1$
final StringConcatenationClient content = new StringConcatenationClient() {
@Override
protected void appendTo(TargetStringConcatenation it) {
it.append("/** Appender of a " + getLanguageName() //$NON-NLS-1$
+ " formal parameter."); //$NON-NLS-1$
it.newLine();
it.append(" */"); //$NON-NLS-1$
it.newLine();
it.append("@SuppressWarnings(\"all\")"); //$NON-NLS-1$
it.newLine();
it.append("public class "); //$NON-NLS-1$
it.append(appender.getSimpleName());
it.append(" extends "); //$NON-NLS-1$
it.append(getCodeElementExtractor().getAbstractAppenderImpl());
it.append(" implements "); //$NON-NLS-1$
it.append(builderInterface);
it.append(" {"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
it.append(generateAppenderMembers(appender.getSimpleName(), builderInterface, accessor));
it.append(generateMembers(false, true));
it.append("}"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
}
};
final JavaFileAccess javaFile = getFileAccessFactory().createJavaFile(appender, content);
javaFile.writeTo(getSrcGen());
}
/** Generate the members of the builder.
*
* @param forInterface <code>true</code> if the code must be generated for an interface.
* @param forAppender <code>true</code> if the code must be generated for an appender.
* @return the code.
*/
@SuppressWarnings("checkstyle:all")
protected StringConcatenationClient generateMembers(boolean forInterface, boolean forAppender) {
final CodeElementExtractor.ElementDescription parameter = getCodeElementExtractor().getFormalParameter();
final FormalParameterDescription exparameter = new FormalParameterDescription(parameter,
findAssignmentFromFeatureName(parameter.getGrammarComponent(),
getCodeBuilderConfig().getParameterDefaultValueGrammarName()));
return new StringConcatenationClient() {
@Override
protected void appendTo(TargetStringConcatenation it) {
if (!forInterface && !forAppender) {
it.append("\t@"); //$NON-NLS-1$
it.append(Inject.class);
it.newLine();
it.append("\tprivate "); //$NON-NLS-1$
it.append(Provider.class);
it.append("<"); //$NON-NLS-1$
it.append(getExpressionBuilderInterface());
it.append("> expressionProvider;"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
it.append("\tprivate "); //$NON-NLS-1$
it.append(getCodeElementExtractor().getFormalParameterContainerType());
it.append(" context;"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
it.append("\tprivate "); //$NON-NLS-1$
it.append(parameter.getElementType());
it.append(" parameter;"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
it.append("\tprivate "); //$NON-NLS-1$
it.append(getExpressionBuilderInterface());
it.append(" defaultValue;"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
it.append("\t@"); //$NON-NLS-1$
it.append(Inject.class);
it.newLine();
it.append("\t\tprivate "); //$NON-NLS-1$
it.append(TypesFactory.class);
it.append(" jvmTypesFactory;"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
it.append("\t@"); //$NON-NLS-1$
it.append(Inject.class);
it.newLine();
it.append(" private "); //$NON-NLS-1$
it.append(IFragmentProvider.class);
it.append(" fragmentProvider;"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
} else {
it.append("\t/** Find the reference to the type with the given name."); //$NON-NLS-1$
it.newLine();
it.append("\t * @param typeName the fully qualified name of the type"); //$NON-NLS-1$
it.newLine();
it.append("\t * @return the type reference."); //$NON-NLS-1$
it.newLine();
it.append("\t */"); //$NON-NLS-1$
it.newLine();
it.append("\t"); //$NON-NLS-1$
if (!forInterface) {
it.append("public "); //$NON-NLS-1$
}
it.append(JvmParameterizedTypeReference.class);
it.append(" newTypeRef(String typeName)"); //$NON-NLS-1$
if (forInterface) {
it.append(";"); //$NON-NLS-1$
} else {
it.append(" {"); //$NON-NLS-1$
it.newLine();
it.append("\t\treturn this.builder.newTypeRef(typeName);"); //$NON-NLS-1$
it.newLine();
it.append("\t}"); //$NON-NLS-1$
}
it.newLineIfNotEmpty();
it.newLine();
it.append("\t/** Find the reference to the type with the given name."); //$NON-NLS-1$
it.newLine();
it.append("\t * @param context the context for the type reference use"); //$NON-NLS-1$
it.newLine();
it.append("\t * @param typeName the fully qualified name of the type"); //$NON-NLS-1$
it.newLine();
it.append("\t * @return the type reference."); //$NON-NLS-1$
it.newLine();
it.append("\t */"); //$NON-NLS-1$
it.newLine();
it.append("\t"); //$NON-NLS-1$
if (!forInterface) {
it.append("public "); //$NON-NLS-1$
}
it.append(JvmParameterizedTypeReference.class);
it.append(" newTypeRef("); //$NON-NLS-1$
it.append(Notifier.class);
it.append(" context, String typeName)"); //$NON-NLS-1$
if (forInterface) {
it.append(";"); //$NON-NLS-1$
} else {
it.append(" {"); //$NON-NLS-1$
it.newLine();
it.append("\t\treturn this.builder.newTypeRef(context, typeName);"); //$NON-NLS-1$
it.newLine();
it.append("\t}"); //$NON-NLS-1$
}
it.newLineIfNotEmpty();
it.newLine();
}
if (forInterface) {
it.append("\t/** Replies the context for type resolution."); //$NON-NLS-1$
it.newLine();
it.append("\t * @return the context or <code>null</code> if the Ecore object is the context."); //$NON-NLS-1$
it.newLine();
it.append("\t */"); //$NON-NLS-1$
it.newLine();
it.append("\t"); //$NON-NLS-1$
it.append(IJvmTypeProvider.class);
it.append(" getTypeResolutionContext();"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
} else if (forAppender) {
it.append("\tpublic "); //$NON-NLS-1$
it.append(IJvmTypeProvider.class);
it.append(" getTypeResolutionContext() {"); //$NON-NLS-1$
it.newLine();
it.append("\t\treturn this.builder.getTypeResolutionContext();"); //$NON-NLS-1$
it.newLine();
it.append("\t}"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
}
it.append("\t/** Initialize the formal parameter."); //$NON-NLS-1$
it.newLine();
it.append("\t * @param context - the context of the formal parameter."); //$NON-NLS-1$
it.newLine();
it.append("\t * @param name - the name of the formal parameter."); //$NON-NLS-1$
it.newLine();
it.append("\t */"); //$NON-NLS-1$
it.newLine();
it.append("\t"); //$NON-NLS-1$
if (!forInterface) {
it.append("public "); //$NON-NLS-1$
}
it.append("void eInit("); //$NON-NLS-1$
it.append(getCodeElementExtractor().getFormalParameterContainerType());
it.append(" context, String name, "); //$NON-NLS-1$
it.append(IJvmTypeProvider.class);
it.append(" typeContext)"); //$NON-NLS-1$
if (forInterface) {
it.append(";"); //$NON-NLS-1$
} else {
it.append(" {"); //$NON-NLS-1$
it.newLine();
if (forAppender) {
it.append("\t\tthis.builder.eInit(context, name, typeContext);"); //$NON-NLS-1$
} else {
it.append("\t\tsetTypeResolutionContext(typeContext);"); //$NON-NLS-1$
it.newLine();
it.append("\t\tthis.context = context;"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\tthis.parameter = "); //$NON-NLS-1$
it.append(getXFactoryFor(parameter.getElementType()));
it.append(".eINSTANCE.create"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(parameter.getElementType().getSimpleName()));
it.append("();"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\tthis.parameter.set"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterNameGrammarName()));
it.append("(name);"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\tthis.parameter.set"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterTypeGrammarName()));
it.append("(newTypeRef(this.context, Object.class.getName()));"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\tthis.context.get"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterListGrammarName()));
it.append("().add(this.parameter);"); //$NON-NLS-1$
}
it.newLine();
it.append("\t}"); //$NON-NLS-1$
}
it.newLineIfNotEmpty();
it.newLine();
it.append("\t/** Replies the created parameter."); //$NON-NLS-1$
it.newLine();
it.append("\t *"); //$NON-NLS-1$
it.newLine();
it.append("\t * @return the parameter."); //$NON-NLS-1$
it.newLine();
it.append("\t */"); //$NON-NLS-1$
it.newLine();
it.append("\t@"); //$NON-NLS-1$
it.append(Pure.class);
it.newLine();
it.append("\t"); //$NON-NLS-1$
if (!forInterface) {
it.append("public "); //$NON-NLS-1$
}
it.append(parameter.getElementType());
it.append(" get"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(parameter.getElementType().getSimpleName()));
it.append("()"); //$NON-NLS-1$
if (forInterface) {
it.append(";"); //$NON-NLS-1$
} else {
it.append(" {"); //$NON-NLS-1$
it.newLine();
if (forAppender) {
it.append("\t\treturn this.builder.get"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(parameter.getElementType().getSimpleName()));
it.append("();"); //$NON-NLS-1$
} else {
it.append("\t\treturn this.parameter;"); //$NON-NLS-1$
}
it.newLine();
it.append("\t}"); //$NON-NLS-1$
}
it.newLineIfNotEmpty();
it.newLine();
it.append("\t/** Replies the JvmIdentifiable that corresponds to the formal parameter."); //$NON-NLS-1$
it.newLine();
it.append("\t *"); //$NON-NLS-1$
it.newLine();
it.append("\t * @param container the feature call that is supposed to contains the replied identifiable element."); //$NON-NLS-1$
it.newLine();
it.append("\t */"); //$NON-NLS-1$
it.newLine();
it.append("\t"); //$NON-NLS-1$
if (!forInterface) {
it.append("public "); //$NON-NLS-1$
}
it.append("void setReferenceInto("); //$NON-NLS-1$
it.append(XFeatureCall.class);
it.append(" container) "); //$NON-NLS-1$
if (forInterface) {
it.append(";"); //$NON-NLS-1$
} else {
it.append("{"); //$NON-NLS-1$
it.newLine();
it.append("\t\t"); //$NON-NLS-1$
if (forAppender) {
it.append("this.builder.setReferenceInto(container);"); //$NON-NLS-1$
} else {
it.append(JvmVoid.class);
it.append(" jvmVoid = this.jvmTypesFactory.createJvmVoid();"); //$NON-NLS-1$
it.newLine();
it.append("\t\tif (jvmVoid instanceof "); //$NON-NLS-1$
it.append(InternalEObject.class);
it.append(") {"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\tfinal "); //$NON-NLS-1$
it.append(InternalEObject.class);
it.append("\t\t\tjvmVoidProxy = ("); //$NON-NLS-1$
it.append(InternalEObject.class);
it.append(") jvmVoid;"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\tfinal "); //$NON-NLS-1$
it.append(EObject.class);
it.append(" param = getSarlFormalParameter();"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\tfinal "); //$NON-NLS-1$
it.append(Resource.class);
it.append(" resource = param.eResource();"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\t// Get the derived object"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\tfinal "); //$NON-NLS-1$
it.append(parameter.getElementType());
it.append(" jvmParam = getAssociatedElement("); //$NON-NLS-1$
it.append(parameter.getElementType());
it.append(".class, param, resource);"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\t// Set the proxy URI"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\tfinal "); //$NON-NLS-1$
it.append(URI.class);
it.append(" uri = "); //$NON-NLS-1$
it.append(EcoreUtil2.class);
it.append(".getNormalizedURI(jvmParam);"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\tjvmVoidProxy.eSetProxyURI(uri);"); //$NON-NLS-1$
it.newLine();
it.append("\t\t}"); //$NON-NLS-1$
it.newLine();
it.append("\t\tcontainer.setFeature(jvmVoid);"); //$NON-NLS-1$
}
it.newLine();
it.append("\t}"); //$NON-NLS-1$
}
it.newLineIfNotEmpty();
it.newLine();
it.append("\t/** Replies the resource to which the formal parameter is attached."); //$NON-NLS-1$
it.newLine();
it.append("\t */"); //$NON-NLS-1$
it.newLine();
it.append("\t@"); //$NON-NLS-1$
it.append(Pure.class);
it.newLine();
it.append("\t"); //$NON-NLS-1$
if (!forInterface) {
it.append("public "); //$NON-NLS-1$
}
it.append(Resource.class);
it.append(" eResource()"); //$NON-NLS-1$
if (forInterface) {
it.append(";"); //$NON-NLS-1$
} else {
it.append(" {"); //$NON-NLS-1$
it.newLine();
it.append("\t\treturn get"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(parameter.getElementType().getSimpleName()));
it.append("().eResource();"); //$NON-NLS-1$
it.newLine();
it.append("\t}"); //$NON-NLS-1$
}
it.newLineIfNotEmpty();
it.newLine();
it.append("\t/** Change the type."); //$NON-NLS-1$
it.newLine();
it.append("\t *"); //$NON-NLS-1$
it.newLine();
it.append("\t * @param type the formal parameter type."); //$NON-NLS-1$
it.newLine();
it.append("\t */"); //$NON-NLS-1$
it.newLine();
it.append("\t"); //$NON-NLS-1$
if (!forInterface) {
it.append("public "); //$NON-NLS-1$
}
it.append("void set"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterTypeGrammarName()));
it.append("(String type)"); //$NON-NLS-1$
if (forInterface) {
it.append(";"); //$NON-NLS-1$
} else {
it.append(" {"); //$NON-NLS-1$
it.newLine();
if (forAppender) {
it.append("\t\tthis.builder.set"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterTypeGrammarName()));
it.append("(type);"); //$NON-NLS-1$
} else {
it.append("\t\tString typeName;"); //$NON-NLS-1$
it.newLine();
it.append("\t\tif ("); //$NON-NLS-1$
it.append(Strings.class);
it.append(".isEmpty(type)) {"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\ttypeName = Object.class.getName();"); //$NON-NLS-1$
it.newLine();
it.append("\t\t} else {"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\ttypeName = type;"); //$NON-NLS-1$
it.newLine();
it.append("\t\t}"); //$NON-NLS-1$
it.newLine();
it.append("\t\tthis.parameter.set"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterTypeGrammarName()));
it.append("(newTypeRef(this.context, typeName));"); //$NON-NLS-1$
}
it.newLine();
it.append("\t}"); //$NON-NLS-1$
}
it.newLineIfNotEmpty();
it.newLine();
if (!Strings.isEmpty(getCodeBuilderConfig().getParameterVarArgGrammarName())) {
it.append("\t/** Change the variadic property of the parameter."); //$NON-NLS-1$
it.newLine();
it.append("\t *"); //$NON-NLS-1$
it.newLine();
it.append("\t * @param isVariadic indicates if the parameter is variadic."); //$NON-NLS-1$
it.newLine();
it.append("\t */"); //$NON-NLS-1$
it.newLine();
it.append("\t"); //$NON-NLS-1$
if (!forInterface) {
it.append("public "); //$NON-NLS-1$
}
it.append("void set"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterVarArgGrammarName()));
it.append("(boolean isVariadic)"); //$NON-NLS-1$
if (forInterface) {
it.append(";"); //$NON-NLS-1$
} else {
it.append(" {"); //$NON-NLS-1$
it.newLine();
if (forAppender) {
it.append("\t\tthis.builder.set"); //$NON-NLS-1$
} else {
it.append("\t\tthis.parameter.set"); //$NON-NLS-1$
}
it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterVarArgGrammarName()));
it.append("(isVariadic);"); //$NON-NLS-1$
it.newLine();
it.append("\t}"); //$NON-NLS-1$
}
it.newLineIfNotEmpty();
it.newLine();
}
if (exparameter.getDefaultValueAssignment() != null) {
it.append("\t/** Replies the default value of the parameter."); //$NON-NLS-1$
it.newLine();
it.append("\t * @return the default value builder."); //$NON-NLS-1$
it.newLine();
it.append("\t */"); //$NON-NLS-1$
it.newLine();
it.append("\t@"); //$NON-NLS-1$
it.append(Pure.class);
it.newLine();
it.append("\t"); //$NON-NLS-1$
if (!forInterface) {
it.append("public "); //$NON-NLS-1$
}
it.append(getExpressionBuilderInterface());
final String accessor = "get" //$NON-NLS-1$
+ Strings.toFirstUpper(getCodeBuilderConfig().getParameterDefaultValueGrammarName())
+ "()"; //$NON-NLS-1$
it.append(" "); //$NON-NLS-1$
it.append(accessor);
if (forInterface) {
it.append(";"); //$NON-NLS-1$
} else {
it.append(" {"); //$NON-NLS-1$
it.newLine();
if (forAppender) {
it.append("\t\treturn this.builder.get"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterDefaultValueGrammarName()));
it.append("();"); //$NON-NLS-1$
} else {
it.append("\t\tif (this.defaultValue == null) {"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\tthis.defaultValue = this.expressionProvider.get();"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\tthis.defaultValue.eInit(this.parameter, new "); //$NON-NLS-1$
it.append(Procedures.class);
it.append(".Procedure1<"); //$NON-NLS-1$
it.append(XExpression.class);
it.append(">() {"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\t\t\tpublic void apply("); //$NON-NLS-1$
it.append(XExpression.class);
it.append(" it) {"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\t\t\t\tget"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(parameter.getElementType().getSimpleName()));
it.append("().set"); //$NON-NLS-1$
it.append(Strings.toFirstUpper(getCodeBuilderConfig().getParameterDefaultValueGrammarName()));
it.append("(it);"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\t\t\t}"); //$NON-NLS-1$
it.newLine();
it.append("\t\t\t\t}, getTypeResolutionContext());"); //$NON-NLS-1$
it.newLine();
it.append("\t\t}"); //$NON-NLS-1$
it.newLine();
it.append("\t\treturn this.defaultValue;"); //$NON-NLS-1$
}
it.newLine();
it.append("\t}"); //$NON-NLS-1$
}
it.newLineIfNotEmpty();
it.newLine();
if (!forAppender && !forInterface) {
it.append("\t@"); //$NON-NLS-1$
it.append(Override.class);
it.newLine();
it.append("\t@"); //$NON-NLS-1$
it.append(Pure.class);
it.newLine();
it.append("\tpublic "); //$NON-NLS-1$
it.append(String.class);
it.append(" toString() {"); //$NON-NLS-1$
it.newLine();
it.append("\t\treturn "); //$NON-NLS-1$
if (forAppender) {
it.append("this.builder.toString();"); //$NON-NLS-1$
} else {
it.append(EmfFormatter.class);
it.append(".objToStr("); //$NON-NLS-1$
it.append(accessor);
it.append(");"); //$NON-NLS-1$
}
it.newLine();
it.append("\t}"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
}
}
if (forInterface) {
it.append("\t/** Dispose the resource."); //$NON-NLS-1$
it.newLine();
it.append("\t */"); //$NON-NLS-1$
it.newLine();
it.append("\tvoid dispose();"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
} else if (forAppender) {
it.append("\t/** Dispose the resource."); //$NON-NLS-1$
it.newLine();
it.append("\t */"); //$NON-NLS-1$
it.newLine();
it.append("\tpublic void dispose() {"); //$NON-NLS-1$
it.newLine();
it.append("\t\tthis.builder.dispose();"); //$NON-NLS-1$
it.newLine();
it.append("\t}"); //$NON-NLS-1$
it.newLineIfNotEmpty();
it.newLine();
}
}
};
}
/** Description of a formal parameter.
*
* @author $Author: sgalland$
* @version $FullVersion$
* @mavengroupid $GroupId$
* @mavenartifactid $ArtifactId$
*/
public static class FormalParameterDescription {
private final CodeElementExtractor.ElementDescription element;
private final Assignment defaultValueAssignment;
/** Constructor.
*
* @param element the description of the element.
* @param defaultValueAssignment the assignement for the default value.
*/
public FormalParameterDescription(CodeElementExtractor.ElementDescription element, Assignment defaultValueAssignment) {
this.element = element;
this.defaultValueAssignment = defaultValueAssignment;
}
@Override
public String toString() {
return this.element.getName();
}
/** Replies the element description embedded in this top element description.
*
* @return the element description.
*/
public CodeElementExtractor.ElementDescription getElementDescription() {
return this.element;
}
/** Replies the assignment for the parameter's default value.
*
* @return the default value parameter assignment.
*/
public Assignment getDefaultValueAssignment() {
return this.defaultValueAssignment;
}
}
}