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

+ scoping refinements

parent dff1575f
Loading
Loading
Loading
Loading
+47 −2
Original line number Diff line number Diff line
@@ -81,6 +81,10 @@ import de.ugoe.cs.swe.tTCN3.ReferencedValue
import java.util.HashMap
import de.ugoe.cs.swe.tTCN3.OpCall
import de.ugoe.cs.swe.tTCN3.FunctionRef
import org.eclipse.xtext.EcoreUtil2
import de.ugoe.cs.swe.tTCN3.SingleValueSpec
import de.ugoe.cs.swe.tTCN3.PortReceiveOp
import de.ugoe.cs.swe.tTCN3.Value

//TODO: switch to TTCN3LocalScopeProvider as base class?
class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
@@ -120,6 +124,7 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
				}
			}
		}
		emptyList
	}

	private def void scopeFieldReferences(FieldReference fieldRef, ArrayList<EObject> list) {
@@ -215,8 +220,16 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
			list.addAll(cField.fieldRef.scopeFieldReferences)
 		} else if (sField !== null) {
			if (sField.ref !== null) {
				//DONE: handle inline templates that occur in between
				//TODO: applicable in other situations? test for anomalies..
				if (inlineTemplate !== null && sField.isAncestor(inlineTemplate)) {
					if (inlineTemplate.type !== null && inlineTemplate.type.ref !== null) {
						list.addAll(inlineTemplate.type.ref.templateFieldScope)
					}
				} else {
					list.addAll(sField.ref.scopeFieldReferences)
				}
			}
		} else if (constDef !== null) {
			if (constDef.type.ref !== null) {
				list.addAll(constDef.type.ref.scopeReferencedFields)
@@ -280,6 +293,32 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		field.scopeFieldExpressionList
	}

	def IScope scope_SingleValueSpec_fieldRef(SingleValueSpec spec, EReference ref) {
		//TODO: generalise / extract
		var ArrayList<EObject> list = newArrayList
		val inlineTemplate = spec.findDesiredParent(PortReceiveOp).template
		if (inlineTemplate.type !== null && inlineTemplate.type.ref !== null) {
			list.addAll(inlineTemplate.type.ref.templateFieldScope)
		} else if (inlineTemplate.template !== null 
			&& inlineTemplate.template.simple !== null
			&& inlineTemplate.template.simple.expr !== null
		) {
			val expr = inlineTemplate.template.simple.expr;
			if (expr instanceof Value) {
				val value = expr.ref.referencedValue
				if (value instanceof BaseTemplate) {
					val l = value.type.ref.scopeReferencedFields
					list.addAll(value.type.ref.scopeReferencedFields)
				} else if (value instanceof FormalTemplatePar) {
					list.addAll(value.type.ref.scopeReferencedFields)
				}
				//TODO: others?
			}
		}
		scopeFor(list)		
	}


	private def IScope scopeOfTimer(EObject variable) {
		val ArrayList<EObject> list = newArrayList
		var parent = variable.eContainer
@@ -691,6 +730,12 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
			target = getParentFieldTarget(target, fields, index)
			list.addAll(target.directValueElements)
						
		} else if (eContainer instanceof Type) {
			//handle subypes / aliases for types of fields 
			val t = (eContainer as Type)
			if (t.ref !== null) {
				list.addAll(t.ref.scopeReferencedFields)
			}
		} else {
			//TODO: check for type?
			var target = ((eContainer as ReferencedValue).head.target as RefValue)