use of org.eclipse.xtext.common.types.JvmTypeReference in project xtext-xtend by eclipse.
the class XtendHoverSignatureProvider method _signature.
protected String _signature(XtendFunction function, boolean typeAtEnd) {
JvmOperation inferredOperation = associations.getDirectlyInferredOperation(function);
if (inferredOperation != null) {
String returnTypeString = "void";
JvmTypeReference returnType = inferredOperation.getReturnType();
if (returnType != null) {
if (returnType instanceof JvmAnyTypeReference) {
throw new IllegalStateException();
} else {
returnTypeString = getTypeName(returnType);
}
}
StringBuilder signature = new StringBuilder();
String typeParameter = uiStrings.typeParameters(function.getTypeParameters());
if (typeParameter != null && typeParameter.length() > 0) {
signature.append(typeParameter).append(" ");
}
signature.append(returnTypeString).append(" ");
signature.append(function.getName()).append(hoverUiStrings.parameters(inferredOperation));
signature.append(getThrowsDeclaration(inferredOperation));
return signature.toString();
}
return function.getName() + "()";
}
use of org.eclipse.xtext.common.types.JvmTypeReference in project xtext-xtend by eclipse.
the class XtendUIValidationTests method testParameterizedTypeReference.
@Test
public void testParameterizedTypeReference() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class Foo {");
_builder.newLine();
_builder.append("\t");
_builder.append("def bar(org.eclipse.xtend.core.tests.restricted.RestrictedClass<org.eclipse.xtend.core.tests.internal.InternalClass> x) {}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
final XtendFile xtendFile = this.testHelper.xtendFile("Clazz.xtend", _builder.toString());
XtendMember _head = IterableExtensions.<XtendMember>head(IterableExtensions.<XtendClass>head(Iterables.<XtendClass>filter(xtendFile.getXtendTypes(), XtendClass.class)).getMembers());
final XtendFunction function = ((XtendFunction) _head);
final XtendParameter parameter = function.getParameters().get(0);
JvmTypeReference _parameterType = parameter.getParameterType();
final JvmParameterizedTypeReference type = ((JvmParameterizedTypeReference) _parameterType);
final JvmTypeReference typeParameter = type.getArguments().get(0);
this.helper.assertError(type, TypesPackage.Literals.JVM_PARAMETERIZED_TYPE_REFERENCE, org.eclipse.xtext.xbase.validation.IssueCodes.FORBIDDEN_REFERENCE);
this.helper.assertWarning(typeParameter, TypesPackage.Literals.JVM_TYPE_REFERENCE, org.eclipse.xtext.xbase.validation.IssueCodes.DISCOURAGED_REFERENCE);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
use of org.eclipse.xtext.common.types.JvmTypeReference in project xtext-xtend by eclipse.
the class XtendReentrantTypeResolver method doPrepareLocalTypes.
protected void doPrepareLocalTypes(final ResolvedTypes resolvedTypes, IFeatureScopeSession featureScopeSession, JvmFeature container, Map<JvmIdentifiableElement, ResolvedTypes> resolvedTypesByContext) {
List<JvmGenericType> localClasses = container.getLocalClasses();
for (final JvmGenericType localClass : localClasses) {
JvmTypeReference superType = localClass.getSuperTypes().get(0);
final IFeatureScopeSession nestedSession = featureScopeSession;
if (InferredTypeIndicator.isInferred(superType)) {
final XComputedTypeReference casted = (XComputedTypeReference) superType;
InferredTypeIndicator typeProvider = (InferredTypeIndicator) casted.getTypeProvider();
final AnonymousClass anonymousClass = (AnonymousClass) typeProvider.getExpression();
XConstructorCall constructorCall = anonymousClass.getConstructorCall();
IScope typeScope = featureScopeSession.getScope(constructorCall, TypesPackage.Literals.JVM_PARAMETERIZED_TYPE_REFERENCE__TYPE, resolvedTypes);
final JvmDeclaredType type = anonymousClassUtil.getSuperTypeNonResolving(anonymousClass, typeScope);
if (type == null) {
JvmUnknownTypeReference superTypeReference = TypesFactory.eINSTANCE.createJvmUnknownTypeReference();
requestCapturedLocalVariables(superTypeReference, localClass, resolvedTypes, resolvedTypesByContext, new IAcceptor<JvmTypeReference>() {
@Override
public void accept(JvmTypeReference capturingTypeReference) {
casted.setEquivalent(capturingTypeReference);
inferAnonymousClassConstructor(anonymousClass, localClass);
}
});
} else {
final JvmParameterizedTypeReference superTypeReference = createSuperTypeReference(type, constructorCall);
requestCapturedLocalVariables(superTypeReference, localClass, resolvedTypes, resolvedTypesByContext, new IAcceptor<JvmTypeReference>() {
@Override
@SuppressWarnings("deprecation")
public void accept(JvmTypeReference capturingTypeReference) {
casted.setEquivalent(capturingTypeReference);
IFeatureScopeSession mySession = addThisAndSuper(nestedSession, resolvedTypes.getReferenceOwner(), localClass, superTypeReference, false);
if (type.eClass() == TypesPackage.Literals.JVM_GENERIC_TYPE && ((JvmGenericType) type).isInterface()) {
localClass.getSuperTypes().add(0, typesBuilder.newTypeRef(localClass, Object.class));
inferAnonymousClassConstructor(anonymousClass, localClass);
} else {
for (JvmMember superMember : type.getMembers()) {
if (superMember instanceof JvmConstructor) {
JvmConstructor superTypeConstructor = (JvmConstructor) superMember;
boolean visible = mySession.isVisible(superTypeConstructor);
inferAnonymousClassConstructor(anonymousClass, localClass, superTypeConstructor, visible);
}
}
}
}
});
}
}
}
}
use of org.eclipse.xtext.common.types.JvmTypeReference in project xtext-xtend by eclipse.
the class XtendReentrantTypeResolver method createSuperTypeReference.
protected JvmParameterizedTypeReference createSuperTypeReference(JvmType superType, XConstructorCall constructorCall) {
JvmParameterizedTypeReference result = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
result.setType(superType);
for (JvmTypeReference typeReference : constructorCall.getTypeArguments()) {
result.getArguments().add(typesBuilder.cloneWithProxies(typeReference));
}
return result;
}
use of org.eclipse.xtext.common.types.JvmTypeReference in project xtext-xtend by eclipse.
the class XtendReentrantTypeResolver method inferAnonymousClassConstructor.
protected JvmConstructor inferAnonymousClassConstructor(AnonymousClass anonymousClass, JvmGenericType inferredLocalClass, JvmConstructor superConstructor, boolean visible) {
JvmConstructor constructor = TypesFactory.eINSTANCE.createJvmConstructor();
inferredLocalClass.getMembers().add(constructor);
associator.associatePrimary(anonymousClass.getConstructorCall(), constructor);
if (visible) {
constructor.setVisibility(JvmVisibility.DEFAULT);
} else
constructor.setVisibility(JvmVisibility.PRIVATE);
constructor.setSimpleName(inferredLocalClass.getSimpleName());
constructor.setVarArgs(superConstructor.isVarArgs());
final List<JvmFormalParameter> parameters = superConstructor.getParameters();
for (JvmFormalParameter parameter : parameters) {
// trigger name computation
parameter.getName();
constructor.getParameters().add(typesBuilder.cloneWithProxies(parameter));
}
for (JvmTypeReference exception : superConstructor.getExceptions()) constructor.getExceptions().add(typesBuilder.cloneWithProxies(exception));
if (!parameters.isEmpty()) {
typesBuilder.setBody(constructor, new Procedures.Procedure1<ITreeAppendable>() {
@Override
public void apply(ITreeAppendable a) {
a.append("super(");
for (int i = 0; i < parameters.size(); i++) {
if (i != 0) {
a.append(", ");
}
a.append(parameters.get(i).getSimpleName());
}
a.append(");");
}
});
}
return constructor;
}
Aggregations