Commit 621a483c authored by Daniel Honsel's avatar Daniel Honsel
Browse files

improved scoping

parent d366d100
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -365,7 +365,7 @@ ReceiveStatement:

	// TODO: extend with other possible references
PortOrAny:
	ref=[PortElement|IDENTIFIER] array=ArrayOrBitRef? | {PortOrAny} ANYKEYWORD PORTKEYWORD;
	ref=[FormalPortAndValuePar|IDENTIFIER] array=ArrayOrBitRef? | {PortOrAny} ANYKEYWORD PORTKEYWORD;

PortReceiveOp:
	{PortReceiveOp} RECEIVEOPKEYWORD (LPAREN template=InLineTemplate RPAREN)? from=FromClause? redirect=PortRedirect?;
@@ -413,12 +413,17 @@ FunctionActualParAssignment:
	template=TemplateInstanceAssignment | component=ComponentRefAssignment | port=PortRefAssignment |
	timer=TimerRefAssignment;

	// FormalValuePar according to antlr implementation
	// used FormalValuePar according to antlr implementation
ComponentRefAssignment:
	ref=[FormalValuePar|IDENTIFIER] ASSIGNMENTCHAR value=ComponentRef;

// hack to deal with ambiguity between FormalValuePar and FormalPortPar
// TODO; find better solution for this
FormalPortAndValuePar:
	FormalPortPar|FormalValuePar| PortElement;

PortRefAssignment:
	port=[FormalPortPar|IDENTIFIER] ASSIGNMENTCHAR value=PortRef;
	port=[FormalPortAndValuePar|IDENTIFIER] ASSIGNMENTCHAR value=PortRef;

TimerRefAssignment:
	timer=[FormalTimerPar|IDENTIFIER] ASSIGNMENTCHAR value=[TimerVarInstance|IDENTIFIER];
@@ -530,7 +535,7 @@ SingleConnectionSpec:
	LPAREN port1=PortRef COMMA port2=PortRef RPAREN;

PortRef:
	component=ComponentRef COLON port=[PortElement|IDENTIFIER] array=ArrayOrBitRef?;
	component=ComponentRef COLON port=[FormalPortAndValuePar|IDENTIFIER] array=ArrayOrBitRef?;

CommunicationStatements:
	send=SendStatement | call=CallStatement | reply=ReplyStatement | raise=RaiseStatement | receive=ReceiveStatement |
@@ -557,16 +562,16 @@ ClearStatement:
	port=PortOrAll DOT CLEAROPKEYWORD;

PortOrAll:
	port=[PortElement|IDENTIFIER] arrayRefs+=ArrayOrBitRef* | {PortOrAll} ALLKEYWORD PORTKEYWORD;
	port=[FormalPortAndValuePar|IDENTIFIER] arrayRefs+=ArrayOrBitRef* | {PortOrAll} ALLKEYWORD PORTKEYWORD;

RaiseStatement:
	port=[PortElement|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortRaiseOp;
	port=[FormalPortAndValuePar|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortRaiseOp;

PortRaiseOp:
	RAISEKEYWORD LPAREN signature=[SignatureDef|QualifiedIdentifier] COMMA template=InLineTemplate RPAREN to=ToClause?;

ReplyStatement:
	port=[PortElement|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortReplyOp;
	port=[FormalPortAndValuePar|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortReplyOp;

PortReplyOp:
	REPLYKEYWORD LPAREN template=InLineTemplate value=ReplyValue? RPAREN to=ToClause?;
@@ -575,7 +580,7 @@ ReplyValue:
	VALUEKEYWORD expr=Expression;

CallStatement:
	port=[PortElement|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortCallOp body=PortCallBody?;
	port=[FormalPortAndValuePar|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortCallOp body=PortCallBody?;

PortCallOp:
	CALLOPKEYWORD LPAREN params=CallParameters RPAREN to=ToClause?;
@@ -603,7 +608,7 @@ CallBodyOps:

	// changed port=ArrayIdentifierRef -> port=[PortElement|IDENTIFIER] arryRefs+=ArrayOrBitRef*
SendStatement:
	port=[PortElement|IDENTIFIER] arryRefs+=ArrayOrBitRef* DOT send=PortSendOp;
	port=[FormalPortAndValuePar|IDENTIFIER] arryRefs+=ArrayOrBitRef* DOT send=PortSendOp;

PortSendOp:
	SENDOPKEYWORD LPAREN template=InLineTemplate RPAREN to=ToClause?;
@@ -1068,7 +1073,7 @@ Head:
	target=[RefValueHead|IDENTIFIER] tail=RefValueTail?;

RefValueTail:
	DOT value=[RefValueElement|IDENTIFIER] tail=RefValueTail?;
	DOT value=[RefValueElement|IDENTIFIER] array=ArrayOrBitRef? tail=RefValueTail?;

SpecElement:
	Head | RefValueTail;
@@ -1250,7 +1255,7 @@ FormalTimerPar:
	INOUTPARKEYWORD? TIMERKEYWORD name=IDENTIFIER;

FormalPortPar:
	INOUTPARKEYWORD? name=IDENTIFIER id=IDENTIFIER;
	INOUTPARKEYWORD? port=[PortDef|QualifiedIdentifier] name=IDENTIFIER;

FormalTemplatePar:
	(inOut=(INPARKEYWORD | OUTPARKEYWORD | INOUTPARKEYWORD))? (TEMPLATEKEYWORD | restriction=RestrictedTemplate)
+63 −35
Original line number Diff line number Diff line
@@ -52,6 +52,10 @@ import de.ugoe.cs.swe.tTCN3.RaiseStatement
import de.ugoe.cs.swe.tTCN3.UnionFieldDef
import de.ugoe.cs.swe.tTCN3.FieldConstExpressionSpec
import de.ugoe.cs.swe.tTCN3.SingleConstDef
import de.ugoe.cs.swe.tTCN3.ArrayOrBitRef
import de.ugoe.cs.swe.tTCN3.FormalPortPar
import de.ugoe.cs.swe.tTCN3.FunctionFormalParList
import de.ugoe.cs.swe.tTCN3.PortDef

class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {

@@ -68,32 +72,7 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
	}

	def IScope scope_FieldSpec_ref(FieldSpec spec, EReference ref) {
		val inlineTemplate = spec.findDesiredParent(InLineTemplate)
		val template = spec.findDesiredParent(TemplateDef)
		val variable = spec.findDesiredParent(VarInstance)
		val field = spec.findDesiredParent(FieldSpec)

		val list = newArrayList
		if (field != null) {
			val fieldRef = field.ref
			if (fieldRef instanceof StructFieldDef) {
				if (fieldRef.type != null && fieldRef.type.ref != null) {
					scopeFor(fieldRef.type.scopeReferencedFields)
				}
			} else if (fieldRef instanceof FormalValuePar) {
				if (fieldRef.type != null && fieldRef.type.ref != null) {
					scopeFor(fieldRef.type.scopeReferencedFields)
				}
			}
		} else if (inlineTemplate != null) {
			inlineTemplate.templateFieldScope(list)
			scopeFor(list)
		} else if (template != null) {
			template.templateFieldScope(list)
			scopeFor(list)
		} else if (variable != null && variable.type.ref != null) {
			scopeFor(variable.type.scopeReferencedFields)
		}
		spec.scopeFieldExpressionList
	}

	private def IScope scopeFieldExpressionList(EObject field) {
@@ -102,7 +81,8 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		val variable = field.findDesiredParent(VarInstance)
		val eField = field.findDesiredParent(FieldExpressionSpec)
		val cField = field.findDesiredParent(FieldConstExpressionSpec)
		val const = field.findDesiredParent(ConstDef)
		val sField = field.findDesiredParent(FieldSpec)
		val constDef = field.findDesiredParent(ConstDef)
		val list = newArrayList

		if (eField != null) {
@@ -135,16 +115,35 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
					scopeFor(fieldRef.type.scopeReferencedFields)
				}
			}
		} else if (const != null) {
			scopeFor(const.type.scopeReferencedFields)
		} else if (sField != null) {
			val fieldRef = sField.ref
			if (fieldRef instanceof StructFieldDef) {
				if (fieldRef.type != null && fieldRef.type.ref != null) {
					scopeFor(fieldRef.type.scopeReferencedFields)
				}
			} else if (fieldRef instanceof FormalValuePar) {
				if (fieldRef.type != null && fieldRef.type.ref != null) {
					scopeFor(fieldRef.type.scopeReferencedFields)
				}
			} else if (fieldRef instanceof UnionFieldDef) {
				if (fieldRef.type != null && fieldRef.type.ref != null) {
					scopeFor(fieldRef.type.scopeReferencedFields)
				}
			}
		} else if (constDef != null) {
			scopeFor(constDef.type.scopeReferencedFields)
		} else if (inlineTemplate != null) {
			inlineTemplate.templateFieldScope(list)
			scopeFor(list)
		} else if (template != null) {
			template.templateFieldScope(list)
			scopeFor(list)
		} else if (variable != null && variable.type.ref != null) {
		} else if (variable != null) {
			if (variable.type != null && variable.type.ref != null) {
				scopeFor(variable.type.scopeReferencedFields)
			} else if (variable.listType != null && variable.listType.ref != null) {
				scopeFor(variable.listType.scopeReferencedFields)
			}
		}
	}

@@ -257,15 +256,21 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {

		// ports from parent altsteps
		val altstep = statement.findDesiredParent(AltstepDef)
		if (altstep != null && altstep.spec != null) {
		if (altstep != null) {
			list.addAll(altstep.params.scopeParameterList)
			if (altstep.spec != null) {
				componentScopePorts(altstep.spec.component, list)
			}
		}

		// ports from parent function
		val function = statement.findDesiredParent(FunctionDef)
		if (function != null && function.runsOn != null) {
		if (function != null) {
			list.addAll(function.parameterList.scopeParameterList)
			if (function.runsOn != null) {
				function.runsOn.component.componentScopePorts(list)
			}
		}

		// ports from parent testcase
		val testcase = statement.findDesiredParent(TestcaseDef)
@@ -278,6 +283,24 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		scopeFor(list)
	}

	private def Iterable<EObject> scopeParameterList(FunctionFormalParList parList) {
		val List<EObject> res = newArrayList

		if (parList == null)
			return res;

		for (parameter : parList.params) {
			if (parameter.port != null) {
				res.add(parameter.port)
			} else if (parameter.value != null) { // TODO: FormatlValuePar and FormalPortPar are ambiguous, this hack resolves FormalValuePars as Ports too
				if (parameter.value.type.ref != null && parameter.value.type.ref instanceof PortDef) {
					res.add(parameter.value)
				}
			}
		}
		return res;
	}

	def IScope scope_PortRef_port(PortRef pRef, EReference ref) {
		pRef.scope_communicationPort
	}
@@ -316,6 +339,11 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
			}
		} else if (template instanceof BaseTemplate) {
			template.type.scopeReferencedFields
		} else if (template instanceof SingleVarInstance) {
			val variable = template.findDesiredParent(VarInstance)
			if (variable.listType != null && variable.listType.ref != null) {
				variable.listType.scopeReferencedFields
			}
		}
	}