Commit 473e3696 authored by Daniel Honsel's avatar Daniel Honsel
Browse files

minor improvements on scopes and validation and more test modules

parent b5863c70
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@ import 'http://www.eclipse.org/emf/2002/Ecore' as ecore

TTCN3File:
	{TTCN3File}
	expressions+=TTCN3Module*;
	modules+=TTCN3Module*;

ConstDef:
	CONSTKEYWORD type=Type defs=ConstList;
@@ -634,7 +634,7 @@ VarList:

ReferencedType:
	SubTypeDefNamed | RecordDefNamed | SetDefNamed | PortDef | ComponentDef | UnionDefNamed | EnumDefNamed |
	RecordOfDefNamed | SetOfDefNamed | SignatureDef;
	RecordOfDefNamed | SetOfDefNamed | SignatureDef | GroupDef | TTCN3Module;

TypeDef:
	TYPEDEFKEYWORD body=TypeDefBody;
+46 −43
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ 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.EnumDef
import de.ugoe.cs.swe.tTCN3.EnumDefNamed
import de.ugoe.cs.swe.tTCN3.Enumeration
import de.ugoe.cs.swe.tTCN3.EnumerationList
@@ -35,20 +36,17 @@ 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.StructuredTypeDef
import de.ugoe.cs.swe.tTCN3.SubTypeDef
import de.ugoe.cs.swe.tTCN3.SubTypeDefNamed
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.TypeDef
import de.ugoe.cs.swe.tTCN3.UnionDefNamed
import de.ugoe.cs.swe.tTCN3.VarList
import java.util.ArrayList
import org.eclipse.emf.ecore.EObject
import de.ugoe.cs.swe.tTCN3.EnumDef
import de.ugoe.cs.swe.tTCN3.TTCN3Module
import de.ugoe.cs.swe.tTCN3.GroupDef
import de.ugoe.cs.swe.tTCN3.StructuredTypeDef
import de.ugoe.cs.swe.tTCN3.SubTypeDef
import de.ugoe.cs.swe.tTCN3.UnionDefNamed
import de.ugoe.cs.swe.tTCN3.SubTypeDefNamed

class TTCN3ScopeHelper {

@@ -75,26 +73,27 @@ class TTCN3ScopeHelper {
		}
	}

	// TODO: test me!
	def static void scopeModuleVariable(TTCN3Module module, ArrayList<EObject> list) {
		if (module.defs != null) {
			module.defs.scopeModuleVariable(list)
	def static void scopeModuleTypes(ModuleDefinitionsList moduleDefs, ArrayList<EObject> res, boolean onlyPorts) {
		var StructuredTypeDef struct = null;
		var SubTypeDef sub = null;

			for (ModuleDefinition g : module.defs.definitions.filter[it.def instanceof GroupDef]) {
				val GroupDef group = g.def as GroupDef
				group.list.scopeModuleVariable(list)
			}
		// treat signature as type: makes things easy and should be changed eventually
		if (!onlyPorts) {
			for (ModuleDefinition d : moduleDefs.definitions.filter[it.def instanceof SignatureDef]) {
				res.add(d.def)
			}
		}

	def static void scopeModuleTypes(ModuleDefinitionsList moduleDefs, ReferencedType type, ArrayList<EObject> res) {
		var StructuredTypeDef struct = null;
		var SubTypeDef sub = null;

		for (ModuleDefinition d : moduleDefs.definitions.filter[it.def instanceof TypeDef]) {
			struct = (d.def as TypeDef).body.structured
			sub = (d.def as TypeDef).body.sub

			if (onlyPorts) {
				if (struct != null && struct.port != null) {
					res.add(struct.port)
				}
			} else {

				if (struct != null) {
					if (struct.record != null && struct.record instanceof RecordDefNamed) {
						res.add(struct.record)
@@ -118,6 +117,8 @@ class TTCN3ScopeHelper {
						res.add(sub)
					}
				}

			}
		}
	}

@@ -216,6 +217,7 @@ class TTCN3ScopeHelper {
	}

	def static void scopeTemplateParameter(TemplateDef template, ArrayList<EObject> list) {
		if (template.base.parList != null) {
			for (TemplateOrValueFormalPar p : template.base.parList.params) {
				if (p.value != null) {
					list.add(p.value)
@@ -224,6 +226,7 @@ class TTCN3ScopeHelper {
				}
			}
		}
	}

	def static void scopeTemplateOrValueFormalParList(TemplateOrValueFormalParList paramsList,
		ArrayList<EObject> list) {
+81 −24
Original line number Diff line number Diff line
@@ -2,10 +2,10 @@ package de.ugoe.cs.swe.scoping

import de.ugoe.cs.swe.tTCN3.AltstepDef
import de.ugoe.cs.swe.tTCN3.AltstepLocalDef
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.ControlStatementOrDefList
import de.ugoe.cs.swe.tTCN3.EnumDefNamed
import de.ugoe.cs.swe.tTCN3.ExtendedFieldReference
import de.ugoe.cs.swe.tTCN3.FieldExpressionSpec
import de.ugoe.cs.swe.tTCN3.FieldSpec
@@ -19,26 +19,22 @@ 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.ModuleParDef
import de.ugoe.cs.swe.tTCN3.PortInstance
import de.ugoe.cs.swe.tTCN3.PortOrAny
import de.ugoe.cs.swe.tTCN3.PortRef
import de.ugoe.cs.swe.tTCN3.RecordDefNamed
import de.ugoe.cs.swe.tTCN3.RecordOfDefNamed
import de.ugoe.cs.swe.tTCN3.ReferencedType
import de.ugoe.cs.swe.tTCN3.ReferencedValue
import de.ugoe.cs.swe.tTCN3.SendStatement
import de.ugoe.cs.swe.tTCN3.SetDefNamed
import de.ugoe.cs.swe.tTCN3.SetOfDefNamed
import de.ugoe.cs.swe.tTCN3.SingleTempVarInstance
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.StructuredTypeDef
import de.ugoe.cs.swe.tTCN3.TTCN3Module
import de.ugoe.cs.swe.tTCN3.TemplateDef
import de.ugoe.cs.swe.tTCN3.TestcaseDef
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.VarInstance
import org.eclipse.emf.ecore.EReference
import org.eclipse.xtext.scoping.IScope
@@ -47,9 +43,6 @@ import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider
import static org.eclipse.xtext.scoping.Scopes.*

import static extension de.ugoe.cs.swe.common.TTCN3ScopeHelper.*
import de.ugoe.cs.swe.tTCN3.BaseTemplate
import de.ugoe.cs.swe.tTCN3.SubTypeDef
import de.ugoe.cs.swe.tTCN3.SubTypeDefNamed

class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {

@@ -67,6 +60,12 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		while (parent != null) {
			if (parent instanceof TTCN3Module) {
				parent.defs.scopeModuleVariable(list)
				for (ModuleDefinition g : parent.defs.definitions.filter[it.def instanceof GroupDef]) {
					val GroupDef group = g.def as GroupDef
					if (group.list != null) {
						group.list.scopeModuleVariable(list)
					}
				}
			} else if (parent instanceof StatementBlock) {
				parent.scopeStatementBlock(list)
			} else if (parent instanceof Initial) {
@@ -101,26 +100,25 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
			}
			parent = parent.eContainer
		}

		scopeFor(list)
	}

	//TODO: fix me!!!
	def IScope scope_ReferencedType(ReferencedType type, EReference ref) {
		val module = type.findDesiredParent(typeof(TTCN3Module)) as TTCN3Module
		val res = newArrayList
		val list = newArrayList

		if (module.defs != null) {
			module.defs.scopeModuleTypes(type, res)
			module.defs.scopeModuleTypes(list, false)

			for (ModuleDefinition g : module.defs.definitions.filter[it.def instanceof GroupDef]) {
				val GroupDef group = g.def as GroupDef
				if (group.list != null) {
					group.list.scopeModuleTypes(type, res)
					group.list.scopeModuleTypes(list, false)
				}
			}
		}
		scopeFor(res)
		scopeFor(list)
	}

	def IScope scope_ComponentDef_extends(ComponentDef component, EReference ref) {
@@ -142,25 +140,48 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
	def IScope scope_FieldSpec_ref(FieldSpec spec, EReference ref) {
		val template = spec.findDesiredParent(typeof(TemplateDef)) as TemplateDef
		val variable = spec.findDesiredParent(typeof(VarInstance)) as VarInstance
		val inner = newArrayList
		val field = spec.findDesiredParent(typeof(FieldSpec)) as FieldSpec
		val list = newArrayList

		if (template != null) {
			template.templateFieldScope(inner)
		if (field != null) {
			val fieldRef = field.ref
			if (fieldRef instanceof StructFieldDef) {
				if (fieldRef.type != null && fieldRef.type.ref != null) {
					fieldRef.type.ref.scopeReferencedFields(list)
				}
			} else if (field.ref instanceof FormalValuePar) {
				if (fieldRef.type != null && fieldRef.type.ref != null) {
					fieldRef.type.ref.scopeReferencedFields(list)
				}
			}
		} else if (template != null) {
			template.templateFieldScope(list)
		} else if (variable != null && variable.type.ref != null) {
			variable.type.ref.scopeReferencedFields(inner)
			variable.type.ref.scopeReferencedFields(list)
		}
		scopeFor(inner)
		scopeFor(list)
	}

	def IScope scope_FieldExpressionSpec_fieldRef(FieldExpressionSpec field, EReference ref) {
		val template = field.findDesiredParent(typeof(TemplateDef)) as TemplateDef
		val variable = field.findDesiredParent(typeof(VarInstance)) as VarInstance
		val cField = field.findDesiredParent(typeof(FieldExpressionSpec)) as FieldExpressionSpec
		val list = newArrayList

		if (template != null) {
			template.templateFieldScope(list)
		if (cField != null) {
			val fieldRef = cField.fieldRef
			if (fieldRef instanceof StructFieldDef) {
				if (fieldRef.type != null && fieldRef.type.ref != null) {
					fieldRef.type.ref.scopeReferencedFields(list)
				}
		if (variable != null && variable.type.ref != null) {
			} else if (cField.fieldRef instanceof FormalValuePar) {
				if (fieldRef.type != null && fieldRef.type.ref != null) {
					fieldRef.type.ref.scopeReferencedFields(list)
				}
			}
		} else if (template != null) {
			template.templateFieldScope(list)
		} else if (variable != null && variable.type.ref != null) {
			variable.type.ref.scopeReferencedFields(list)
		}
		scopeFor(list)
@@ -261,7 +282,43 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
					parent.field.type.ref.scopeReferencedFields(list)
				}
			} else if (parent.field instanceof FormalValuePar) {
				// TODO: check and implement if required!
				if (parent.field.type != null) {
					parent.field.type.ref.scopeReferencedFields(list)
				}
			}
		}
		scopeFor(list)
	}

	def IScope scope_PortInstance_ref(PortInstance port, EReference ref) {
		val module = port.findDesiredParent(typeof(TTCN3Module)) as TTCN3Module
		val list = newArrayList

		if (module.defs != null) {
			module.defs.scopeModuleTypes(list, true)

			for (ModuleDefinition g : module.defs.definitions.filter[it.def instanceof GroupDef]) {
				val GroupDef group = g.def as GroupDef
				if (group.list != null) {
					group.list.scopeModuleTypes(list, true)
				}
			}
		}
		scopeFor(list)
	}

	def IScope scope_Type_ref(Type type, EReference ref) {
		val module = type.findDesiredParent(typeof(TTCN3Module)) as TTCN3Module
		val list = newArrayList

		if (module.defs != null) {
			module.defs.scopeModuleTypes(list, false)

			for (ModuleDefinition g : module.defs.definitions.filter[it.def instanceof GroupDef]) {
				val GroupDef group = g.def as GroupDef
				if (group.list != null) {
					group.list.scopeModuleTypes(list, false)
				}
			}
		}
		scopeFor(list)
+2 −2
Original line number Diff line number Diff line
@@ -90,7 +90,7 @@ class TTCN3Validator extends AbstractTTCN3Validator {
		val char pattern = 'M';

		if (module.name.charAt(0) != pattern) {
			warning('Module names should start with M!', TTCN3Package.eINSTANCE.TTCN3Module_Name);
			warning('Module names should start with M!', TTCN3Package.eINSTANCE.referencedType_Name);
		}
	}

@@ -172,7 +172,7 @@ class TTCN3Validator extends AbstractTTCN3Validator {

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