Commit 7849a4e5 authored by Daniel Honsel's avatar Daniel Honsel
Browse files

more type validations

parent 7a9f53e0
Loading
Loading
Loading
Loading
+84 −19
Original line number Diff line number Diff line
@@ -3,56 +3,55 @@ package de.ugoe.cs.swe.validation
import de.ugoe.cs.swe.tTCN3.AltstepDef
import de.ugoe.cs.swe.tTCN3.AltstepLocalDef
import de.ugoe.cs.swe.tTCN3.AltstepLocalDefList
import de.ugoe.cs.swe.tTCN3.BaseTemplate
import de.ugoe.cs.swe.tTCN3.ComponentDef
import de.ugoe.cs.swe.tTCN3.ComponentDefList
import de.ugoe.cs.swe.tTCN3.ConstDef
import de.ugoe.cs.swe.tTCN3.ConstList
import de.ugoe.cs.swe.tTCN3.ControlStatementOrDefList
import de.ugoe.cs.swe.tTCN3.EnumDefNamed
import de.ugoe.cs.swe.tTCN3.ForStatement
import de.ugoe.cs.swe.tTCN3.FormalTemplatePar
import de.ugoe.cs.swe.tTCN3.FormalValuePar
import de.ugoe.cs.swe.tTCN3.FunctionDef
import de.ugoe.cs.swe.tTCN3.FunctionDefList
import de.ugoe.cs.swe.tTCN3.FunctionFormalPar
import de.ugoe.cs.swe.tTCN3.FunctionFormalParList
import de.ugoe.cs.swe.tTCN3.GroupDef
import de.ugoe.cs.swe.tTCN3.Initial
import de.ugoe.cs.swe.tTCN3.ModuleControlPart
import de.ugoe.cs.swe.tTCN3.ModuleDefinition
import de.ugoe.cs.swe.tTCN3.ModuleDefinitionsList
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.PortDef
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.ReferencedType
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.SingleVarInstance
import de.ugoe.cs.swe.tTCN3.StatementBlock
import de.ugoe.cs.swe.tTCN3.StructDefBody
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.TemplateDef
import de.ugoe.cs.swe.tTCN3.TemplateOrValueFormalPar
import de.ugoe.cs.swe.tTCN3.TemplateOrValueFormalParList
import de.ugoe.cs.swe.tTCN3.TestcaseDef
import de.ugoe.cs.swe.tTCN3.TypeDef
import de.ugoe.cs.swe.tTCN3.TypeDefBody
import de.ugoe.cs.swe.tTCN3.UnionDefNamed
import de.ugoe.cs.swe.tTCN3.VarList
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EStructuralFeature
import org.eclipse.xtext.validation.Check

import static extension de.ugoe.cs.swe.common.TTCN3ScopeHelper.*
import de.ugoe.cs.swe.tTCN3.GroupDef
import de.ugoe.cs.swe.tTCN3.TypeDef
import de.ugoe.cs.swe.tTCN3.ModuleParDef
import de.ugoe.cs.swe.tTCN3.ModuleParameter
import de.ugoe.cs.swe.tTCN3.ModulePar
import de.ugoe.cs.swe.tTCN3.RecordOfDefNamed
import de.ugoe.cs.swe.tTCN3.SetOfDefNamed
import de.ugoe.cs.swe.tTCN3.RecordDefNamed
import de.ugoe.cs.swe.tTCN3.PortDef
import de.ugoe.cs.swe.tTCN3.UnionDefNamed
import de.ugoe.cs.swe.tTCN3.SetDefNamed
import de.ugoe.cs.swe.tTCN3.EnumDefNamed
import de.ugoe.cs.swe.tTCN3.SubTypeDefNamed
import de.ugoe.cs.swe.tTCN3.TemplateDef
import de.ugoe.cs.swe.tTCN3.SignatureDef
import de.ugoe.cs.swe.tTCN3.TypeDefBody
import de.ugoe.cs.swe.tTCN3.ReferencedType

class TypeAttribs {
	String name
@@ -136,6 +135,72 @@ class TTCN3Validator extends AbstractTTCN3Validator {
		}
	}

	@Check
	def checkTypeNames(TestcaseDef tc) {
		val module = tc.findDesiredParent(typeof(TTCN3Module)) as TTCN3Module

		if (module.defs.checkNameClashModuleDefinitionsList(tc, tc.name)) {
			error('Name clash with another variable definition in this scope!',
				TTCN3Package.eINSTANCE.testcaseDef_Name);
			return;
		}
	}

	@Check
	def checkTypeNames(FunctionDef function) {
		val module = function.findDesiredParent(typeof(TTCN3Module)) as TTCN3Module

		if (module.defs.checkNameClashModuleDefinitionsList(function, function.name)) {
			error('Name clash with another variable definition in this scope!',
				TTCN3Package.eINSTANCE.functionRef_Name);
			return;
		}
	}

	@Check
	def checkTypeNames(BaseTemplate template) {
		val module = template.findDesiredParent(typeof(TTCN3Module)) as TTCN3Module

		if (module.defs.checkNameClashModuleDefinitionsList(template, template.name)) {
			error('Name clash with another variable definition in this scope!',
				TTCN3Package.eINSTANCE.baseTemplate_Name);
			return;
		}
	}

	@Check
	def checkTypeNames(SignatureDef sig) {
		val module = sig.findDesiredParent(typeof(TTCN3Module)) as TTCN3Module

		if (module.defs.checkNameClashModuleDefinitionsList(sig, sig.name)) {
			error('Name clash with another variable definition in this scope!',
				TTCN3Package.eINSTANCE.signatureDef_Name);
			return;
		}
	}

	@Check
	def checkTypeNames(AltstepDef alt) {
		val module = alt.findDesiredParent(typeof(TTCN3Module)) as TTCN3Module

		if (module.defs.checkNameClashModuleDefinitionsList(alt, alt.name)) {
			error('Name clash with another variable definition in this scope!',
				TTCN3Package.eINSTANCE.altstepDef_Name);
			return;
		}
	}

	@Check
	def checkTypeNames(GroupDef group) {
		val module = group.findDesiredParent(typeof(TTCN3Module)) as TTCN3Module

		if (module.defs.checkNameClashModuleDefinitionsList(group, group.name)) {
			error('Name clash with another variable definition in this scope!',
				TTCN3Package.eINSTANCE.altstepDef_Name);
			return;
		}
	}	

	def private isNameClashInHierarchy(RefValue variable) {
		var parent = variable.eContainer
		val EStructuralFeature feature = TTCN3Package.eINSTANCE.refValue_Name;