Loading de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/TTCN3.xtext +16 −11 Original line number Diff line number Diff line Loading @@ -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?; Loading Loading @@ -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]; Loading Loading @@ -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 | Loading @@ -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?; Loading @@ -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?; Loading Loading @@ -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?; Loading Loading @@ -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; Loading Loading @@ -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) Loading de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/scoping/TTCN3ScopeProvider.xtend +63 −35 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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) { Loading @@ -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) { Loading Loading @@ -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) } } } Loading Loading @@ -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) Loading @@ -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 } Loading Loading @@ -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 } } } Loading Loading
de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/TTCN3.xtext +16 −11 Original line number Diff line number Diff line Loading @@ -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?; Loading Loading @@ -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]; Loading Loading @@ -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 | Loading @@ -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?; Loading @@ -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?; Loading Loading @@ -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?; Loading Loading @@ -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; Loading Loading @@ -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) Loading
de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/scoping/TTCN3ScopeProvider.xtend +63 −35 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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) { Loading @@ -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) { Loading Loading @@ -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) } } } Loading Loading @@ -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) Loading @@ -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 } Loading Loading @@ -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 } } } Loading