Commit 433c98b6 authored by Daniel Honsel's avatar Daniel Honsel
Browse files

fixed some scoping issues

parent 1fe0d0af
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1064,7 +1064,7 @@ Value:
	predef=PredefinedValue | ref=ReferencedValue;

ReferencedValue:
	Head fields+=ExtendedFieldReference*;
	head=Head fields+=ExtendedFieldReference*;

RefValueHead:
	RefValue | GroupDef;
+74 −2
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ import de.ugoe.cs.swe.tTCN3.FieldConstExpressionSpec
import de.ugoe.cs.swe.tTCN3.FieldExpressionSpec
import de.ugoe.cs.swe.tTCN3.FieldReference
import de.ugoe.cs.swe.tTCN3.FieldSpec
import de.ugoe.cs.swe.tTCN3.ForStatement
import de.ugoe.cs.swe.tTCN3.FormalTemplatePar
import de.ugoe.cs.swe.tTCN3.FormalTimerPar
import de.ugoe.cs.swe.tTCN3.FormalValuePar
@@ -20,7 +21,9 @@ import de.ugoe.cs.swe.tTCN3.FunctionFormalParList
import de.ugoe.cs.swe.tTCN3.GroupDef
import de.ugoe.cs.swe.tTCN3.Head
import de.ugoe.cs.swe.tTCN3.InLineTemplate
import de.ugoe.cs.swe.tTCN3.Initial
import de.ugoe.cs.swe.tTCN3.ModuleControlBody
import de.ugoe.cs.swe.tTCN3.ModuleControlPart
import de.ugoe.cs.swe.tTCN3.ModuleDefinition
import de.ugoe.cs.swe.tTCN3.ModulePar
import de.ugoe.cs.swe.tTCN3.ModuleParDef
@@ -39,6 +42,9 @@ import de.ugoe.cs.swe.tTCN3.SendStatement
import de.ugoe.cs.swe.tTCN3.SingleTempVarInstance
import de.ugoe.cs.swe.tTCN3.SingleVarInstance
import de.ugoe.cs.swe.tTCN3.SpecElement
import de.ugoe.cs.swe.tTCN3.StatementBlock
import de.ugoe.cs.swe.tTCN3.StructFieldDef
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
@@ -56,7 +62,6 @@ import static org.eclipse.xtext.scoping.Scopes.*

import static extension de.ugoe.cs.swe.common.TTCN3ScopeHelper.*
import static extension org.eclipse.xtext.EcoreUtil2.*
import de.ugoe.cs.swe.tTCN3.StructFieldDef

class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {

@@ -365,7 +370,74 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
				IScope.NULLSCOPE
			}
		} else {
			tr.polymorphicFindScopeForClassName(ref)
			val module = tr.findDesiredParent(TTCN3Module)
			module.getScope(ref)
		}
	}

	def IScope scope_Head_target(Head value, EReference ref) {
		value.scope_ReferencedValueHead(ref)
	}

	private def IScope scope_ReferencedValueHead(EObject value, EReference ref) {
		val list = newArrayList();

		if (value == null)
			return IScope.NULLSCOPE

		if (value instanceof TTCN3Module) {
			value.defs.scopeModuleVariable(list)
			for (ModuleDefinition g : value.defs.definitions.filter[it.def instanceof GroupDef]) {
				val GroupDef group = g.def as GroupDef
				if (group.list != null) {
					group.list.scopeModuleVariable(list)
				}
			}
			scopeFor(list, value.getScope(ref))
		} else if (value instanceof StatementBlock) {
			value.scopeStatementBlock(list)
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		} else if (value instanceof Initial) {
			value.scopeInitial(list)
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		} else if (value instanceof ForStatement) {
			value.init.scopeInitial(list)
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		} else if (value instanceof FunctionDef) {
			if(value.parameterList != null) value.parameterList.scopeFunctionParameterValue(list)
			if (value.runsOn != null) {
				value.runsOn.component.componentScopeValueRefs(list, false, true)
			}
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		} else if (value instanceof ModuleControlPart) {
			value.scopeModuleControlPart(list)
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		} else if (value instanceof ComponentDef) {
			value.componentScopeValueRefs(list, false, true)
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		} else if (value instanceof TestcaseDef) {
			val ComponentDef comp = value.spec.runsOn.component
			value.parList.scopeTemplateOrValueFormalParList(list)
			comp.componentScopeValueRefs(list, false, true)
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		} else if (value instanceof AltstepDef) {
			if (value.params != null) {
				value.params.scopeFunctionParameterValue(list)
			}
			value.scopeAltstepExtendedDefList(list)
			value.local.scopeAltstepLocalDefList(list)
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		} else if (value instanceof GroupDef) {
			value.list.scopeModuleVariable(list)
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		} else if (value instanceof ModuleParDef) {
			value.scopeModuleParDef(list)
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		} else if (value instanceof TemplateDef) {
			value.scopeTemplateParameter(list)
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		} else {
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		}
	}