Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 0cd13c1a923aaa827f172b09f8b3611fc2e4befc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package aspects.xpt.expressions

import org.eclipse.gmf.codegen.gmfgen.GenDiagram
import com.google.inject.Inject
import aspects.xpt.Common
import com.google.inject.Singleton

@Singleton class AbstractExpression extends xpt.expressions.AbstractExpression {
	
	@Inject extension Common
	
	override performCast(GenDiagram it) '''
		«generatedMemberComment(
			'Expression may return number value which is not directly compatible with feature type (e.g. Double when Integer is expected), or EEnumLiteral meta-object when literal instance is expected')»
		public static Object performCast(Object value, org.eclipse.emf.ecore.EDataType targetType) {
			if (targetType instanceof org.eclipse.emf.ecore.EEnum) {
				if (value instanceof org.eclipse.emf.ecore.EEnumLiteral) {
					org.eclipse.emf.ecore.EEnumLiteral literal = (org.eclipse.emf.ecore.EEnumLiteral) value;
					return (literal.getInstance() != null) ? literal.getInstance() : literal;
				}
			}
			if (false == value instanceof Number || targetType == null || targetType.getInstanceClass() == null) {
				return value;
			}
			Class<?> targetClass = targetType.getInstanceClass();
			Number num = (Number) value;
			Class<?> valClass = value.getClass();
			Class<?> targetWrapperClass = targetClass;
			if (targetClass.isPrimitive()) {
				targetWrapperClass = org.eclipse.emf.ecore.util.EcoreUtil.wrapperClassFor(targetClass);
			}
			if (valClass.equals(targetWrapperClass)) {
				return value;
			}
			if (Number.class.isAssignableFrom(targetWrapperClass)) {
				if (targetWrapperClass.equals(Byte.class)) {
					return new Byte(num.byteValue());
				}
				if (targetWrapperClass.equals(Integer.class)) {
					return new Integer(num.intValue());
				}
				if (targetWrapperClass.equals(Short.class)) {
					return new Short(num.shortValue());
				}
				if (targetWrapperClass.equals(Long.class)) {
					return new Long(num.longValue());
				}
				if (targetWrapperClass.equals(java.math.BigInteger.class)) {
					return java.math.BigInteger.valueOf(num.longValue());
				}
				if (targetWrapperClass.equals(Float.class)) {
					return new Float(num.floatValue());
				}
				if (targetWrapperClass.equals(Double.class)) {
					return new Double(num.doubleValue());
				}
				if (targetWrapperClass.equals(java.math.BigDecimal.class)) {
					return new java.math.BigDecimal(num.doubleValue());
				}
			}
			return value;
		}
	'''
}

Back to the top