Commit 2f667ca6 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ further improved handling of nested types and tails, #30, #21, #8 (may still...

+ further improved handling of nested types and tails, #30, #21, #8 (may still need extra work and cleanup)
parent 28b9cc49
Loading
Loading
Loading
Loading
+31 −13
Original line number Diff line number Diff line
@@ -508,7 +508,7 @@ class TTCN3ScopeHelper {
	
	def static Iterable<EObject> scopeReferencedFields(ReferencedType type) {
		val List<EObject> list = newArrayList
		val ReferencedType originalType = findOriginalType(type)
		val EObject originalType = findOriginalType(type)

		if (originalType === null)
			return list;
@@ -527,7 +527,10 @@ class TTCN3ScopeHelper {
			// should be impossible, ... or not?
		} else if (originalType instanceof SetOfDefNamed) {
			// should be impossible, ... or not?
		} else if (originalType instanceof NestedTypeDef) {
			list.addAll(originalType.nestedTypeFieldElements)
		}
		//TODO: handle nested
		return list		
	}	
	
@@ -573,18 +576,33 @@ class TTCN3ScopeHelper {
			if (typeof(SignatureDef).isAssignableFrom(originalType.class)) {
				list.addAll((type as SignatureDef).paramList.params)
			}
			if (originalType instanceof NestedTypeDef) {
				list.addAll(originalType.nestedTypeFieldElements)
			}
		}
		list
	}

	def static EObject findOriginalForRef(EObject ref) {
		if (ref instanceof ReferencedType) {
			findOriginalType(ref)
		} else {
			ref
		}
	}

	// TODO: consider nested types
	public def static ReferencedType findOriginalType(ReferencedType type) {
		if (type != null && typeof(SubTypeDefNamed).isAssignableFrom(type.class)) {
			findOriginalType(getReferencedType((type as SubTypeDefNamed).type.ref))
		} else if (type != null && typeof(RecordOfDefNamed).isAssignableFrom(type.class)) {
			findOriginalType(getReferencedType((type as RecordOfDefNamed).type.ref))
		} else if (type != null && typeof(SetOfDefNamed).isAssignableFrom(type.class)) {
			findOriginalType(getReferencedType((type as SetOfDefNamed).type.ref))
	def static EObject findOriginalType(ReferencedType type) {
		//TODO: handle nested types -> document
		if (type !== null && typeof(SubTypeDefNamed).isAssignableFrom(type.class)) {
			var ref = getReferencedOrNestedTypeWithTail((type as SubTypeDefNamed).type.ref)
			findOriginalForRef(ref)
		} else if (type !== null && typeof(RecordOfDefNamed).isAssignableFrom(type.class)) {
			var ref = getReferencedOrNestedTypeWithTail((type as RecordOfDefNamed).type.ref)
			findOriginalForRef(ref)
		} else if (type !== null && typeof(SetOfDefNamed).isAssignableFrom(type.class)) {
			var ref = getReferencedOrNestedTypeWithTail((type as SetOfDefNamed).type.ref)
			findOriginalForRef(ref)
		} else { 
			return type;
		}
@@ -595,16 +613,16 @@ class TTCN3ScopeHelper {
		// TODO; consider missing nested types
		switch it {
			NestedRecordOfDef: {
				if (it.type != null) {
				if (it.type !== null) {
					return it.type.ref;
				} else if (it.nested != null) {
				} else if (it.nested !== null) {
					it.nested.findUsedType
				}
			}
			NestedSetOfDef: {
				if (it.type != null) {
				if (it.type !== null) {
					return it.type.ref;
				} else if (it.nested != null) {
				} else if (it.nested !== null) {
					it.nested.findUsedType
				}
			}
+32 −3
Original line number Diff line number Diff line
@@ -115,6 +115,12 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
					val nType = fieldRef.nestedType.findUsedType
					if (nType !== null) {
						nType.scopeReferencedFields
					} else {
						//not nested record of or set of?
						//TODO: what if nested record of with nested record or similar?
						//TODO: why does it not work with the default return? 
						var fields = fieldRef.nestedType.getFields.map[it as EObject]
						return fields
					}
				}
			}
@@ -132,6 +138,12 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
					val nType = fieldRef.nestedType.findUsedType
					if (nType !== null) {
						nType.scopeReferencedFields
					} else {
						//not nested record of or set of?
						//TODO: what if nested record of with nested record or similar? 
						//TODO: why does it not work with the default return? 
						var fields = fieldRef.nestedType.getFields.map[it as EObject]
						return fields
					}
				}
			}
@@ -148,6 +160,10 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
					val nType = fieldRef.nestedType.findUsedType
					if (nType !== null) {
						list.addAll(nType.scopeReferencedFields)
					} else {
						//not nested record of or set of?
						//TODO: what if nested record of with nested record or similar? 
						list.addAll(fieldRef.nestedType.getFields)
					}
				}
			}
@@ -163,6 +179,10 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
					val nType = fieldRef.nestedType.findUsedType
					if (nType !== null) {
						list.addAll(nType.scopeReferencedFields)
					} else {
						//not nested record of or set of?
						//TODO: what if nested record of with nested record or similar? 
						list.addAll(fieldRef.nestedType.getFields)
					}
				}
			}
@@ -801,11 +821,18 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		return res
	}

	private def Iterable<EObject> nestedFieldTypeElements(StructFieldDef field) {
	private def Iterable<EObject> nestedFieldTypeElements(FieldReference field) {
		//TODO: this has to be unified..
		val List<EObject> list = newArrayList
		if (field instanceof StructFieldDef) {
			if (field.nestedType !== null) {
				list.addAll(field.nestedType.nestedTypeFieldElements)
			}
		} else if (field instanceof UnionFieldDef) {
			if (field.nestedType !== null) {
				list.addAll(field.nestedType.nestedTypeFieldElements)
			}
		}
		return list
	}

@@ -828,6 +855,8 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		} else if (field instanceof UnionFieldDef) {
			if (field.type !== null) {
				field.type.ref.scopeReferencedFields
			} else if (field.nestedType !== null) {
				field.nestedFieldTypeElements
			}
		}
	}