Commit 1618f5d6 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ added check for uninitialised fields in templates, #8 (only declared...

+ added check for uninitialised fields in templates, #8 (only declared templates, deactivated implementation for variables)
parent 0a2ee189
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
      <!--    <projectExtension>t3p</projectExtension> -->
      <ignoredResourceRegExp>((.*[/\\]Common[/\\](IMS_LibSip|IMS_XSD)[/\\].*[.]ttcn)|(.*[/\\]Common[/\\](HTTP)[/\\]uri.*[.]ttcn)|(.*[/\\]LTE_A_R12[/\\](D2D_ProSe)[/\\]urn.*[.]ttcn)|(.*[/\\]IMS[/\\]XCAP_XSD[/\\].*[.]ttcn)|(.*[/\\]MCX[/\\]CommonXSD[/\\].*[.]ttcn)|(.*[/\\].*[/\\][Cc]ommon[/\\]TestcaseProperties.*[.]ttcn))</ignoredResourceRegExp>   
      <!--   <settingRecursiveProcessing>true</settingRecursiveProcessing>  -->
      <checkNoUninitializedFieldsInTemplates>true</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitialisedVariables>false</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>  <!--  to be discarded if checkNoUninitialisedVariables is true. If list is empty, no restrictions   -->
        <string>enumerated</string>
@@ -197,6 +198,7 @@
      <checkNoUnusedImports>true</checkNoUnusedImports>
      <checkNoUnusedFormalParameters>true</checkNoUnusedFormalParameters>
      <checkNoUnusedLocalDefinitions>true</checkNoUnusedLocalDefinitions>
      <checkNoUninitializedFieldsInTemplates>true</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitialisedVariables>true</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>
        <string>enumerated</string>
@@ -314,6 +316,7 @@
      <checkNoUnusedImports>false</checkNoUnusedImports>
      <checkNoUnusedFormalParameters>false</checkNoUnusedFormalParameters>
      <checkNoUnusedLocalDefinitions>false</checkNoUnusedLocalDefinitions>
      <checkNoUninitializedFieldsInTemplates>true</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitialisedVariables>true</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>
        <string>enumerated</string>
+3 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
      <!--    <projectExtension>t3p</projectExtension> -->
      <ignoredResourceRegExp>((.*[/\\]Common[/\\](IMS_LibSip|IMS_XSD)[/\\].*[.]ttcn)|(.*[/\\]Common[/\\](HTTP)[/\\]uri.*[.]ttcn)|(.*[/\\]LTE_A_R12[/\\](D2D_ProSe)[/\\]urn.*[.]ttcn)|(.*[/\\]IMS[/\\]XCAP_XSD[/\\].*[.]ttcn)|(.*[/\\]MCX[/\\]CommonXSD[/\\].*[.]ttcn)|(.*[/\\].*[/\\][Cc]ommon[/\\]TestcaseProperties.*[.]ttcn))</ignoredResourceRegExp>   
      <!--   <settingRecursiveProcessing>true</settingRecursiveProcessing>  -->
      <checkNoUninitializedFieldsInTemplates>false</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitialisedVariables>false</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>  <!--  to be discarded if checkNoUninitialisedVariables is true. If list is empty, no restrictions   -->
        <string>enumerated</string>
@@ -197,6 +198,7 @@
      <checkNoUnusedImports>true</checkNoUnusedImports>
      <checkNoUnusedFormalParameters>true</checkNoUnusedFormalParameters>
      <checkNoUnusedLocalDefinitions>true</checkNoUnusedLocalDefinitions>
      <checkNoUninitializedFieldsInTemplates>false</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitialisedVariables>true</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>
        <string>enumerated</string>
@@ -314,6 +316,7 @@
      <checkNoUnusedImports>false</checkNoUnusedImports>
      <checkNoUnusedFormalParameters>false</checkNoUnusedFormalParameters>
      <checkNoUnusedLocalDefinitions>false</checkNoUnusedLocalDefinitions>
      <checkNoUninitializedFieldsInTemplates>false</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitialisedVariables>true</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>
        <string>enumerated</string>
+3 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@
      <checkNoUnusedImports>true</checkNoUnusedImports>
      <checkNoUnusedFormalParameters>true</checkNoUnusedFormalParameters>
      <checkNoUnusedLocalDefinitions>true</checkNoUnusedLocalDefinitions>
      <checkNoUninitializedFieldsInTemplates>true</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitialisedVariables>true</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>
		<!--
@@ -194,6 +195,7 @@
      <checkNoUnusedImports>true</checkNoUnusedImports>
      <checkNoUnusedFormalParameters>true</checkNoUnusedFormalParameters>
      <checkNoUnusedLocalDefinitions>true</checkNoUnusedLocalDefinitions>
      <checkNoUninitializedFieldsInTemplates>true</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitialisedVariables>true</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>
        <string>enumerated</string>
@@ -311,6 +313,7 @@
      <checkNoUnusedImports>false</checkNoUnusedImports>
      <checkNoUnusedFormalParameters>false</checkNoUnusedFormalParameters>
      <checkNoUnusedLocalDefinitions>false</checkNoUnusedLocalDefinitions>
      <checkNoUninitializedFieldsInTemplates>true</checkNoUninitializedFieldsInTemplates>
      <checkNoUninitialisedVariables>true</checkNoUninitialisedVariables>
      <checkNoUninitialisedVariablesExclude>
        <string>enumerated</string>
+91 −18
Original line number Diff line number Diff line
@@ -12,12 +12,16 @@ import de.ugoe.cs.swe.scoping.TTCN3GlobalScopeProvider
import de.ugoe.cs.swe.tTCN3.AltConstruct
import de.ugoe.cs.swe.tTCN3.AltstepDef
import de.ugoe.cs.swe.tTCN3.AltstepInstance
import de.ugoe.cs.swe.tTCN3.ArrayElementExpressionList
import de.ugoe.cs.swe.tTCN3.ArrayExpression
import de.ugoe.cs.swe.tTCN3.Assignment
import de.ugoe.cs.swe.tTCN3.BaseTemplate
import de.ugoe.cs.swe.tTCN3.ComponentDef
import de.ugoe.cs.swe.tTCN3.ConstDef
import de.ugoe.cs.swe.tTCN3.ConstList
import de.ugoe.cs.swe.tTCN3.EnumDefNamed
import de.ugoe.cs.swe.tTCN3.ExtFunctionDef
import de.ugoe.cs.swe.tTCN3.ExtendedFieldReference
import de.ugoe.cs.swe.tTCN3.FieldExpressionList
import de.ugoe.cs.swe.tTCN3.FormalPortPar
import de.ugoe.cs.swe.tTCN3.FormalTemplatePar
@@ -35,25 +39,33 @@ import de.ugoe.cs.swe.tTCN3.ModuleDefinition
import de.ugoe.cs.swe.tTCN3.ModulePar
import de.ugoe.cs.swe.tTCN3.ModuleParDef
import de.ugoe.cs.swe.tTCN3.ModuleParameter
import de.ugoe.cs.swe.tTCN3.OpCall
import de.ugoe.cs.swe.tTCN3.PermutationMatch
import de.ugoe.cs.swe.tTCN3.PortDef
import de.ugoe.cs.swe.tTCN3.PortElement
import de.ugoe.cs.swe.tTCN3.PredefinedValue
import de.ugoe.cs.swe.tTCN3.RecordDefNamed
import de.ugoe.cs.swe.tTCN3.RecordOfDefNamed
import de.ugoe.cs.swe.tTCN3.RefValue
import de.ugoe.cs.swe.tTCN3.ReferencedValue
import de.ugoe.cs.swe.tTCN3.RestrictedTemplate
import de.ugoe.cs.swe.tTCN3.RunsOnSpec
import de.ugoe.cs.swe.tTCN3.SetDefNamed
import de.ugoe.cs.swe.tTCN3.SetOfDefNamed
import de.ugoe.cs.swe.tTCN3.SignatureDef
import de.ugoe.cs.swe.tTCN3.SingleConstDef
import de.ugoe.cs.swe.tTCN3.SingleExpression
import de.ugoe.cs.swe.tTCN3.SingleTempVarInstance
import de.ugoe.cs.swe.tTCN3.SingleTemplateExpression
import de.ugoe.cs.swe.tTCN3.SingleVarInstance
import de.ugoe.cs.swe.tTCN3.StatementBlock
import de.ugoe.cs.swe.tTCN3.StructFieldDef
import de.ugoe.cs.swe.tTCN3.SubTypeDefNamed
import de.ugoe.cs.swe.tTCN3.TTCN3Module
import de.ugoe.cs.swe.tTCN3.TTCN3Package
import de.ugoe.cs.swe.tTCN3.TTCN3Reference
import de.ugoe.cs.swe.tTCN3.TempVarList
import de.ugoe.cs.swe.tTCN3.TemplateBody
import de.ugoe.cs.swe.tTCN3.TemplateDef
import de.ugoe.cs.swe.tTCN3.TestcaseDef
import de.ugoe.cs.swe.tTCN3.TimerRefOrAll
@@ -61,9 +73,12 @@ import de.ugoe.cs.swe.tTCN3.TimerRefOrAny
import de.ugoe.cs.swe.tTCN3.Type
import de.ugoe.cs.swe.tTCN3.TypeDef
import de.ugoe.cs.swe.tTCN3.UnionDefNamed
import de.ugoe.cs.swe.tTCN3.UnionFieldDef
import de.ugoe.cs.swe.tTCN3.Value
import de.ugoe.cs.swe.tTCN3.ValueofOp
import de.ugoe.cs.swe.tTCN3.VarInstance
import de.ugoe.cs.swe.tTCN3.VarList
import de.ugoe.cs.swe.tTCN3.VariableRef
import java.util.ArrayList
import java.util.HashMap
import java.util.HashSet
@@ -75,6 +90,8 @@ import java.util.regex.Matcher
import java.util.regex.Pattern
import org.eclipse.emf.ecore.EClass
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.xtext.EcoreUtil2.ElementReferenceAcceptor
import org.eclipse.xtext.nodemodel.INode
import org.eclipse.xtext.nodemodel.util.NodeModelUtils
import org.eclipse.xtext.scoping.IGlobalScopeProvider
@@ -88,23 +105,6 @@ 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 org.eclipse.xtext.EcoreUtil2.ElementReferenceAcceptor
import org.eclipse.emf.ecore.EReference
import de.ugoe.cs.swe.tTCN3.StructFieldDef
import de.ugoe.cs.swe.tTCN3.OpCall
import de.ugoe.cs.swe.tTCN3.UnionFieldDef
import de.ugoe.cs.swe.tTCN3.RefValue
import de.ugoe.cs.swe.tTCN3.ExtendedFieldReference
import de.ugoe.cs.swe.tTCN3.ReferencedValue
import de.ugoe.cs.swe.tTCN3.Assignment
import de.ugoe.cs.swe.tTCN3.VarInstance
import de.ugoe.cs.swe.tTCN3.ArrayElementExpressionList
import de.ugoe.cs.swe.tTCN3.ArrayExpression
import de.ugoe.cs.swe.tTCN3.SingleExpression
import de.ugoe.cs.swe.tTCN3.RestrictedTemplate
import de.ugoe.cs.swe.tTCN3.TemplateBody
import de.ugoe.cs.swe.tTCN3.SingleTemplateExpression
import de.ugoe.cs.swe.tTCN3.VariableRef

class CheckDefinitionComeFirstParameter {
	public boolean hasOtherDefinitions
@@ -1171,9 +1171,82 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
		return !found
	}

	@Check
	def checkNoUninitializedFieldsInTemplates(TemplateDef template) {
		//TODO: also for variables and parameters? other expressions? operations? -> only for declared templates for now
		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) {
					checkUnreferencedFields(expr, type, template.base.name)
				}
			}
		}
	}

	@Check
	def checkNoUninitializedFieldsInTemplates(VarInstance variable) {
		//TODO: also for variables and parameters? other expressions? operations? -> deactivated for now, pending clarification
		if (true)
			return;
		
		if (variable.type.ref !== null) {
			var type = variable.type.ref.head
			if (type instanceof RecordDefNamed) {
				for (single : variable.tempList.variables) {
					var expr = single.template.simple.expr
					if (expr instanceof FieldExpressionList) {
						checkUnreferencedFields(expr, type, single.name)
					}
				}
			}
		}
	}

	@Check
	def checkNoUninitializedFieldsInTemplates(Assignment assignment) {
		//TODO: also for variables and parameters? other expressions? operations? -> deactivated for now, pending clarification
		if (true)
			return;
		var variable = assignment.ref.ref.head.target.eContainer.eContainer
		var type = (variable as VarInstance).type.ref.head
		if (type !== null) {
			if (type instanceof RecordDefNamed) {
				for (single : (variable as VarInstance).tempList.variables) {
					var expr = single.template.simple.expr
					if (expr instanceof FieldExpressionList) {
						checkUnreferencedFields(expr, type, single.name)
					}
				}
			}
		}
	}

	
	protected def void checkUnreferencedFields(FieldExpressionList expr, RecordDefNamed type, String template) {
		var referencedFields = expr.specs.map[it.fieldRef]
		for (field : type.body.defs) {
			if (!referencedFields.contains(field)) {
				statistics.incrementCountStyle
				val message = "Field \""+field.name+"\" not initialised in template \""+template+"\"!"
				val INode node = NodeModelUtils.getNode(expr)
				warning(
					message,
					null,
					MessageClass.STYLE.toString,
					node.startLine.toString,
					node.endLine.toString,
					"6.16, " + MiscTools.getMethodName()
				);
			}
		}
	}

	@Check
	def checkNoValueOfForValues(ValueofOp templateOp) {
		//TODO: add property, update version
		if (!activeProfile.checkNoValueOfForValues)
			return;

+10 −1
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ public class QualityCheckProfile extends ConfigurationProfile {
	private boolean checkNoUnusedImports = true;
	private boolean checkNoUnusedFormalParameters = true;
	private boolean checkNoUnusedLocalDefinitions = true;
    private boolean checkNoUninitializedFieldsInTemplates = true;
    private boolean checkNoUninitialisedVariables = true;
	private String[] checkNoUninitialisedVariablesExclude = {"enumerated", "union", "record", "record of", "set", "set of"};
	private boolean checkNoLiterals = true;
@@ -629,6 +630,14 @@ public class QualityCheckProfile extends ConfigurationProfile {
		this.checkNoAnyValueOrNoneInListValues = checkNoAnyValueOrNoneInListValues;
	}

	public boolean isCheckNoUninitializedFieldsInTemplates() {
		return checkNoUninitializedFieldsInTemplates;
	}

	public void setCheckNoUninitializedFieldsInTemplates(boolean checkNoUninitializedFieldsInTemplates) {
		this.checkNoUninitializedFieldsInTemplates = checkNoUninitializedFieldsInTemplates;
	}

	

}