Commit fc7e4405 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ added check for correct specification of union templates (#31)

parent 4e225cb8
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
      <!--   <settingRecursiveProcessing>true</settingRecursiveProcessing>  -->
      <checkNoUninitializedFieldsInTemplates>true</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitializedFieldsInTemplatesRecursion>false</checkNoUninitializedFieldsInTemplatesRecursion>
      <checkNoZeroMultipleFieldsInUnionTemplates>false</checkNoZeroMultipleFieldsInUnionTemplates>
      <checkNoUninitialisedVariables>false</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>  <!--  to be discarded if checkNoUninitialisedVariables is true. If list is empty, no restrictions   -->
        <string>enumerated</string>
@@ -204,6 +205,7 @@
      <checkNoUnusedLocalDefinitions>true</checkNoUnusedLocalDefinitions>
      <checkNoUninitializedFieldsInTemplates>true</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitializedFieldsInTemplatesRecursion>false</checkNoUninitializedFieldsInTemplatesRecursion>
      <checkNoZeroMultipleFieldsInUnionTemplates>false</checkNoZeroMultipleFieldsInUnionTemplates>
      <checkNoUninitialisedVariables>true</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>
        <string>enumerated</string>
@@ -325,6 +327,7 @@
      <checkNoUnusedLocalDefinitions>false</checkNoUnusedLocalDefinitions>
      <checkNoUninitializedFieldsInTemplates>true</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitializedFieldsInTemplatesRecursion>false</checkNoUninitializedFieldsInTemplatesRecursion>
      <checkNoZeroMultipleFieldsInUnionTemplates>false</checkNoZeroMultipleFieldsInUnionTemplates>
      <checkNoUninitialisedVariables>true</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>
        <string>enumerated</string>
+3 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
      <!--   <settingRecursiveProcessing>true</settingRecursiveProcessing>  -->
      <checkNoUninitializedFieldsInTemplates>false</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitializedFieldsInTemplatesRecursion>false</checkNoUninitializedFieldsInTemplatesRecursion>
      <checkNoZeroOrMultipleFieldsInUnionTemplates>false</checkNoZeroOrMultipleFieldsInUnionTemplates>
      <checkNoUninitialisedVariables>false</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>  <!--  to be discarded if checkNoUninitialisedVariables is true. If list is empty, no restrictions   -->
        <string>enumerated</string>
@@ -204,6 +205,7 @@
      <checkNoUnusedLocalDefinitions>true</checkNoUnusedLocalDefinitions>
      <checkNoUninitializedFieldsInTemplates>false</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitializedFieldsInTemplatesRecursion>false</checkNoUninitializedFieldsInTemplatesRecursion>
      <checkNoZeroOrMultipleFieldsInUnionTemplates>false</checkNoZeroOrMultipleFieldsInUnionTemplates>
      <checkNoUninitialisedVariables>true</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>
        <string>enumerated</string>
@@ -325,6 +327,7 @@
      <checkNoUnusedLocalDefinitions>false</checkNoUnusedLocalDefinitions>
      <checkNoUninitializedFieldsInTemplates>false</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitializedFieldsInTemplatesRecursion>false</checkNoUninitializedFieldsInTemplatesRecursion>
      <checkNoZeroOrMultipleFieldsInUnionTemplates>false</checkNoZeroOrMultipleFieldsInUnionTemplates>
      <checkNoUninitialisedVariables>true</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>
        <string>enumerated</string>
+60 −0
Original line number Diff line number Diff line
@@ -1204,6 +1204,66 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
		return !found
	}

	@Check
	def checkNoZeroOrMultipleFieldsInUnionTemplates(TemplateDef template) {
		if (!activeProfile.checkNoZeroOrMultipleFieldsInUnionTemplates)
			return;
		if (template.base.type.ref !== null) {
			var expr = template.body.simple.expr
			if (expr instanceof FieldExpressionList) {
				var type = getReferencedOrNestedTypeWithTail(template.base.type.ref)
				if (type instanceof NestedUnionDef || type instanceof UnionDefNamed) {
					var referencedFields = new ArrayList<FieldReference>()
					referencedFields.addAll(expr.specs.map[it.fieldRef])
					template.collectInheritedFieldSpecifications(referencedFields)
					if (referencedFields.size==0) {
						statistics.incrementCountStyle
						val message = "At lest one field shall be specified in union template \""+template.base.name+"\"!"
						val INode node = NodeModelUtils.getNode(expr)
						warning(
							message,
							null,
							MessageClass.STYLE.toString,
							node.startLine.toString,
							node.endLine.toString,
							//TODO: check number
							"6.19, " + MiscTools.getMethodName()
						);
					} else if (referencedFields.size>1) {
						statistics.incrementCountStyle
						val message = "More than one field specified in union template \""+template.base.name+"\"!"
						val INode node = NodeModelUtils.getNode(expr)
						warning(
							message,
							null,
							MessageClass.STYLE.toString,
							node.startLine.toString,
							node.endLine.toString,
							//TODO: check number
							"6.19, " + MiscTools.getMethodName()
						);
					}
				}
			} else if (expr instanceof ArrayOrMixedExpression) {
				if (expr.list === null) {
						statistics.incrementCountStyle
						val message = "At lest one field shall be specified in union template \""+template.base.name+"\"!"
						val INode node = NodeModelUtils.getNode(expr)
						warning(
							message,
							null,
							MessageClass.STYLE.toString,
							node.startLine.toString,
							node.endLine.toString,
							//TODO: check number
							"6.19, " + MiscTools.getMethodName()
						);
				}
			}
			
		}		
	}

	@Check
	def checkNoUninitializedFieldsInTemplates(TemplateDef template) {
		//TODO: also for variables and parameters? other expressions? operations? -> only for declared templates for now
+9 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ public class QualityCheckProfile extends ConfigurationProfile {
	private boolean checkNoUnusedLocalDefinitions = true;
    private boolean checkNoUninitializedFieldsInTemplates = true;
    private boolean checkNoUninitializedFieldsInTemplatesRecursion = false;
    private boolean checkNoZeroOrMultipleFieldsInUnionTemplates = false;
    private boolean checkNoUninitialisedVariables = true;
	private String[] checkNoUninitialisedVariablesExclude = {"enumerated", "union", "record", "record of", "set", "set of"};
	private boolean checkNoLiterals = true;
@@ -665,6 +666,14 @@ public class QualityCheckProfile extends ConfigurationProfile {
		this.jsonSchemaPath = jsonSchemaPath;
	}

	public boolean isCheckNoZeroOrMultipleFieldsInUnionTemplates() {
		return checkNoZeroOrMultipleFieldsInUnionTemplates;
	}

	public void setCheckNoZeroOrMultipleFieldsInUnionTemplates(boolean checkNoZeroOrMultipleFieldsInUnionTemplates) {
		this.checkNoZeroOrMultipleFieldsInUnionTemplates = checkNoZeroOrMultipleFieldsInUnionTemplates;
	}

	

}