use of org.eclipse.xtext.common.types.JvmType in project xtext-xtend by eclipse.
the class AnonymousClassUtil method getSuperType.
/* @Nullable */
public JvmGenericType getSuperType(AnonymousClass anonymousClass) {
JvmConstructor constructor = anonymousClass.getConstructorCall().getConstructor();
if (constructor != null && !constructor.eIsProxy()) {
JvmDeclaredType declaringType = constructor.getDeclaringType();
JvmType superType = Iterables.getLast(declaringType.getSuperTypes()).getType();
if (superType instanceof JvmGenericType)
return (JvmGenericType) superType;
}
return null;
}
use of org.eclipse.xtext.common.types.JvmType in project xtext-xtend by eclipse.
the class DispatchHelper method getMaxDistanceToObject.
protected int getMaxDistanceToObject(JvmTypeReference type) {
type = primitives.asWrapperTypeIfPrimitive(type);
if (typeRefs.is(type, Object.class))
return 0;
JvmType jvmType = type.getType();
int maxDistance = 1;
if (jvmType instanceof JvmDeclaredType) {
EList<JvmTypeReference> list = ((JvmDeclaredType) jvmType).getSuperTypes();
for (JvmTypeReference jvmTypeReference : list) {
int result = 1 + getMaxDistanceToObject(jvmTypeReference);
if (result > maxDistance)
maxDistance = result;
}
}
return maxDistance;
}
use of org.eclipse.xtext.common.types.JvmType in project xtext-xtend by eclipse.
the class DispatchMethodCompileStrategy method apply.
@Override
public void apply(/* @Nullable */
ITreeAppendable a) {
if (a == null)
throw new IllegalArgumentException("a is never null");
boolean needsElse = true;
int parameterCount = dispatchOperation.getParameters().size();
List<JvmOperation> sortedDispatchOperations = sorter.getAllDispatchCases(dispatchOperation);
boolean[] allCasesSameType = new boolean[parameterCount];
for (int i = 0; i < parameterCount; i++) {
allCasesSameType[i] = true;
JvmTypeReference dispatchParameterType = dispatchOperation.getParameters().get(i).getParameterType();
for (JvmOperation operation : sortedDispatchOperations) {
JvmFormalParameter parameter = operation.getParameters().get(i);
JvmTypeReference caseParameterType = parameter.getParameterType();
if (!Strings.equal(dispatchParameterType.getIdentifier(), caseParameterType.getIdentifier())) {
allCasesSameType[i] = false;
break;
}
}
}
ITypeReferenceOwner owner = new StandardTypeReferenceOwner(services, dispatchOperation);
for (JvmOperation operation : sortedDispatchOperations) {
ITreeAppendable operationAppendable = treeAppendableUtil.traceSignificant(a, operation, true);
final List<Later> laters = newArrayList();
for (int i = 0; i < parameterCount; i++) {
final JvmFormalParameter dispatchParam = dispatchOperation.getParameters().get(i);
final LightweightTypeReference dispatchParamType = owner.toLightweightTypeReference(dispatchParam.getParameterType());
final JvmFormalParameter caseParam = operation.getParameters().get(i);
final LightweightTypeReference caseParamType = owner.toLightweightTypeReference(caseParam.getParameterType());
final String name = getVarName(dispatchParam, operationAppendable);
if (caseParamType.isType(Void.class)) {
laters.add(new Later() {
@Override
public void exec(ITreeAppendable appendable) {
appendable.append(name).append(" == null");
}
});
} else if (!allCasesSameType[i]) {
laters.add(new Later() {
@Override
public void exec(ITreeAppendable appendable) {
if (caseParamType.isAssignableFrom(dispatchParamType, new TypeConformanceComputationArgument(true, false, true, true, false, false)) && !dispatchParamType.isPrimitive()) {
appendable.append(name).append(" != null");
} else {
appendable.append(name).append(" instanceof ");
JvmType type = caseParamType.getWrapperTypeIfPrimitive().getType();
if (type == null) {
throw new IllegalStateException(String.valueOf(caseParamType));
}
appendable.append(type);
}
}
});
}
}
// if it's not the first if append an 'else'
if (sortedDispatchOperations.get(0) != operation) {
operationAppendable.append(" else ");
}
if (laters.isEmpty()) {
needsElse = false;
if (sortedDispatchOperations.size() != 1) {
operationAppendable.append("{").increaseIndentation();
operationAppendable.newLine();
}
} else {
operationAppendable.append("if (");
operationAppendable.increaseIndentation().increaseIndentation();
Iterator<Later> iterator = laters.iterator();
while (iterator.hasNext()) {
iterator.next().exec(operationAppendable);
if (iterator.hasNext()) {
operationAppendable.newLine().append(" && ");
}
}
operationAppendable.decreaseIndentation().decreaseIndentation();
operationAppendable.append(") {").increaseIndentation();
operationAppendable.newLine();
}
final boolean isCurrentVoid = typeReferences.is(operation.getReturnType(), Void.TYPE);
final boolean isDispatchVoid = typeReferences.is(dispatchOperation.getReturnType(), Void.TYPE);
if (isDispatchVoid) {
generateActualDispatchCall(dispatchOperation, operation, operationAppendable, owner);
// we generate a redundant return statement here to get a better debugging experience
operationAppendable.append(";").newLine().append("return;");
} else {
if (isCurrentVoid) {
generateActualDispatchCall(dispatchOperation, operation, operationAppendable, owner);
operationAppendable.append(";").newLine().append("return null");
} else {
operationAppendable.append("return ");
generateActualDispatchCall(dispatchOperation, operation, operationAppendable, owner);
}
operationAppendable.append(";");
}
if (sortedDispatchOperations.size() != 1) {
operationAppendable.decreaseIndentation();
a.newLine().append("}");
}
}
if (needsElse) {
a.append(" else {").increaseIndentation();
a.newLine();
a.increaseIndentation();
a.append("throw new IllegalArgumentException(\"Unhandled parameter types: \" +").newLine();
JvmType jvmType = typeReferences.findDeclaredType("java.util.Arrays", dispatchOperation);
if (jvmType != null) {
a.append(jvmType);
} else {
a.append(Arrays.class.getSimpleName());
}
a.append(".<Object>asList(");
Iterator<JvmFormalParameter> iterator = dispatchOperation.getParameters().iterator();
while (iterator.hasNext()) {
JvmFormalParameter parameter = iterator.next();
final String name = getVarName(parameter, a);
a.append(name);
if (iterator.hasNext()) {
a.append(", ");
}
}
a.append(").toString());");
a.decreaseIndentation();
a.decreaseIndentation().newLine().append("}");
}
}
use of org.eclipse.xtext.common.types.JvmType in project xtext-xtend by eclipse.
the class MockTypeParameterSubstitutor method doVisitParameterizedTypeReference.
@Override
public LightweightTypeReference doVisitParameterizedTypeReference(final ParameterizedTypeReference reference, final Set<JvmTypeParameter> visiting) {
final JvmType type = reference.getType();
if ((type instanceof JvmTypeParameter)) {
boolean _add = visiting.add(((JvmTypeParameter) type));
boolean _not = (!_add);
if (_not) {
return null;
}
try {
final LightweightMergedBoundTypeArgument mappedReference = this.getTypeParameterMapping().get(type);
if ((mappedReference != null)) {
return mappedReference.getTypeReference().<Set<JvmTypeParameter>, LightweightTypeReference>accept(this, visiting);
} else {
ITypeReferenceOwner _owner = this.getOwner();
Object _object = new Object();
final SimpleUnboundTypeReference result = new SimpleUnboundTypeReference(_owner, ((JvmTypeParameter) type), _object);
Map<JvmTypeParameter, LightweightMergedBoundTypeArgument> _typeParameterMapping = this.getTypeParameterMapping();
LightweightMergedBoundTypeArgument _lightweightMergedBoundTypeArgument = new LightweightMergedBoundTypeArgument(result, VarianceInfo.INVARIANT);
_typeParameterMapping.put(((JvmTypeParameter) type), _lightweightMergedBoundTypeArgument);
return result;
}
} finally {
visiting.remove(type);
}
}
return super.doVisitParameterizedTypeReference(reference, visiting);
}
use of org.eclipse.xtext.common.types.JvmType in project xtext-xtend by eclipse.
the class ValidationBug433213Test method test_01.
@Test
public void test_01() {
try {
StringConcatenation _builder = new StringConcatenation();
_builder.append("class C {");
_builder.newLine();
_builder.append("\t");
_builder.append("def m() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("new Object {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("def <T> T m2() {}");
_builder.newLine();
_builder.append("\t\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
final XtendFile file = this.parser.parse(_builder);
final XtendTypeDeclaration c = IterableExtensions.<XtendTypeDeclaration>head(file.getXtendTypes());
XtendMember _head = IterableExtensions.<XtendMember>head(c.getMembers());
final XtendFunction m = ((XtendFunction) _head);
XExpression _expression = m.getExpression();
final XBlockExpression body = ((XBlockExpression) _expression);
XExpression _head_1 = IterableExtensions.<XExpression>head(body.getExpressions());
final AnonymousClass anon = ((AnonymousClass) _head_1);
XtendMember _head_2 = IterableExtensions.<XtendMember>head(anon.getMembers());
final XtendFunction m2 = ((XtendFunction) _head_2);
final JvmTypeReference returnType = m2.getReturnType();
final JvmType t = returnType.getType();
Assert.assertNotNull("notNull", t);
Assert.assertFalse("t.eIsProxy", t.eIsProxy());
this.helper.assertNoErrors(file);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
Aggregations