Commit 919e4dda authored by Daniel Honsel's avatar Daniel Honsel
Browse files

template variables can reference type fields, now

parent 4bb7b765
Loading
Loading
Loading
Loading
+28 −3
Original line number Diff line number Diff line
@@ -46,6 +46,9 @@ import static extension de.ugoe.cs.swe.common.TTCN3ScopeHelper.*
import de.ugoe.cs.swe.tTCN3.FieldExpressionSpec
import de.ugoe.cs.swe.tTCN3.SendStatement
import de.ugoe.cs.swe.tTCN3.PortRef
import de.ugoe.cs.swe.tTCN3.VarInstance
import de.ugoe.cs.swe.tTCN3.StructDefBody
import de.ugoe.cs.swe.tTCN3.StructFieldDef

class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {

@@ -158,9 +161,31 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {

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

		if (template != null) {
			template.templateFieldScope(list)
		}
		if (variable != null && variable.type.ref != null) {
			val type = variable.type.ref
			if (type instanceof RecordDefNamed) {
				type.body.scopeFieldsStructDefBody(list)
			} else if (type instanceof SetDefNamed) {
				type.body.scopeFieldsStructDefBody(list)
			} else if (type instanceof RecordOfDefNamed) {
				//TODO: implement!
			} else if (type instanceof SetOfDefNamed) {
				//TODO: implement!
			}
		}
		scopeFor(list)
	}

	def private void scopeFieldsStructDefBody(StructDefBody body, ArrayList<EObject> list) {
		for (StructFieldDef f : body.defs) {
			list.add(f)
		}
	}

	def private void templateFieldScope(TemplateDef template, ArrayList<EObject> list) {