Skip to content

Commit

Permalink
[ui] Generates the type parameters into the auto-generated methods.
Browse files Browse the repository at this point in the history
see #726

Signed-off-by: Stéphane Galland <galland@arakhne.org>
  • Loading branch information
gallandarakhneorg committed Sep 3, 2017
1 parent 6f049da commit e58379c
Showing 1 changed file with 46 additions and 0 deletions.
Expand Up @@ -21,16 +21,23 @@

package io.sarl.lang.ui.compilation.codebuilder;

import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import javax.inject.Inject;

import com.google.common.collect.Iterables;
import org.eclipse.xtend.core.xtend.XtendPackage;
import org.eclipse.xtend.ide.codebuilder.AbstractParameterBuilder;
import org.eclipse.xtend.ide.codebuilder.XtendMethodBuilder;
import org.eclipse.xtext.common.types.JvmTypeParameter;
import org.eclipse.xtext.common.types.JvmUpperBound;
import org.eclipse.xtext.common.types.JvmVisibility;
import org.eclipse.xtext.xbase.compiler.ISourceAppender;
import org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReference;
import org.eclipse.xtext.xbase.typesystem.references.StandardTypeReferenceOwner;
import org.eclipse.xtext.xbase.typesystem.util.CommonTypeComputationServices;

import io.sarl.lang.compilation.jvmmodel.IDefaultVisibilityProvider;
import io.sarl.lang.services.SARLGrammarKeywordAccess;
Expand All @@ -54,6 +61,9 @@ public class SarlMethodBuilder extends XtendMethodBuilder {
@Inject
private IDefaultVisibilityProvider visiblityProvider;

@Inject
private CommonTypeComputationServices services;

@Override
public ISourceAppender build(ISourceAppender appendable) {
final JvmVisibility defaultVisibility = this.visiblityProvider.getDefaultJvmVisibility(getOwner(),
Expand All @@ -79,13 +89,49 @@ public ISourceAppender build(ISourceAppender appendable) {
appendable.append(" "); //$NON-NLS-1$
appendType(appendable, retType, void.class.getSimpleName());
}
appendTypeParameters(appendable, getTypeParameters());
appendThrowsClause(appendable);
if (!isAbstractFlag()) {
appendBody(appendable, ""); //$NON-NLS-1$
}
return appendable;
}

@Override
protected ISourceAppender appendTypeParameters(ISourceAppender appendable, List<JvmTypeParameter> typeParameters) {
final Iterator<JvmTypeParameter> iterator = typeParameters.iterator();
if (iterator.hasNext()) {
appendable.append(" ").append(this.keywords.getWithKeyword()).append(" "); //$NON-NLS-1$//$NON-NLS-2$
final String objectId = Object.class.getName();
do {
final JvmTypeParameter typeParameter = iterator.next();
appendable.append(this.keywords.protectKeyword(typeParameter.getName()));
final Iterable<JvmUpperBound> upperBounds =
Iterables.filter(Iterables.filter(typeParameter.getConstraints(), JvmUpperBound.class),
(it) -> !it.getTypeReference().getIdentifier().equals(objectId));
final Iterator<JvmUpperBound> iterator2 = upperBounds.iterator();
if (iterator2.hasNext()) {
appendable.append(" ").append(this.keywords.getExtendsKeyword()).append(" "); //$NON-NLS-1$ //$NON-NLS-2$
boolean isFirst = true;
final StandardTypeReferenceOwner owner = new StandardTypeReferenceOwner(this.services, getContext());
for (final JvmUpperBound upperBound: upperBounds) {
if (!isFirst) {
appendable.append(" ").append(this.keywords.getAmpersandKeyword()).append(" "); //$NON-NLS-1$ //$NON-NLS-2$
}
isFirst = false;
appendType(appendable,
owner.toLightweightTypeReference(upperBound.getTypeReference()),
Object.class.getSimpleName());
}
}
if (iterator.hasNext()) {
appendable.append(this.keywords.getCommaKeyword()).append(" "); //$NON-NLS-1$
}
} while (iterator.hasNext());
}
return appendable;
}

@Override
protected ISourceAppender appendParameters(ISourceAppender appendable) {
final List<AbstractParameterBuilder> builders = getParameterBuilders();
Expand Down

0 comments on commit e58379c

Please sign in to comment.