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

+ improve indirect resolution of enums, fields in unions #21

parent e2a8fbb2
Loading
Loading
Loading
Loading
+38 −5
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ package de.ugoe.cs.swe.common
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
@@ -11,12 +12,16 @@ 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
import de.ugoe.cs.swe.tTCN3.ExtConstDef
import de.ugoe.cs.swe.tTCN3.FormalTemplatePar
import de.ugoe.cs.swe.tTCN3.FormalValuePar
import de.ugoe.cs.swe.tTCN3.FunctionBodyDef
import de.ugoe.cs.swe.tTCN3.FunctionDef
import de.ugoe.cs.swe.tTCN3.FunctionDefOrStatement
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.IdentifierObjectList
import de.ugoe.cs.swe.tTCN3.Initial
import de.ugoe.cs.swe.tTCN3.ModuleControlPart
import de.ugoe.cs.swe.tTCN3.ModuleDefinition
@@ -59,14 +64,10 @@ import de.ugoe.cs.swe.tTCN3.VarList
import java.util.ArrayList
import java.util.List
import org.eclipse.emf.ecore.EObject
import org.eclipse.xtext.EcoreUtil2
import org.eclipse.xtext.scoping.IScope

import static org.eclipse.xtext.scoping.Scopes.*
import de.ugoe.cs.swe.tTCN3.ExtConstDef
import de.ugoe.cs.swe.tTCN3.IdentifierObjectList
import de.ugoe.cs.swe.tTCN3.BaseTemplate
import de.ugoe.cs.swe.tTCN3.FunctionDefOrStatement
import de.ugoe.cs.swe.tTCN3.FunctionBodyDef

class TTCN3ScopeHelper {

@@ -301,6 +302,38 @@ class TTCN3ScopeHelper {
		}
	}

	def static void scopeFunctionParameter(FunctionDef function, ArrayList<EObject> list) {
		if (function.parameterList !== null) {
			for (FunctionFormalPar p : function.parameterList.params) {
				if (p.value !== null) {
					if (p.value.type.ref !== null) {
						var type = getReferencedType(p.value.type.ref)
						scopeReferencedEnum(type, list)
					}
				} else if (p.template !== null) {
					if (p.template.type.ref !== null) {
						var type = getReferencedType(p.template.type.ref)
						scopeReferencedEnum(type, list)
					}
				}
			}
		}
	}
	
	def static void scopeReferencedEnum(ReferencedType type, ArrayList<EObject> list) {
		if (type instanceof EnumDefNamed) {
			list.addAll(type.list.enums)
		} else if (type instanceof SubTypeDefNamed) {
			var original = findOriginalType(type)
			if (original instanceof EnumDefNamed) {
				for (ReferencedValue v : EcoreUtil2.getAllContentsOfType(type.spec, ReferencedValue)) {
					list.add(getReferencedValue(v))
				}  
			}
		}
	}


	def static void scopeTemplateOrValueFormalParList(TemplateOrValueFormalParList paramsList,
		ArrayList<EObject> list) {
		var RefValue value;
+6 −1
Original line number Diff line number Diff line
@@ -123,7 +123,9 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
			}
		} else if (fieldRef instanceof UnionFieldDef) {
			if (fieldRef.type !== null && fieldRef.type.ref !== null) {
				fieldRef.type.ref.scopeReferencedFields
				var l = fieldRef.type.ref.scopeReferencedFields
				//why was this not auto returning?
				return l
			} else if (fieldRef.nestedType !== null) {
				if (fieldRef.nestedType !== null) {
					val nType = fieldRef.nestedType.findUsedType
@@ -933,6 +935,9 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		} else if (value instanceof FunctionInstance) {
			// TODO: implement this
			if (value.ref instanceof FunctionDef) {
				(value.ref as FunctionDef).scopeFunctionParameter(list)
			} 
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))
		} else {
			scopeFor(list, value.eContainer.scope_ReferencedValueHead(ref))