Loading de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/TTCN3.xtext +15 −14 Original line number Diff line number Diff line Loading @@ -12,7 +12,7 @@ ConstDef: CONSTKEYWORD type=Type defs=ConstList; Type: {Type} PredefinedType | ref=[ReferencedType|IDENTIFIER]; pre=PredefinedType | ref=[ReferencedType|IDENTIFIER]; ArrayDef: (SQUAREOPEN expr+=SingleExpression (RANGEOP range+=SingleExpression)? SQUARECLOSE)+; Loading Loading @@ -72,14 +72,15 @@ AllWithExcepts: {AllWithExcepts} ALLKEYWORD def=ExceptsDef?; ExceptsDef: EXCEPTKEYWORD LBRACKET ExceptSpec RBRACKET; EXCEPTKEYWORD LBRACKET spec=ExceptSpec RBRACKET; ExceptSpec: {ExceptSpec} (element+=ExceptElement SEMICOLON?)*; ExceptElement: ExceptGroupSpec | ExceptTypeDefSpec | ExceptTemplateSpec | ExceptConstSpec | ExceptTestcaseSpec | ExceptAltstepSpec | ExceptFunctionSpec | ExceptSignatureSpec | ExceptModuleParSpec; group=ExceptGroupSpec | type=ExceptTypeDefSpec | template=ExceptTemplateSpec | const=ExceptConstSpec | testcase=ExceptTestcaseSpec | altstep=ExceptAltstepSpec | function=ExceptFunctionSpec | signature=ExceptSignatureSpec | modulePar=ExceptModuleParSpec; IdentifierListOrAll: IdentifierList | ALLKEYWORD; Loading Loading @@ -381,10 +382,10 @@ PortRedirect: PORTREDIRECTSYMBOL (value=ValueSpec sender=SenderSpec? | SenderSpec); SenderSpec: SENDERKEYWORD VariableRef; SENDERKEYWORD variable=VariableRef; ValueSpec: VALUEKEYWORD (VariableRef | (LPAREN specs+=SingleValueSpec (COMMA specs+=SingleValueSpec)* RPAREN)); VALUEKEYWORD (variable=VariableRef | (LPAREN specs+=SingleValueSpec (COMMA specs+=SingleValueSpec)* RPAREN)); SingleValueSpec: variable=VariableRef (ASSIGNMENTCHAR field=[FieldReference|IDENTIFIER] ext+=ExtendedFieldReference*)?; Loading Loading @@ -1048,7 +1049,7 @@ Value: PredefinedValue | ReferencedValue; ReferencedValue: ref=[RefValue|IDENTIFIER] ext+=ExtendedFieldReference*; ref=[RefValue|IDENTIFIER] fieldRefs+=ExtendedFieldReference*; RefValue: SingleConstDef | ModuleParameter | SingleVarInstance | FieldReference | FormalTemplatePar | SingleTempVarInstance; Loading Loading @@ -1153,8 +1154,8 @@ PermutationMatch: PERMUTATIONKEYWORD list=ListOfTemplates; ExtendedFieldReference: DOT (field+=ReferencedValue | type+=PredefinedType) | array+=ArrayOrBitRef | {ExtendedFieldReference} SQUAREOPEN MINUS SQUARECLOSE; DOT (field=[FieldReference|IDENTIFIER] | type=PredefinedType) | array=ArrayOrBitRef | {ExtendedFieldReference} SQUAREOPEN MINUS SQUARECLOSE; LoopConstruct: forStm=ForStatement | whileStm=WhileStatement | doStm=DoWhileStatement; Loading Loading @@ -1229,7 +1230,7 @@ Assignment: ref=VariableRef ASSIGNMENTCHAR (expression=Expression | body=TemplateBody); VariableRef: ref=ReferencedValue ext+=ExtendedFieldReference*; ref=ReferencedValue /*ext+=ExtendedFieldReference*/; // Operators and special chars AddOp returns ecore::EString: Loading @@ -1250,23 +1251,23 @@ RelOp returns ecore::EString: ShiftOp returns ecore::EString: SHIFTLEFT | SHIFTRIGHT | ROTATELEFT | ROTATERIGHT; PredefinedType: PredefinedType returns ecore::EString: BITSTRINGKEYWORD | BOOLEANKEYWORD | CHARSTRINGKEYWORD | UniversalCharString | INTEGERKEYWORD | OCTETSTRINGKEYWORD | HEXSTRINGKEYWORD | VERDICTTYPEKEYWORD | FLOATKEYWORD | ADDRESSKEYWORD | DEFAULTKEYWORD | ANYTYPEKEYWORD; UniversalCharString returns ecore::EString: UNIVERSALKEYWORD CHARSTRINGKEYWORD; CharStringValue: CharStringValue returns ecore::EString: CSTRING | Quadruple; Quadruple returns ecore::EString: CHARKEYWORD LPAREN NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER RPAREN; FloatValue: FloatValue returns ecore::EString: FLOATDOTNOTATION | FLOATENOTATION | NANKEYWORD; RANGEOP: RANGEOP returns ecore::EString: DOT DOT; FLOATDOTNOTATION returns ecore::EString hidden(): Loading de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/common/TTCN3ScopeHelper.xtend +57 −9 Original line number Diff line number Diff line 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.ComponentDef Loading @@ -14,24 +15,30 @@ import de.ugoe.cs.swe.tTCN3.Initial import de.ugoe.cs.swe.tTCN3.ModuleControlPart import de.ugoe.cs.swe.tTCN3.ModuleDefinition import de.ugoe.cs.swe.tTCN3.ModuleDefinitionsList import de.ugoe.cs.swe.tTCN3.ModulePar import de.ugoe.cs.swe.tTCN3.ModuleParDef import de.ugoe.cs.swe.tTCN3.ModuleParameter import de.ugoe.cs.swe.tTCN3.PortElement import de.ugoe.cs.swe.tTCN3.RecordDefNamed import de.ugoe.cs.swe.tTCN3.RecordOfDefNamed import de.ugoe.cs.swe.tTCN3.RefValue import de.ugoe.cs.swe.tTCN3.ReferencedType import de.ugoe.cs.swe.tTCN3.SetDefNamed import de.ugoe.cs.swe.tTCN3.SetOfDefNamed import de.ugoe.cs.swe.tTCN3.SignatureDef import de.ugoe.cs.swe.tTCN3.SingleConstDef import de.ugoe.cs.swe.tTCN3.SingleTempVarInstance import de.ugoe.cs.swe.tTCN3.SingleVarInstance import de.ugoe.cs.swe.tTCN3.StatementBlock import de.ugoe.cs.swe.tTCN3.StructDefBody import de.ugoe.cs.swe.tTCN3.StructFieldDef import de.ugoe.cs.swe.tTCN3.TemplateDef import de.ugoe.cs.swe.tTCN3.TemplateOrValueFormalPar import de.ugoe.cs.swe.tTCN3.TemplateOrValueFormalParList import de.ugoe.cs.swe.tTCN3.TypeDef import de.ugoe.cs.swe.tTCN3.VarList import java.util.ArrayList import org.eclipse.emf.ecore.EObject import de.ugoe.cs.swe.tTCN3.TypeDef import de.ugoe.cs.swe.tTCN3.ModuleParDef import de.ugoe.cs.swe.tTCN3.ModuleParameter import de.ugoe.cs.swe.tTCN3.ModulePar import de.ugoe.cs.swe.tTCN3.RecordOfDefNamed import de.ugoe.cs.swe.tTCN3.SetOfDefNamed import de.ugoe.cs.swe.tTCN3.AltstepDef import de.ugoe.cs.swe.tTCN3.SingleTempVarInstance import de.ugoe.cs.swe.tTCN3.TemplateDef class TTCN3ScopeHelper { Loading Loading @@ -227,4 +234,45 @@ class TTCN3ScopeHelper { componentScopeValueRefs(e, list, searchTimer, searchVar) } } def static void scopeReferencedFields(ReferencedType type, ArrayList<EObject> list) { if (type instanceof RecordDefNamed) { type.body.scopeFieldsStructDefBody(list) } else if (type instanceof SetDefNamed) { type.body.scopeFieldsStructDefBody(list) } else if (type instanceof RecordOfDefNamed) { //TODO: implement! } else if (type instanceof SetOfDefNamed) { //TODO: implement! } } def static void scopeFieldsStructDefBody(StructDefBody body, ArrayList<EObject> list) { for (StructFieldDef f : body.defs) { list.add(f) } } def static void templateFieldScope(TemplateDef template, ArrayList<EObject> list) { val type = template.base.type if (type != null && type.ref != null && typeof(RecordDefNamed).isAssignableFrom(type.ref.class)) { list.addAll((type.ref as RecordDefNamed).body.defs) } if (type != null && type.ref != null && typeof(SignatureDef).isAssignableFrom(type.ref.class)) { list.addAll((type.ref as SignatureDef).paramList.params) } } def static void componentScopePorts(ComponentDef component, ArrayList<EObject> list) { for (ComponentDefList l : component.defs.filter[it.element.port != null]) { for (PortElement e : l.element.port.instances) { list.add(e) } } for (ComponentDef e : component.extends) { componentScopePorts(e, list) } } } de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/scoping/TTCN3ScopeProvider.xtend +32 −53 Original line number Diff line number Diff line Loading @@ -6,9 +6,11 @@ import de.ugoe.cs.swe.tTCN3.ComponentDef import de.ugoe.cs.swe.tTCN3.ComponentDefList import de.ugoe.cs.swe.tTCN3.ControlStatementOrDefList import de.ugoe.cs.swe.tTCN3.EnumDefNamed import de.ugoe.cs.swe.tTCN3.ExtendedFieldReference import de.ugoe.cs.swe.tTCN3.FieldExpressionSpec import de.ugoe.cs.swe.tTCN3.FieldSpec import de.ugoe.cs.swe.tTCN3.ForStatement import de.ugoe.cs.swe.tTCN3.FormalValuePar import de.ugoe.cs.swe.tTCN3.FunctionDef import de.ugoe.cs.swe.tTCN3.GroupDef import de.ugoe.cs.swe.tTCN3.Initial Loading @@ -17,7 +19,6 @@ import de.ugoe.cs.swe.tTCN3.ModuleControlPart import de.ugoe.cs.swe.tTCN3.ModuleDefinition import de.ugoe.cs.swe.tTCN3.ModuleDefinitionsList import de.ugoe.cs.swe.tTCN3.ModuleParDef import de.ugoe.cs.swe.tTCN3.PortElement import de.ugoe.cs.swe.tTCN3.PortOrAny import de.ugoe.cs.swe.tTCN3.PortRef import de.ugoe.cs.swe.tTCN3.RecordDefNamed Loading @@ -27,10 +28,9 @@ import de.ugoe.cs.swe.tTCN3.ReferencedValue import de.ugoe.cs.swe.tTCN3.SendStatement import de.ugoe.cs.swe.tTCN3.SetDefNamed import de.ugoe.cs.swe.tTCN3.SetOfDefNamed import de.ugoe.cs.swe.tTCN3.SignatureDef import de.ugoe.cs.swe.tTCN3.SingleTempVarInstance import de.ugoe.cs.swe.tTCN3.SingleVarInstance import de.ugoe.cs.swe.tTCN3.StatementBlock import de.ugoe.cs.swe.tTCN3.StructDefBody import de.ugoe.cs.swe.tTCN3.StructFieldDef import de.ugoe.cs.swe.tTCN3.StructuredTypeDef import de.ugoe.cs.swe.tTCN3.TTCN3Module Loading @@ -40,8 +40,6 @@ import de.ugoe.cs.swe.tTCN3.TimerRefOrAny import de.ugoe.cs.swe.tTCN3.TypeDef import de.ugoe.cs.swe.tTCN3.UnionDefNamed import de.ugoe.cs.swe.tTCN3.VarInstance import java.util.ArrayList import org.eclipse.emf.ecore.EObject import org.eclipse.emf.ecore.EReference import org.eclipse.xtext.scoping.IScope import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider Loading Loading @@ -160,16 +158,7 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { if (template != null) { template.templateFieldScope(inner) } else if (variable != null && variable.type.ref != null) { val type = variable.type.ref if (type instanceof RecordDefNamed) { type.body.scopeFieldsStructDefBody(inner) } else if (type instanceof SetDefNamed) { type.body.scopeFieldsStructDefBody(inner) } else if (type instanceof RecordOfDefNamed) { //TODO: implement! } else if (type instanceof SetOfDefNamed) { //TODO: implement! } variable.type.ref.scopeReferencedFields(inner) } scopeFor(inner) } Loading @@ -183,37 +172,11 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { template.templateFieldScope(list) } if (variable != null && variable.type.ref != null) { val type = variable.type.ref if (type instanceof RecordDefNamed) { type.body.scopeFieldsStructDefBody(list) } else if (type instanceof SetDefNamed) { type.body.scopeFieldsStructDefBody(list) } else if (type instanceof RecordOfDefNamed) { //TODO: implement! } else if (type instanceof SetOfDefNamed) { //TODO: implement! } variable.type.ref.scopeReferencedFields(list) } scopeFor(list) } def private void scopeFieldsStructDefBody(StructDefBody body, ArrayList<EObject> list) { for (StructFieldDef f : body.defs) { list.add(f) } } def private void templateFieldScope(TemplateDef template, ArrayList<EObject> list) { val type = template.base.type if (type != null && type.ref != null && typeof(RecordDefNamed).isAssignableFrom(type.ref.class)) { list.addAll((type.ref as RecordDefNamed).body.defs) } if (type != null && type.ref != null && typeof(SignatureDef).isAssignableFrom(type.ref.class)) { list.addAll((type.ref as SignatureDef).paramList.params) } } def IScope scope_TimerRefOrAny_ref(TimerRefOrAny variable, EReference ref) { val list = newArrayList var parent = variable.eContainer Loading Loading @@ -262,17 +225,6 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { scopeFor(inner) } def private void componentScopePorts(ComponentDef component, ArrayList<EObject> list) { for (ComponentDefList l : component.defs.filter[it.element.port != null]) { for (PortElement e : l.element.port.instances) { list.add(e) } } for (ComponentDef e : component.extends) { componentScopePorts(e, list) } } def IScope scope_SendStatement_port(SendStatement stm, EReference ref) { val list = newArrayList Loading @@ -297,4 +249,31 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { } scopeFor(list) } def IScope scope_ExtendedFieldReference_field(ExtendedFieldReference ext, EReference ref) { val value = ext.findDesiredParent(typeof(ReferencedValue)) as ReferencedValue val list = newArrayList val idx = value.fieldRefs.indexOf(ext) val type = value.ref if (idx == 0) { if (type instanceof SingleTempVarInstance) { val variable = type.findDesiredParent(typeof(VarInstance)) as VarInstance if (variable != null && variable.type.ref != null) { variable.type.ref.scopeReferencedFields(list) } } } else { val parent = value.fieldRefs.get(idx - 1) if (parent.field instanceof StructFieldDef) { if (parent.field.type != null) { parent.field.type.ref.scopeReferencedFields(list) } } else if (parent.field instanceof FormalValuePar) { // TODO: check and implement if required! } } scopeFor(list) } } Loading
de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/TTCN3.xtext +15 −14 Original line number Diff line number Diff line Loading @@ -12,7 +12,7 @@ ConstDef: CONSTKEYWORD type=Type defs=ConstList; Type: {Type} PredefinedType | ref=[ReferencedType|IDENTIFIER]; pre=PredefinedType | ref=[ReferencedType|IDENTIFIER]; ArrayDef: (SQUAREOPEN expr+=SingleExpression (RANGEOP range+=SingleExpression)? SQUARECLOSE)+; Loading Loading @@ -72,14 +72,15 @@ AllWithExcepts: {AllWithExcepts} ALLKEYWORD def=ExceptsDef?; ExceptsDef: EXCEPTKEYWORD LBRACKET ExceptSpec RBRACKET; EXCEPTKEYWORD LBRACKET spec=ExceptSpec RBRACKET; ExceptSpec: {ExceptSpec} (element+=ExceptElement SEMICOLON?)*; ExceptElement: ExceptGroupSpec | ExceptTypeDefSpec | ExceptTemplateSpec | ExceptConstSpec | ExceptTestcaseSpec | ExceptAltstepSpec | ExceptFunctionSpec | ExceptSignatureSpec | ExceptModuleParSpec; group=ExceptGroupSpec | type=ExceptTypeDefSpec | template=ExceptTemplateSpec | const=ExceptConstSpec | testcase=ExceptTestcaseSpec | altstep=ExceptAltstepSpec | function=ExceptFunctionSpec | signature=ExceptSignatureSpec | modulePar=ExceptModuleParSpec; IdentifierListOrAll: IdentifierList | ALLKEYWORD; Loading Loading @@ -381,10 +382,10 @@ PortRedirect: PORTREDIRECTSYMBOL (value=ValueSpec sender=SenderSpec? | SenderSpec); SenderSpec: SENDERKEYWORD VariableRef; SENDERKEYWORD variable=VariableRef; ValueSpec: VALUEKEYWORD (VariableRef | (LPAREN specs+=SingleValueSpec (COMMA specs+=SingleValueSpec)* RPAREN)); VALUEKEYWORD (variable=VariableRef | (LPAREN specs+=SingleValueSpec (COMMA specs+=SingleValueSpec)* RPAREN)); SingleValueSpec: variable=VariableRef (ASSIGNMENTCHAR field=[FieldReference|IDENTIFIER] ext+=ExtendedFieldReference*)?; Loading Loading @@ -1048,7 +1049,7 @@ Value: PredefinedValue | ReferencedValue; ReferencedValue: ref=[RefValue|IDENTIFIER] ext+=ExtendedFieldReference*; ref=[RefValue|IDENTIFIER] fieldRefs+=ExtendedFieldReference*; RefValue: SingleConstDef | ModuleParameter | SingleVarInstance | FieldReference | FormalTemplatePar | SingleTempVarInstance; Loading Loading @@ -1153,8 +1154,8 @@ PermutationMatch: PERMUTATIONKEYWORD list=ListOfTemplates; ExtendedFieldReference: DOT (field+=ReferencedValue | type+=PredefinedType) | array+=ArrayOrBitRef | {ExtendedFieldReference} SQUAREOPEN MINUS SQUARECLOSE; DOT (field=[FieldReference|IDENTIFIER] | type=PredefinedType) | array=ArrayOrBitRef | {ExtendedFieldReference} SQUAREOPEN MINUS SQUARECLOSE; LoopConstruct: forStm=ForStatement | whileStm=WhileStatement | doStm=DoWhileStatement; Loading Loading @@ -1229,7 +1230,7 @@ Assignment: ref=VariableRef ASSIGNMENTCHAR (expression=Expression | body=TemplateBody); VariableRef: ref=ReferencedValue ext+=ExtendedFieldReference*; ref=ReferencedValue /*ext+=ExtendedFieldReference*/; // Operators and special chars AddOp returns ecore::EString: Loading @@ -1250,23 +1251,23 @@ RelOp returns ecore::EString: ShiftOp returns ecore::EString: SHIFTLEFT | SHIFTRIGHT | ROTATELEFT | ROTATERIGHT; PredefinedType: PredefinedType returns ecore::EString: BITSTRINGKEYWORD | BOOLEANKEYWORD | CHARSTRINGKEYWORD | UniversalCharString | INTEGERKEYWORD | OCTETSTRINGKEYWORD | HEXSTRINGKEYWORD | VERDICTTYPEKEYWORD | FLOATKEYWORD | ADDRESSKEYWORD | DEFAULTKEYWORD | ANYTYPEKEYWORD; UniversalCharString returns ecore::EString: UNIVERSALKEYWORD CHARSTRINGKEYWORD; CharStringValue: CharStringValue returns ecore::EString: CSTRING | Quadruple; Quadruple returns ecore::EString: CHARKEYWORD LPAREN NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER RPAREN; FloatValue: FloatValue returns ecore::EString: FLOATDOTNOTATION | FLOATENOTATION | NANKEYWORD; RANGEOP: RANGEOP returns ecore::EString: DOT DOT; FLOATDOTNOTATION returns ecore::EString hidden(): Loading
de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/common/TTCN3ScopeHelper.xtend +57 −9 Original line number Diff line number Diff line 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.ComponentDef Loading @@ -14,24 +15,30 @@ import de.ugoe.cs.swe.tTCN3.Initial import de.ugoe.cs.swe.tTCN3.ModuleControlPart import de.ugoe.cs.swe.tTCN3.ModuleDefinition import de.ugoe.cs.swe.tTCN3.ModuleDefinitionsList import de.ugoe.cs.swe.tTCN3.ModulePar import de.ugoe.cs.swe.tTCN3.ModuleParDef import de.ugoe.cs.swe.tTCN3.ModuleParameter import de.ugoe.cs.swe.tTCN3.PortElement import de.ugoe.cs.swe.tTCN3.RecordDefNamed import de.ugoe.cs.swe.tTCN3.RecordOfDefNamed import de.ugoe.cs.swe.tTCN3.RefValue import de.ugoe.cs.swe.tTCN3.ReferencedType import de.ugoe.cs.swe.tTCN3.SetDefNamed import de.ugoe.cs.swe.tTCN3.SetOfDefNamed import de.ugoe.cs.swe.tTCN3.SignatureDef import de.ugoe.cs.swe.tTCN3.SingleConstDef import de.ugoe.cs.swe.tTCN3.SingleTempVarInstance import de.ugoe.cs.swe.tTCN3.SingleVarInstance import de.ugoe.cs.swe.tTCN3.StatementBlock import de.ugoe.cs.swe.tTCN3.StructDefBody import de.ugoe.cs.swe.tTCN3.StructFieldDef import de.ugoe.cs.swe.tTCN3.TemplateDef import de.ugoe.cs.swe.tTCN3.TemplateOrValueFormalPar import de.ugoe.cs.swe.tTCN3.TemplateOrValueFormalParList import de.ugoe.cs.swe.tTCN3.TypeDef import de.ugoe.cs.swe.tTCN3.VarList import java.util.ArrayList import org.eclipse.emf.ecore.EObject import de.ugoe.cs.swe.tTCN3.TypeDef import de.ugoe.cs.swe.tTCN3.ModuleParDef import de.ugoe.cs.swe.tTCN3.ModuleParameter import de.ugoe.cs.swe.tTCN3.ModulePar import de.ugoe.cs.swe.tTCN3.RecordOfDefNamed import de.ugoe.cs.swe.tTCN3.SetOfDefNamed import de.ugoe.cs.swe.tTCN3.AltstepDef import de.ugoe.cs.swe.tTCN3.SingleTempVarInstance import de.ugoe.cs.swe.tTCN3.TemplateDef class TTCN3ScopeHelper { Loading Loading @@ -227,4 +234,45 @@ class TTCN3ScopeHelper { componentScopeValueRefs(e, list, searchTimer, searchVar) } } def static void scopeReferencedFields(ReferencedType type, ArrayList<EObject> list) { if (type instanceof RecordDefNamed) { type.body.scopeFieldsStructDefBody(list) } else if (type instanceof SetDefNamed) { type.body.scopeFieldsStructDefBody(list) } else if (type instanceof RecordOfDefNamed) { //TODO: implement! } else if (type instanceof SetOfDefNamed) { //TODO: implement! } } def static void scopeFieldsStructDefBody(StructDefBody body, ArrayList<EObject> list) { for (StructFieldDef f : body.defs) { list.add(f) } } def static void templateFieldScope(TemplateDef template, ArrayList<EObject> list) { val type = template.base.type if (type != null && type.ref != null && typeof(RecordDefNamed).isAssignableFrom(type.ref.class)) { list.addAll((type.ref as RecordDefNamed).body.defs) } if (type != null && type.ref != null && typeof(SignatureDef).isAssignableFrom(type.ref.class)) { list.addAll((type.ref as SignatureDef).paramList.params) } } def static void componentScopePorts(ComponentDef component, ArrayList<EObject> list) { for (ComponentDefList l : component.defs.filter[it.element.port != null]) { for (PortElement e : l.element.port.instances) { list.add(e) } } for (ComponentDef e : component.extends) { componentScopePorts(e, list) } } }
de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/scoping/TTCN3ScopeProvider.xtend +32 −53 Original line number Diff line number Diff line Loading @@ -6,9 +6,11 @@ import de.ugoe.cs.swe.tTCN3.ComponentDef import de.ugoe.cs.swe.tTCN3.ComponentDefList import de.ugoe.cs.swe.tTCN3.ControlStatementOrDefList import de.ugoe.cs.swe.tTCN3.EnumDefNamed import de.ugoe.cs.swe.tTCN3.ExtendedFieldReference import de.ugoe.cs.swe.tTCN3.FieldExpressionSpec import de.ugoe.cs.swe.tTCN3.FieldSpec import de.ugoe.cs.swe.tTCN3.ForStatement import de.ugoe.cs.swe.tTCN3.FormalValuePar import de.ugoe.cs.swe.tTCN3.FunctionDef import de.ugoe.cs.swe.tTCN3.GroupDef import de.ugoe.cs.swe.tTCN3.Initial Loading @@ -17,7 +19,6 @@ import de.ugoe.cs.swe.tTCN3.ModuleControlPart import de.ugoe.cs.swe.tTCN3.ModuleDefinition import de.ugoe.cs.swe.tTCN3.ModuleDefinitionsList import de.ugoe.cs.swe.tTCN3.ModuleParDef import de.ugoe.cs.swe.tTCN3.PortElement import de.ugoe.cs.swe.tTCN3.PortOrAny import de.ugoe.cs.swe.tTCN3.PortRef import de.ugoe.cs.swe.tTCN3.RecordDefNamed Loading @@ -27,10 +28,9 @@ import de.ugoe.cs.swe.tTCN3.ReferencedValue import de.ugoe.cs.swe.tTCN3.SendStatement import de.ugoe.cs.swe.tTCN3.SetDefNamed import de.ugoe.cs.swe.tTCN3.SetOfDefNamed import de.ugoe.cs.swe.tTCN3.SignatureDef import de.ugoe.cs.swe.tTCN3.SingleTempVarInstance import de.ugoe.cs.swe.tTCN3.SingleVarInstance import de.ugoe.cs.swe.tTCN3.StatementBlock import de.ugoe.cs.swe.tTCN3.StructDefBody import de.ugoe.cs.swe.tTCN3.StructFieldDef import de.ugoe.cs.swe.tTCN3.StructuredTypeDef import de.ugoe.cs.swe.tTCN3.TTCN3Module Loading @@ -40,8 +40,6 @@ import de.ugoe.cs.swe.tTCN3.TimerRefOrAny import de.ugoe.cs.swe.tTCN3.TypeDef import de.ugoe.cs.swe.tTCN3.UnionDefNamed import de.ugoe.cs.swe.tTCN3.VarInstance import java.util.ArrayList import org.eclipse.emf.ecore.EObject import org.eclipse.emf.ecore.EReference import org.eclipse.xtext.scoping.IScope import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider Loading Loading @@ -160,16 +158,7 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { if (template != null) { template.templateFieldScope(inner) } else if (variable != null && variable.type.ref != null) { val type = variable.type.ref if (type instanceof RecordDefNamed) { type.body.scopeFieldsStructDefBody(inner) } else if (type instanceof SetDefNamed) { type.body.scopeFieldsStructDefBody(inner) } else if (type instanceof RecordOfDefNamed) { //TODO: implement! } else if (type instanceof SetOfDefNamed) { //TODO: implement! } variable.type.ref.scopeReferencedFields(inner) } scopeFor(inner) } Loading @@ -183,37 +172,11 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { template.templateFieldScope(list) } if (variable != null && variable.type.ref != null) { val type = variable.type.ref if (type instanceof RecordDefNamed) { type.body.scopeFieldsStructDefBody(list) } else if (type instanceof SetDefNamed) { type.body.scopeFieldsStructDefBody(list) } else if (type instanceof RecordOfDefNamed) { //TODO: implement! } else if (type instanceof SetOfDefNamed) { //TODO: implement! } variable.type.ref.scopeReferencedFields(list) } scopeFor(list) } def private void scopeFieldsStructDefBody(StructDefBody body, ArrayList<EObject> list) { for (StructFieldDef f : body.defs) { list.add(f) } } def private void templateFieldScope(TemplateDef template, ArrayList<EObject> list) { val type = template.base.type if (type != null && type.ref != null && typeof(RecordDefNamed).isAssignableFrom(type.ref.class)) { list.addAll((type.ref as RecordDefNamed).body.defs) } if (type != null && type.ref != null && typeof(SignatureDef).isAssignableFrom(type.ref.class)) { list.addAll((type.ref as SignatureDef).paramList.params) } } def IScope scope_TimerRefOrAny_ref(TimerRefOrAny variable, EReference ref) { val list = newArrayList var parent = variable.eContainer Loading Loading @@ -262,17 +225,6 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { scopeFor(inner) } def private void componentScopePorts(ComponentDef component, ArrayList<EObject> list) { for (ComponentDefList l : component.defs.filter[it.element.port != null]) { for (PortElement e : l.element.port.instances) { list.add(e) } } for (ComponentDef e : component.extends) { componentScopePorts(e, list) } } def IScope scope_SendStatement_port(SendStatement stm, EReference ref) { val list = newArrayList Loading @@ -297,4 +249,31 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { } scopeFor(list) } def IScope scope_ExtendedFieldReference_field(ExtendedFieldReference ext, EReference ref) { val value = ext.findDesiredParent(typeof(ReferencedValue)) as ReferencedValue val list = newArrayList val idx = value.fieldRefs.indexOf(ext) val type = value.ref if (idx == 0) { if (type instanceof SingleTempVarInstance) { val variable = type.findDesiredParent(typeof(VarInstance)) as VarInstance if (variable != null && variable.type.ref != null) { variable.type.ref.scopeReferencedFields(list) } } } else { val parent = value.fieldRefs.get(idx - 1) if (parent.field instanceof StructFieldDef) { if (parent.field.type != null) { parent.field.type.ref.scopeReferencedFields(list) } } else if (parent.field instanceof FormalValuePar) { // TODO: check and implement if required! } } scopeFor(list) } }