Browse Source

Added check: no references to variables from value

Andreas Mülder 10 years ago
parent
commit
5ad99d032f

+ 29 - 0
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextJavaValidator.java

@@ -17,6 +17,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
@@ -93,6 +94,7 @@ import org.yakindu.sct.model.stext.types.ISTextTypeInferrer;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
 
@@ -210,6 +212,33 @@ public class STextJavaValidator extends AbstractSTextJavaValidator implements ST
 		}
 	}
 
+	@Check(CheckType.FAST)
+	public void checkValueDefinitionExpression(VariableDefinition definition) {
+		// applies only to constants
+		if (definition.isWriteable())
+			return;
+		Expression initialValue = definition.getInitialValue();
+		List<Expression> toCheck = Lists.newArrayList(initialValue);
+		TreeIterator<EObject> eAllContents = initialValue.eAllContents();
+		while (eAllContents.hasNext()) {
+			EObject next = eAllContents.next();
+			if (next instanceof Expression)
+				toCheck.add((Expression) next);
+		}
+		for (Expression expression : toCheck) {
+			EObject referencedObject = null;
+			if (expression instanceof FeatureCall)
+				referencedObject = ((FeatureCall) expression).getFeature();
+			else if (expression instanceof ElementReferenceExpression)
+				referencedObject = ((ElementReferenceExpression) expression).getReference();
+			if (referencedObject instanceof VariableDefinition) {
+				if (((VariableDefinition) referencedObject).isWriteable()) {
+					error(REFERENCE_TO_VARIABLE, StextPackage.Literals.VARIABLE_DEFINITION__INITIAL_VALUE);
+				}
+			}
+		}
+	}
+
 	@Check(CheckType.FAST)
 	public void checkUnusedExit(final Exit exit) {
 		if (exit.getParentRegion().getComposite() instanceof org.yakindu.sct.model.sgraph.State

+ 4 - 1
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextValidationMessages.java

@@ -46,5 +46,8 @@ public interface STextValidationMessages {
 	public static final String ISSUE_TRANSITION_WITHOUT_TRIGGER = "Missing trigger. Transisition is never taken. Use 'oncycle' or 'always' instead";
 	public static final String IMPORT_NOT_RESOLVED = "Import cannot be resolved";
 	public static final String EXITPOINTSPEC_WITH_TRIGGER = "Transitions with an exit point spec does not have a trigger or guard.";
-	public static final String ASSIGNMENT_TO_VALUE = "Assignment to final variable";
+	public static final String ASSIGNMENT_TO_VALUE = "Assignment to final field";
+	public static final String REFERENCE_TO_VARIABLE = "Cannot reference a variable in final field initialization";
+	public static final String REFERENCE_FIELD_BEFORE_DEFINED = "Cannot reference a field before it is defined";
+	
 }