Commit 4e225cb8 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ improve checking for uninitialised fields in templates (#8)

parent ffbd9801
Loading
Loading
Loading
Loading
+33 −10
Original line number Diff line number Diff line
@@ -106,6 +106,7 @@ import static extension de.ugoe.cs.swe.common.TTCN3ReferenceHelper.*
import static extension de.ugoe.cs.swe.common.TTCN3ScopeHelper.*
import static extension org.eclipse.emf.ecore.util.EcoreUtil.*
import static extension org.eclipse.xtext.EcoreUtil2.*
import de.ugoe.cs.swe.tTCN3.NestedUnionDef

class CheckDefinitionComeFirstParameter {
	public boolean hasOtherDefinitions
@@ -1209,15 +1210,35 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
		if (!activeProfile.checkNoUninitializedFieldsInTemplates)
			return;
		if (template.base.type.ref !== null) {
			var type = template.base.type.ref.head
			if (type instanceof RecordDefNamed) {
			var expr = template.body.simple.expr
			if (expr instanceof FieldExpressionList) {
					//get fields from referenced template
				//DONE: this seems to break things.. also for unions it has to be treated differently
				//DONE: get all fields in a unified way, also for nested -> factor out above
				//TODO: handle record of / set of?
				var type = getReferencedOrNestedTypeWithTail(template.base.type.ref)
				var fields = type.getFields
				if (type instanceof NestedUnionDef || type instanceof UnionDefNamed) {
					
				} else {
					var referencedFields = new ArrayList<FieldReference>()
					//DONE: handle unions -> skip altogether? or separate warning? (new feature)
					referencedFields.addAll(expr.specs.map[it.fieldRef])
					template.collectInheritedFieldSpecifications(referencedFields)
					checkNoUninitializedFieldsInTemplates(referencedFields, type, template.base.name, expr)
					checkNoUninitializedFieldsInTemplates(referencedFields, fields, template.base.name, expr)
				}
			} else if (expr instanceof ArrayOrMixedExpression) {
				//no fields specified
				if (expr.list === null) {
					var type = getReferencedOrNestedTypeWithTail(template.base.type.ref)
					var fields = type.getFields
					if (type instanceof NestedUnionDef || type instanceof UnionDefNamed) {
						
					} else {
						var referencedFields = new ArrayList<FieldReference>()
						//DONE: handle unions -> skip altogether? or separate warning? (new feature)
						template.collectInheritedFieldSpecifications(referencedFields)
						checkNoUninitializedFieldsInTemplates(referencedFields, fields, template.base.name, expr)
					}
				}
			}
		}
@@ -1253,8 +1274,9 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
				for (single : variable.tempList.variables) {
					var expr = single.template.simple.expr
					if (expr instanceof FieldExpressionList) {
						//TODO: update based on above -> factor out!
						var referencedFields = expr.specs.map[it.fieldRef]
						checkNoUninitializedFieldsInTemplates(referencedFields, type, single.name, expr)
//						checkNoUninitializedFieldsInTemplates(referencedFields, type, single.name, expr)
					}
				}
			}
@@ -1275,7 +1297,8 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
					var expr = single.template.simple.expr
					if (expr instanceof FieldExpressionList) {
						var referencedFields = expr.specs.map[it.fieldRef]
						checkNoUninitializedFieldsInTemplates(referencedFields, type, single.name, expr)
						//TODO: update based on above -> factor out!
//						checkNoUninitializedFieldsInTemplates(referencedFields, type, single.name, expr)
					}
				}
			}
@@ -1283,8 +1306,8 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
	}

	
	protected def void checkNoUninitializedFieldsInTemplates(List<FieldReference> referencedFields, RecordDefNamed type, String template, FieldExpressionList expr) {
		for (field : type.body.defs) {
	protected def void checkNoUninitializedFieldsInTemplates(List<FieldReference> referencedFields, Iterable<FieldReference> fields, String template, EObject expr) {
		for (field : fields) {
			if (!referencedFields.contains(field)) {
				statistics.incrementCountStyle
				val message = "Field \""+field.name+"\" not initialised in template \""+template+"\"!"