Forráskód Böngészése

Added support for super types

Andreas Mülder 10 éve
szülő
commit
591e197130

+ 33 - 0
plugins/org.yakindu.base.expressions/src/org/yakindu/base/expressions/inferrer/ExpressionsTypeInferrer.java

@@ -15,7 +15,9 @@ import static org.yakindu.base.types.typesystem.DefaultTypeSystem.INTEGER;
 import static org.yakindu.base.types.typesystem.DefaultTypeSystem.NULL;
 import static org.yakindu.base.types.typesystem.DefaultTypeSystem.REAL;
 import static org.yakindu.base.types.typesystem.DefaultTypeSystem.STRING;
+import static org.yakindu.base.types.typesystem.DefaultTypeSystem.VOID;
 
+import org.eclipse.emf.common.util.EList;
 import org.yakindu.base.expressions.expressions.AssignmentExpression;
 import org.yakindu.base.expressions.expressions.BitwiseAndExpression;
 import org.yakindu.base.expressions.expressions.BitwiseOrExpression;
@@ -23,6 +25,7 @@ import org.yakindu.base.expressions.expressions.BitwiseXorExpression;
 import org.yakindu.base.expressions.expressions.BoolLiteral;
 import org.yakindu.base.expressions.expressions.ConditionalExpression;
 import org.yakindu.base.expressions.expressions.ElementReferenceExpression;
+import org.yakindu.base.expressions.expressions.Expression;
 import org.yakindu.base.expressions.expressions.FeatureCall;
 import org.yakindu.base.expressions.expressions.HexLiteral;
 import org.yakindu.base.expressions.expressions.IntLiteral;
@@ -41,6 +44,9 @@ import org.yakindu.base.expressions.expressions.ShiftExpression;
 import org.yakindu.base.expressions.expressions.StringLiteral;
 import org.yakindu.base.expressions.expressions.TypeCastExpression;
 import org.yakindu.base.expressions.expressions.UnaryOperator;
+import org.yakindu.base.types.Operation;
+import org.yakindu.base.types.Parameter;
+import org.yakindu.base.types.Property;
 import org.yakindu.base.types.Type;
 import org.yakindu.base.types.inferrer.AbstractTypeSystemInferrer;
 
@@ -163,6 +169,18 @@ public class ExpressionsTypeInferrer extends AbstractTypeSystemInferrer implemen
 	}
 
 	public Type infer(FeatureCall e) {
+		if (e.isOperationCall()) {
+			Operation operation = (Operation) e.getFeature();
+			EList<Parameter> parameters = operation.getParameters();
+			EList<Expression> args = e.getArgs();
+			if (parameters.size() == args.size()) {
+				for (int i = 0; i < parameters.size(); i++) {
+					Type type1 = inferTypeDispatch(parameters.get(i));
+					Type type2 = inferTypeDispatch(args.get(i));
+					assertCompatible(type1, type2, String.format(INCOMPATIBLE_TYPES, type1, type2));
+				}
+			}
+		}
 		return inferTypeDispatch(e.getFeature());
 	}
 
@@ -201,4 +219,19 @@ public class ExpressionsTypeInferrer extends AbstractTypeSystemInferrer implemen
 	public Type infer(NullLiteral literal) {
 		return getType(NULL);
 	}
+
+	public Object infer(Property p) {
+		Type type = inferTypeDispatch(p.getType());
+		assertNotType(type, VARIABLE_VOID_TYPE, getType(VOID));
+		return inferTypeDispatch(type);
+
+	}
+
+	public Object infer(Operation e) {
+		return inferTypeDispatch(e.getType() != null ? e.getType() : getType(VOID));
+	}
+
+	public Object infer(Parameter e) {
+		return inferTypeDispatch(e.getType());
+	}
 }

+ 6 - 0
plugins/org.yakindu.base.expressions/src/org/yakindu/base/expressions/inferrer/ExpressionsTypeInferrerMessages.java

@@ -10,6 +10,10 @@
  */
 package org.yakindu.base.expressions.inferrer;
 
+/**
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
 public interface ExpressionsTypeInferrerMessages {
 
 	public static final String LOGICAL_OPERATOR = "Logical operator '%s' may only be applied on boolean types, not on %s.";
@@ -23,5 +27,7 @@ public interface ExpressionsTypeInferrerMessages {
 	public static final String COMMON_TYPE = "Could not determine a common type for %s and %s.";
 	public static final String CONDITIONAL_BOOLEAN = "conditional expression must be of type boolean.";
 	public static final String CAST_OPERATORS = "Cannot cast from %s to %s.";
+	public static final String INCOMPATIBLE_TYPES = "Incompatible types %s and %s.";
+	public static final String VARIABLE_VOID_TYPE = "'void' is an invalid type for variables";
 
 }

+ 11 - 0
plugins/org.yakindu.base.types/src/org/yakindu/base/types/AbstractTypeSystemRegistry.java

@@ -101,4 +101,15 @@ public abstract class AbstractTypeSystemRegistry implements ITypeSystemRegistry
 		return getDelegate(type) != null;
 	}
 
+	@Override
+	public Object defaultValue(Type type) {
+		Iterable<ITypeSystem> allTypeSystems = getAllTypeSystems();
+		for (ITypeSystem iTypeSystem : allTypeSystems) {
+			if (iTypeSystem.isTypeSystemFor(type)) {
+				return iTypeSystem.defaultValue(type);
+			}
+		}
+		throw new IllegalStateException(String.format("No Type System for type %s found!", type));
+	}
+
 }

+ 2 - 21
plugins/org.yakindu.base.types/src/org/yakindu/base/types/interpreter/DefaultTypeSystemInterpreter.java

@@ -11,6 +11,7 @@
 package org.yakindu.base.types.interpreter;
 
 import org.eclipse.emf.ecore.EObject;
+import org.yakindu.base.types.ITypeSystemRegistry;
 import org.yakindu.base.types.Type;
 import org.yakindu.base.types.typesystem.DefaultTypeSystem;
 import org.yakindu.base.types.typesystem.ITypeSystem;
@@ -24,31 +25,11 @@ import com.google.inject.Inject;
 public class DefaultTypeSystemInterpreter extends AbstractTypeSystemInterpreter {
 
 	@Inject
-	private ITypeSystem typeSystem;
+	private ITypeSystemRegistry typeSystem;
 
 	@Override
 	public Object interpret(EObject object) {
 		throw new IllegalArgumentException("not yet implemented");
 	}
 
-	@Override
-	public Object defaultValue(Type type) {
-		if (typeSystem.isSame(type, typeSystem.getType(DefaultTypeSystem.INTEGER))) {
-			return 0;
-		}
-		if (typeSystem.isSame(type, typeSystem.getType(DefaultTypeSystem.REAL))) {
-			return 0.0D;
-		}
-		if (typeSystem.isSame(type, typeSystem.getType(DefaultTypeSystem.BOOLEAN))) {
-			return false;
-		}
-		if (typeSystem.isSame(type, typeSystem.getType(DefaultTypeSystem.STRING))) {
-			return "";
-		}
-		Type superType = typeSystem.getSuperType(type);
-		if (superType != null)
-			return defaultValue(superType);
-		throw new IllegalArgumentException("Unknown type " + type);
-	}
-
 }

+ 0 - 2
plugins/org.yakindu.base.types/src/org/yakindu/base/types/interpreter/ITypeSystemInterpreter.java

@@ -11,7 +11,6 @@
 package org.yakindu.base.types.interpreter;
 
 import org.eclipse.emf.ecore.EObject;
-import org.yakindu.base.types.Type;
 
 import com.google.inject.ImplementedBy;
 
@@ -24,5 +23,4 @@ public interface ITypeSystemInterpreter {
 
 	public Object interpret(EObject object);
 
-	public Object defaultValue(Type type);
 }

+ 13 - 1
plugins/org.yakindu.base.types/src/org/yakindu/base/types/typesystem/AbstractTypeSystem.java

@@ -23,7 +23,9 @@ import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.yakindu.base.types.ITypeSystemRegistry;
+import org.yakindu.base.types.PrimitiveType;
 import org.yakindu.base.types.Type;
+import org.yakindu.base.types.TypesFactory;
 
 import com.google.inject.Inject;
 
@@ -47,6 +49,10 @@ public abstract class AbstractTypeSystem implements ITypeSystem {
 
 	protected abstract void declareTypes();
 
+	protected void reset(){
+		typeRegistry.clear();
+		extendsRegistry.clear();
+	}
 	@Override
 	public final void init() {
 		declareTypes();
@@ -92,6 +98,13 @@ public abstract class AbstractTypeSystem implements ITypeSystem {
 		return Collections.unmodifiableCollection(typeRegistry.values());
 	}
 
+	protected Type declarePrimitive(String name) {
+		PrimitiveType primitive = TypesFactory.eINSTANCE.createPrimitiveType();
+		primitive.setName(name);
+		declareType(primitive, name);
+		return primitive;
+	}
+	
 	public void declareType(Type type, String name) {
 		resource.getContents().add(type);
 		typeRegistry.put(name, type);
@@ -120,7 +133,6 @@ public abstract class AbstractTypeSystem implements ITypeSystem {
 		return null;
 	}
 
-	@Override
 	public boolean isTypeSystemFor(Type type) {
 		Collection<Type> types = getTypes();
 		for (Type type2 : types) {

+ 18 - 7
plugins/org.yakindu.base.types/src/org/yakindu/base/types/typesystem/DefaultTypeSystem.java

@@ -10,9 +10,7 @@
  */
 package org.yakindu.base.types.typesystem;
 
-import org.yakindu.base.types.PrimitiveType;
 import org.yakindu.base.types.Type;
-import org.yakindu.base.types.TypesFactory;
 
 import com.google.inject.Singleton;
 
@@ -46,10 +44,23 @@ public class DefaultTypeSystem extends AbstractTypeSystem {
 		declareSuperType(getType(INTEGER), getType(REAL));
 	}
 
-	protected Type declarePrimitive(String name) {
-		PrimitiveType primitive = TypesFactory.eINSTANCE.createPrimitiveType();
-		primitive.setName(name);
-		declareType(primitive, name);
-		return primitive;
+	@Override
+	public Object defaultValue(Type type) {
+		if (isSame(type, getType(INTEGER))) {
+			return 0;
+		}
+		if (isSame(type, getType(REAL))) {
+			return 0.0D;
+		}
+		if (isSame(type, getType(BOOLEAN))) {
+			return false;
+		}
+		if (isSame(type, getType(STRING))) {
+			return "";
+		}
+		Type superType = getSuperType(type);
+		if (superType != null)
+			return defaultValue(superType);
+		throw new IllegalArgumentException("Unknown type " + type);
 	}
 }

+ 3 - 1
plugins/org.yakindu.base.types/src/org/yakindu/base/types/typesystem/ITypeSystem.java

@@ -43,5 +43,7 @@ public interface ITypeSystem {
 	public boolean isSuperType(Type subtype, Type supertype);
 
 	public boolean isTypeSystemFor(Type type);
-
+	
+	public Object defaultValue(Type type);
+	
 }