Loading de.ugoe.cs.swe.T3Q/src/de/ugoe/cs/swe/T3Q/T3Q.java +1 −1 Original line number Diff line number Diff line Loading @@ -33,7 +33,7 @@ import de.ugoe.cs.swe.scoping.TTCN3GlobalScopeProvider; public class T3Q { //TODO: externalise meta-data private static String versionNumber = "v2.1.0b2"; private static String supportedTTCN3Version = "4.7.1"; private static String supportedTTCN3Version = "4.8.1"; // set during automated server builds -> no longer displayed or used.. private static String buildStamp = "---BUILD_STAMP---"; public static QualityCheckProfile activeProfile = null; Loading de.ugoe.cs.swe.TTCN3.ui/src/de/ugoe/cs/swe/ui/ScopeRebuild.java +51 −27 Original line number Diff line number Diff line Loading @@ -70,8 +70,8 @@ public class ScopeRebuild extends BuilderParticipant { // // //generator.doGenerate(context.getResourceSet(), fileSystemAccess); // } boolean reset = false; if (reset) { TTCN3GlobalScopeProvider.RESOURCES.clear(); TTCN3GlobalScopeProvider.NAMED_MODULES.clear(); TTCN3GlobalScopeProvider.EXPORTED_OBJECTS.clear(); Loading Loading @@ -105,6 +105,30 @@ public class ScopeRebuild extends BuilderParticipant { e.printStackTrace(); } } } else { Resource r = resource; TTCN3Module module = CommonHelper.getModule(r); //TODO: remove old resource? -> seems like no need TTCN3GlobalScopeProvider.RESOURCES.add(r); TTCN3GlobalScopeProvider.NAMED_MODULES.put(module.getName(), module); TTCN3GlobalScopeProvider.initExportedObjects(r); PreAnalyzer p = new PreAnalyzer(r); try { p.call(); } catch (Exception e) { e.printStackTrace(); } //TODO: refreshing a bit laggy // //TODO: rerun on others? // for (int i = 0; i < TTCN3GlobalScopeProvider.RESOURCES.size(); i++) { // PreAnalyzer pa = new PreAnalyzer(TTCN3GlobalScopeProvider.RESOURCES.get(i)); // try { // pa.call(); // } catch (Exception e) { // e.printStackTrace(); // } // } } TTCN3StatisticsProvider.getInstance().setPreAnalyzingCompleted(true); buildSemaphor.set(false); Loading de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/TTCN3.xtext +94 −40 Original line number Diff line number Diff line Loading @@ -262,7 +262,7 @@ GotoStatement: GOTOKEYWORD name=IDENTIFIER; ReturnStatement: {ReturnStatement} RETURNKEYWORD (template=InLineTemplate | expression=Expression)?; {ReturnStatement} RETURNKEYWORD (template=TemplateInstance)?; InterleavedConstruct: INTERLEAVEDKEYWORD LBRACKET InterleavedGuardList RBRACKET; Loading Loading @@ -335,7 +335,7 @@ CheckPortOpsPresent: PortReceiveOp | PortGetCallOp | PortGetReplyOp | PortCatchOp; PortGetReplyOp: {PortGetReplyOp} GETREPLYOPKEYWORD (LPAREN template=InLineTemplate value=ValueMatchSpec? RPAREN)? from=FromClause? {PortGetReplyOp} GETREPLYOPKEYWORD (LPAREN template=TemplateInstance value=ValueMatchSpec? RPAREN)? from=FromClause? redirect=PortRedirectWithValueAndParam?; PortRedirectWithValueAndParam: Loading @@ -345,7 +345,7 @@ RedirectWithValueAndParamSpec: value=ValueSpec param=ParamSpec? sender=SenderSpec? index=IndexSpec? | redirect=RedirectWithParamSpec; ValueMatchSpec: VALUEKEYWORD template=InLineTemplate; VALUEKEYWORD template=TemplateInstance; CatchStatement: PortOrAny DOT catch=PortCatchOp; Loading @@ -354,13 +354,13 @@ PortCatchOp: {PortCatchOp} CATCHOPKEYWORD (LPAREN param=CatchOpParameter RPAREN)? from=FromClause? redirect=PortRedirect?; CatchOpParameter: signature=Signature COMMA template=InLineTemplate | {CatchOpParameter} TIMEOUTKEYWORD; signature=Signature COMMA template=TemplateInstance | {CatchOpParameter} TIMEOUTKEYWORD; GetCallStatement: PortOrAny DOT call=PortGetCallOp; PortGetCallOp: {PortGetCallOp} GETCALLOPKEYWORD (LPAREN template=InLineTemplate RPAREN)? from=FromClause? {PortGetCallOp} GETCALLOPKEYWORD (LPAREN template=TemplateInstance RPAREN)? from=FromClause? redirect=PortRedirectWithParam?; PortRedirectWithParam: Loading Loading @@ -392,7 +392,7 @@ TriggerStatement: PortOrAny DOT trigger=PortTriggerOp; PortTriggerOp: {PortTriggerOp} TRIGGEROPKEYWORD (LPAREN template=InLineTemplate RPAREN)? from=FromClause? redirect=PortRedirect?; {PortTriggerOp} TRIGGEROPKEYWORD (LPAREN template=TemplateInstance RPAREN)? from=FromClause? redirect=PortRedirect?; ReceiveStatement: any=PortOrAny DOT receive=PortReceiveOp; Loading @@ -403,13 +403,13 @@ PortOrAny: variable=VariableRef)); PortReceiveOp: {PortReceiveOp} RECEIVEOPKEYWORD (LPAREN template=InLineTemplate RPAREN)? from=FromClause? redirect=PortRedirect?; {PortReceiveOp} RECEIVEOPKEYWORD (LPAREN template=TemplateInstance RPAREN)? from=FromClause? redirect=PortRedirect?; FromClause: {FromClause} FROMKEYWORD (template=InLineTemplate | addresses=AddressRefList | ANYKEYWORD COMPONENTKEYWORD); {FromClause} FROMKEYWORD (template=TemplateInstance | addresses=AddressRefList | ANYKEYWORD COMPONENTKEYWORD); AddressRefList: LPAREN templates+=InLineTemplate (COMMA templates+=InLineTemplate)* RPAREN; LPAREN templates+=TemplateInstance (COMMA templates+=TemplateInstance)* RPAREN; PortRedirect: PORTREDIRECTSYMBOL ((value=ValueSpec sender=SenderSpec? index=IndexSpec?) | (sender=SenderSpec index=IndexSpec?) | Loading Loading @@ -442,9 +442,13 @@ FunctionInstance: // ext ref ok? // usage / semantic of PreDefFunctionIdentifier? FunctionRef: FunctionDef | ExtFunctionDef | BaseTemplate | AltstepDef; FunctionDef | ExtFunctionDef | BaseTemplate | AltstepDef | Enumeration; //(IDENTIFIER DOT)? IDENTIFIER; TemplateRef: BaseTemplate | Enumeration | FormalTemplatePar | FormalValuePar | SingleTempVarInstance; FunctionActualParList: (params+=FunctionActualPar (COMMA params+=FunctionActualPar)*) | (asssign+=FunctionActualParAssignment (COMMA asssign+=FunctionActualParAssignment)*); Loading @@ -469,7 +473,7 @@ TimerRefAssignment: timer=[FormalTimerPar|IDENTIFIER] ASSIGNMENTCHAR value=[TimerVarInstance|IDENTIFIER]; FunctionActualPar: template=InLineTemplate | component=ComponentRef | timer=[TimerVarInstance|IDENTIFIER] | port=PortRef | template=TemplateInstance | component=ComponentRef | timer=[TimerVarInstance|IDENTIFIER] | port=PortRef | {FunctionActualPar} MINUS; ComponentRef: Loading Loading @@ -522,7 +526,7 @@ FunctionStatement: test=TestcaseOperation; TestcaseOperation: {TestcaseOperation} TESTCASEKEYWORD DOT STOPKEYWORD (LPAREN ((txt+=FREE_TEXT | template+=InLineTemplate) COMMA?)* {TestcaseOperation} TESTCASEKEYWORD DOT STOPKEYWORD (LPAREN (log+=LogItem COMMA?)* RPAREN)?; SetLocalVerdict: Loading @@ -545,7 +549,7 @@ ComponentReferenceOrLiteral: ref=ComponentOrDefaultReference | {ComponentReferenceOrLiteral} MTCKEYWORD | {ComponentReferenceOrLiteral} SELFOP; StartTCStatement: ref=ComponentOrDefaultReference DOT STARTKEYWORD LPAREN function=FunctionInstance RPAREN; ref=ComponentOrDefaultReference DOT STARTKEYWORD LPAREN (function=FunctionInstance | altstep=AltstepInstance) RPAREN; UnmapStatement: {UnmapStatement} UNMAPKEYWORD (spec=SingleConnectionSpec clause=ParamClause? | spec=AllConnectionsSpec Loading Loading @@ -610,16 +614,16 @@ RaiseStatement: port=[FormalPortAndValuePar|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortRaiseOp; PortRaiseOp: RAISEKEYWORD LPAREN signature=[SignatureDef|QualifiedIdentifier] COMMA template=InLineTemplate RPAREN to=ToClause?; RAISEKEYWORD LPAREN signature=[SignatureDef|QualifiedIdentifier] COMMA template=TemplateInstance RPAREN to=ToClause?; ReplyStatement: port=[FormalPortAndValuePar|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortReplyOp; PortReplyOp: REPLYKEYWORD LPAREN template=InLineTemplate value=ReplyValue? RPAREN to=ToClause?; REPLYKEYWORD LPAREN template=TemplateInstance value=ReplyValue? RPAREN to=ToClause?; ReplyValue: VALUEKEYWORD expr=Expression; VALUEKEYWORD body=TemplateBody; CallStatement: port=[FormalPortAndValuePar|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortCallOp body=PortCallBody?; Loading @@ -628,7 +632,7 @@ PortCallOp: CALLOPKEYWORD LPAREN params=CallParameters RPAREN to=ToClause?; CallParameters: template=InLineTemplate (COMMA value=CallTimerValue)?; template=TemplateInstance (COMMA value=CallTimerValue)?; CallTimerValue: expr=Expression | {CallTimerValue} NOWAITKEYWORD; Loading @@ -653,10 +657,10 @@ SendStatement: port=[FormalPortAndValuePar|IDENTIFIER] arryRefs+=ArrayOrBitRef* DOT send=PortSendOp; PortSendOp: SENDOPKEYWORD LPAREN template=InLineTemplate RPAREN to=ToClause?; SENDOPKEYWORD LPAREN template=TemplateInstance RPAREN to=ToClause?; ToClause: {ToClause} TOKEYWORD (template=InLineTemplate | ref=AddressRefList | ALLKEYWORD COMPONENTKEYWORD); {ToClause} TOKEYWORD (template=TemplateInstance | ref=AddressRefList | ALLKEYWORD COMPONENTKEYWORD); FunctionDefList: (locDef=FunctionLocalDef | locInst=FunctionLocalInst) ws=WithStatement? sc=SEMICOLON?; Loading Loading @@ -849,7 +853,15 @@ EnumerationList: enums+=Enumeration (COMMA enums+=Enumeration)*; Enumeration: name=IDENTIFIER (LPAREN MINUS? NUMBER RPAREN)?; name=IDENTIFIER (LPAREN values+=IntegerValueOrRange (COMMA values+=IntegerValueOrRange)* RPAREN)?; IntegerValueOrRange: lower=IntegerValue (RANGEOP upper=IntegerValue)? ; IntegerValue: MINUS? NUMBER ; UnionFieldDef: (type=Type | nestedType=NestedTypeDef) name=IDENTIFIER array=ArrayDef? subType=SubTypeSpec?; Loading Loading @@ -909,7 +921,7 @@ SingleTempVarInstance: name=IDENTIFIER array=ArrayDef? (ac=ASSIGNMENTCHAR template=TemplateBody)?; /// changed Signature -> Type InLineTemplate: TemplateInstance: (type=Type COLON)? (derived=DerivedRefWithParList ASSIGNMENTCHAR)? template=TemplateBody; DerivedRefWithParList: Loading @@ -928,30 +940,53 @@ FieldSpec: mod=FUZZY_MODIFIER? ref=[FieldReference|IDENTIFIER] ASSIGNMENTCHAR (body=TemplateBody | MINUS); SimpleSpec: expr=SingleExpression (STRINGOP spec=SimpleTemplateSpec)? | spec=SimpleTemplateSpec; //TODO: flip order in case (with predicate?), // but test performance and correctness implications thoroughly // -> seems to be necessary for enumeration with extension? // => // spec=SimpleTemplateSpec // | =>expr=SingleExpression (STRINGOP spec=SimpleTemplateSpec)? | spec=SimpleTemplateSpec ; SimpleTemplateSpec: expr=SingleTemplateExpression (STRINGOP spec=SimpleSpec)?; SingleTemplateExpression: symbol=MatchingSymbol | list=TemplateRefWithParList extended=ExtendedFieldReference?; //TODO: switch back order? // -> keep for now otherwise it gets matched as TemplateRef with ParList // -> test performance and correctness -> overshoots, treats everything as enum symbol=MatchingSymbol | (list=TemplateRefWithParList extended=ExtendedFieldReference?) | =>(enumeration=[Enumeration|QualifiedIdentifier] extension=EnumTemplateExtension) // DONE: is it supposed to be a reference? -> yes ; EnumTemplateExtension: {EnumTemplateExtension} LPAREN template+=TemplateBody (COMMA template+=TemplateBody)* RPAREN ; // TODO: test this! TemplateRefWithParList: template=[BaseTemplate|QualifiedIdentifier] list=TemplateActualParList?; template=[TemplateRef|QualifiedIdentifier] list=TemplateActualParList?; TemplateActualParList: {TemplateActualParList} LPAREN (actual+=TemplateInstanceActualPar (COMMA actual+=TemplateInstanceActualPar)* | assign+=TemplateInstanceAssignment (COMMA assign+=TemplateInstanceAssignment)*)? RPAREN; MatchingSymbol: //TODO: switched to RangeDef instead of Range -> added both -> removed again // -> roll back once EnumTemplateExpression works properly? -> no need now complement=Complement | {MatchingSymbol} any=QUESTIONMARK qwlm=WildcardLengthMatch? | {MatchingSymbol} anyornone=STAR swlm=WildcardLengthMatch? | range=Range | {MatchingSymbol} BIT_STRING_OR_MATCH | {MatchingSymbol} HEX_STRING_OR_MATCH | {MatchingSymbol} OCTET_STRING_OR_MATCH | string=CharStringMatch | subset=SubsetMatch | superset=SupersetMatch | decoded=DecodedContentMatch | templates=ListOfTemplates; DecodedContentMatch: DECODED_MATCH ( LPAREN Expression RPAREN )? template=InLineTemplate DECODED_MATCH ( LPAREN Expression RPAREN )? template=TemplateInstance ; SubsetMatch: Loading @@ -976,10 +1011,10 @@ TemplateOps: MatchOp | ValueofOp; MatchOp: MATCHKEYWORD LPAREN expr=Expression COMMA template=InLineTemplate RPAREN; MATCHKEYWORD LPAREN expr=Expression COMMA template=TemplateInstance RPAREN; ValueofOp: VALUEOFKEYWORD LPAREN template=InLineTemplate RPAREN; VALUEOFKEYWORD LPAREN template=TemplateInstance RPAREN; ConfigurationOps: create=CreateOp | {ConfigurationOps} SELFOP | {ConfigurationOps} SYSTEMKEYWORD | {ConfigurationOps} MTCKEYWORD | Loading Loading @@ -1012,10 +1047,10 @@ Signature: ref=[SignatureDef|QualifiedIdentifier]; TemplateInstanceAssignment: name=[BaseTemplate|IDENTIFIER] ASSIGNMENTCHAR template=InLineTemplate; name=[BaseTemplate|IDENTIFIER] ASSIGNMENTCHAR template=TemplateInstance; TemplateInstanceActualPar: InLineTemplate | {TemplateInstanceActualPar} MINUS; TemplateInstance | {TemplateInstanceActualPar} MINUS; TemplateRestriction: LPAREN (omit=OMITKEYWORD | value=VALUEKEYWORD | present=PRESENTKEYWORD) RPAREN; Loading @@ -1030,7 +1065,7 @@ LogStatement: // This way seems to work and allows parsing constructs like: // log ( "*** f_1: INFO: OK - random value = " & bit2str(i1) & " ***" ); LogItem: /*text=FREE_TEXT |*/ template=InLineTemplate; /*text=FREE_TEXT |*/ template=TemplateInstance; Expression: SingleExpression | CompoundExpression; Loading Loading @@ -1113,7 +1148,11 @@ Value: predef=PredefinedValue | ref=ReferencedValue; ReferencedValue: head=Head fields+=ExtendedFieldReference*; head=Head (fields+=ExtendedFieldReference+ | enumRef=ExtendedEnumReference)?; ExtendedEnumReference: LPAREN value=IntegerValue RPAREN ; RefValueHead: RefValue | ModuleOrGroup; Loading Loading @@ -1146,7 +1185,9 @@ DecodedFieldType: // SingleVarInstance contained in TimerVarInstance (according to EBNF rules) RefValue: ModuleParameter | FieldReference | FormalTemplatePar | SingleTempVarInstance | FunctionRef | TimerVarInstance | FormalPortPar | PortElement | NamedObject; FunctionRef | TimerVarInstance | FormalPortPar | PortElement | NamedObject // | Enumeration //TODO: needed? ; // IDENTIFIER omitted PredefinedValue: Loading Loading @@ -1289,12 +1330,17 @@ SelectCaseConstruct: SELECTKEYWORD (union=UNIONKEYWORD)? LPAREN expression=SingleExpression RPAREN body=SelectCaseBody; SelectCaseBody: LBRACKET (cases+=SelectCase)+ RBRACKET; LBRACKET (cases+=SelectCase)+ else=CaseElse? RBRACKET; SelectCase: CASEKEYWORD (LPAREN template+=InLineTemplate (COMMA template+=InLineTemplate)* RPAREN | else=ELSEKEYWORD) //TODO: check extra else?! -> likely redundant.. -> report issue CASEKEYWORD (LPAREN template+=TemplateInstance (COMMA template+=TemplateInstance)* RPAREN | else=ELSEKEYWORD) statement=StatementBlock; CaseElse: CASEKEYWORD ELSEKEYWORD statement=StatementBlock ; FunctionDef: FUNCTIONKEYWORD det=DETERMINISTIC_MODIFIER? name=IDENTIFIER LPAREN parameterList=FunctionFormalParList? RPAREN runsOn=RunsOnSpec? mtc=MtcSpec? Loading @@ -1321,7 +1367,7 @@ FormalPortPar: FormalTemplatePar: (inOut=(INPARKEYWORD | OUTPARKEYWORD | INOUTPARKEYWORD))? (TEMPLATEKEYWORD | restriction=RestrictedTemplate) (mod=LAZY_MODIFIER | mod=FUZZY_MODIFIER)? type=Type name=IDENTIFIER (ASSIGNMENTCHAR (templ=InLineTemplate | MINUS))?; (mod=LAZY_MODIFIER | mod=FUZZY_MODIFIER)? type=Type name=IDENTIFIER (ASSIGNMENTCHAR (templ=TemplateInstance | MINUS))?; RunsOnSpec: RUNSKEYWORD ONKEYWORD component=[ComponentDef|QualifiedIdentifier]; Loading @@ -1329,9 +1375,12 @@ RunsOnSpec: ReturnType: RETURNKEYWORD (template=TEMPLATEKEYWORD | restricted=RestrictedTemplate)? type=Type; //TODO: try to remove extra=ExtraMatchingAttributes? from this rule //TODO: try to remove extra=ExtraMatchingAttributes? from this rule -> removed? // where does it come from? it is already in TemplateBody, perhaps it was parsed as expression by default? Assignment: ref=VariableRef ASSIGNMENTCHAR (body=TemplateBody | expression=Expression) extra=ExtraMatchingAttributes?; ref=VariableRef ASSIGNMENTCHAR (body=TemplateBody) // extra=ExtraMatchingAttributes? ; VariableRef: ref=ReferencedValue /*ext+=ExtendedFieldReference*/; Loading Loading @@ -2019,13 +2068,13 @@ terminal fragment CHAR: DOLLAR | SINGLEQUOTE | '|' | SEMICOLON | CIRCUMFLEX | '~'; terminal HSTRING returns ecore::EString: SINGLEQUOTE HEX* SINGLEQUOTE 'H'; SINGLEQUOTE (HEX | BINSPACE)* SINGLEQUOTE 'H'; terminal OSTRING returns ecore::EString: SINGLEQUOTE OCT* SINGLEQUOTE 'O'; SINGLEQUOTE (OCT | BINSPACE)* SINGLEQUOTE 'O'; terminal BSTRING returns ecore::EString: SINGLEQUOTE BIN* SINGLEQUOTE 'B'; SINGLEQUOTE (BIN | BINSPACE)* SINGLEQUOTE 'B'; terminal fragment UPPERALPHA: 'A'..'Z'; Loading @@ -2036,6 +2085,11 @@ terminal fragment LOWERALPHA: terminal fragment BIN: '0' | '1'; //TODO: conflict? move after? merge with WS? terminal BINSPACE: ' ' | '\n' ; terminal fragment ALPHA: UPPERALPHA | LOWERALPHA; Loading de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/scoping/TTCN3ScopeProvider.xtend +43 −4 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import de.ugoe.cs.swe.tTCN3.FunctionFormalParList import de.ugoe.cs.swe.tTCN3.FunctionInstance import de.ugoe.cs.swe.tTCN3.GroupDef import de.ugoe.cs.swe.tTCN3.Head import de.ugoe.cs.swe.tTCN3.InLineTemplate import de.ugoe.cs.swe.tTCN3.Initial import de.ugoe.cs.swe.tTCN3.ModuleControlBody import de.ugoe.cs.swe.tTCN3.ModuleControlPart Loading Loading @@ -87,6 +86,9 @@ import de.ugoe.cs.swe.tTCN3.PortReceiveOp import de.ugoe.cs.swe.tTCN3.Value import org.eclipse.xtext.nodemodel.util.NodeModelUtils import de.ugoe.cs.swe.tTCN3.Assignment import de.ugoe.cs.swe.tTCN3.TemplateInstance import de.ugoe.cs.swe.tTCN3.TemplateRefWithParList import de.ugoe.cs.swe.tTCN3.SingleTemplateExpression //TODO: switch to TTCN3LocalScopeProvider as base class? class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { Loading Loading @@ -207,7 +209,7 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { private def Iterable<EObject> scopeListFieldExpressionList(EObject field) { val module = field.findDesiredParent(TTCN3Module) val inlineTemplate = field.findDesiredParent(InLineTemplate) val inlineTemplate = field.findDesiredParent(TemplateInstance) val template = field.findDesiredParent(TemplateDef) val variable = field.findDesiredParent(VarInstance) val eField = field.findDesiredParent(FieldExpressionSpec) Loading Loading @@ -302,6 +304,13 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { field.scopeFieldExpressionList } def IScope scope_SingleTemplateExpression_enumeration(SingleTemplateExpression it, EReference enumeration) { var list = <EObject>newArrayList list.addAll(containedElementsOfType(TTCN3Package.eINSTANCE.enumeration)) list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.enumeration)) scopeFor(list) } def IScope scope_SingleValueSpec_fieldRef(SingleValueSpec spec, EReference ref) { //TODO: generalise / extract var ArrayList<EObject> list = newArrayList Loading @@ -323,6 +332,18 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { } //TODO: others? } } else if (inlineTemplate.template !== null && inlineTemplate.template.simple !== null && inlineTemplate.template.simple.spec !== null && inlineTemplate.template.simple.spec.expr !== null && inlineTemplate.template.simple.spec.expr.list !== null ) { val t = inlineTemplate.template.simple.spec.expr.list.template if (t instanceof BaseTemplate) { list.addAll(t.type.ref.scopeReferencedFields) } else if (t instanceof FormalTemplatePar) { list.addAll(t.type.ref.scopeReferencedFields) } } scopeFor(list) } Loading Loading @@ -590,6 +611,8 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.extFunctionDef)) list.addAll(containedElementsOfType(TTCN3Package.eINSTANCE.altstepDef)) list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.altstepDef)) list.addAll(containedElementsOfType(TTCN3Package.eINSTANCE.enumeration)) list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.enumeration)) //TODO: others? //TODO: hack for templates, need to be parsed differently in the first place, but not sure how.. var containedTemplates = containedElementsOfType(TTCN3Package.eINSTANCE.moduleDefinition) Loading @@ -602,6 +625,22 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { return s } def IScope scope_TemplateRefWithParList_template(TemplateRefWithParList it, EReference template) { var list = <EObject>newArrayList list.addAll(containedElementsOfType(TTCN3Package.eINSTANCE.enumeration)) list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.enumeration)) var container = findDesiredParent(ModuleDefinition) list.addAll(container.eAllOfType(TTCN3Package.eINSTANCE.formalTemplatePar.instanceClass as Class<? extends EObject>)) list.addAll(container.eAllOfType(TTCN3Package.eINSTANCE.formalValuePar.instanceClass as Class<? extends EObject>)) var containedTemplates = containedElementsOfType(TTCN3Package.eINSTANCE.moduleDefinition) .filter[(it as ModuleDefinition).def instanceof TemplateDef] .map[((it as ModuleDefinition).def as TemplateDef).base] list.addAll(containedTemplates) var importedTemplates = importedElementsOfType(TTCN3Package.eINSTANCE.baseTemplate) list.addAll(importedTemplates) var s = scopeFor(list) return s } //TODO: reuse and cache //TODO: check in IDE.. may need to be deactivated Loading de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/validation/CodeStyleValidator.xtend +19 −6 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ import de.ugoe.cs.swe.tTCN3.FunctionInstance import de.ugoe.cs.swe.tTCN3.GotoStatement import de.ugoe.cs.swe.tTCN3.GroupDef import de.ugoe.cs.swe.tTCN3.ImportDef import de.ugoe.cs.swe.tTCN3.InLineTemplate import de.ugoe.cs.swe.tTCN3.LabelStatement import de.ugoe.cs.swe.tTCN3.ModuleControlBody import de.ugoe.cs.swe.tTCN3.ModuleDefinition Loading Loading @@ -105,6 +104,7 @@ import static extension de.ugoe.cs.swe.common.TTCN3ReferenceHelper.* import static extension de.ugoe.cs.swe.common.TTCN3ScopeHelper.* import static extension org.eclipse.emf.ecore.util.EcoreUtil.* import static extension org.eclipse.xtext.EcoreUtil2.* import de.ugoe.cs.swe.tTCN3.TemplateInstance class CheckDefinitionComeFirstParameter { public boolean hasOtherDefinitions Loading Loading @@ -263,7 +263,7 @@ class CodeStyleValidator extends AbstractDeclarativeValidator { } @Check def checkInlineTemplates(InLineTemplate template) { def checkInlineTemplates(TemplateInstance template) { if (!activeProfile.checkInlineTemplates) return; Loading Loading @@ -459,7 +459,20 @@ class CodeStyleValidator extends AbstractDeclarativeValidator { //TODO: export to reusable debugging dump //val debugNode = NodeModelUtils.findActualNodeFor(r.eContainer) //println(debugNode.startLine+" : "+debugNode.text) var v = (r.eContainer as ReferencedValue).referencedValue.name //TODO: fix casting issue var v = ''; val c = r.eContainer if (c instanceof ReferencedValue) { v = c.referencedValue.name } else if (c instanceof SingleTemplateExpression) { if (c.enumeration !== null) { v = c.enumeration.name //TODO: return? } else { //TODO: return? } // v = c. } //DONE: distinguish between cases based on the assignment //negative distinction => exit scenarios Loading Loading @@ -500,9 +513,9 @@ class CodeStyleValidator extends AbstractDeclarativeValidator { } //expression if (assignment.expression !== null) { // if (assignment.expression !== null) { //handle? } // } //extra? //TODO: handle? Loading Loading @@ -1341,7 +1354,7 @@ class CodeStyleValidator extends AbstractDeclarativeValidator { } @Check def checkNoInlineTemplates(InLineTemplate template) { def checkNoInlineTemplates(TemplateInstance template) { if (!activeProfile.checkNoInlineTemplates) return; Loading Loading
de.ugoe.cs.swe.T3Q/src/de/ugoe/cs/swe/T3Q/T3Q.java +1 −1 Original line number Diff line number Diff line Loading @@ -33,7 +33,7 @@ import de.ugoe.cs.swe.scoping.TTCN3GlobalScopeProvider; public class T3Q { //TODO: externalise meta-data private static String versionNumber = "v2.1.0b2"; private static String supportedTTCN3Version = "4.7.1"; private static String supportedTTCN3Version = "4.8.1"; // set during automated server builds -> no longer displayed or used.. private static String buildStamp = "---BUILD_STAMP---"; public static QualityCheckProfile activeProfile = null; Loading
de.ugoe.cs.swe.TTCN3.ui/src/de/ugoe/cs/swe/ui/ScopeRebuild.java +51 −27 Original line number Diff line number Diff line Loading @@ -70,8 +70,8 @@ public class ScopeRebuild extends BuilderParticipant { // // //generator.doGenerate(context.getResourceSet(), fileSystemAccess); // } boolean reset = false; if (reset) { TTCN3GlobalScopeProvider.RESOURCES.clear(); TTCN3GlobalScopeProvider.NAMED_MODULES.clear(); TTCN3GlobalScopeProvider.EXPORTED_OBJECTS.clear(); Loading Loading @@ -105,6 +105,30 @@ public class ScopeRebuild extends BuilderParticipant { e.printStackTrace(); } } } else { Resource r = resource; TTCN3Module module = CommonHelper.getModule(r); //TODO: remove old resource? -> seems like no need TTCN3GlobalScopeProvider.RESOURCES.add(r); TTCN3GlobalScopeProvider.NAMED_MODULES.put(module.getName(), module); TTCN3GlobalScopeProvider.initExportedObjects(r); PreAnalyzer p = new PreAnalyzer(r); try { p.call(); } catch (Exception e) { e.printStackTrace(); } //TODO: refreshing a bit laggy // //TODO: rerun on others? // for (int i = 0; i < TTCN3GlobalScopeProvider.RESOURCES.size(); i++) { // PreAnalyzer pa = new PreAnalyzer(TTCN3GlobalScopeProvider.RESOURCES.get(i)); // try { // pa.call(); // } catch (Exception e) { // e.printStackTrace(); // } // } } TTCN3StatisticsProvider.getInstance().setPreAnalyzingCompleted(true); buildSemaphor.set(false); Loading
de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/TTCN3.xtext +94 −40 Original line number Diff line number Diff line Loading @@ -262,7 +262,7 @@ GotoStatement: GOTOKEYWORD name=IDENTIFIER; ReturnStatement: {ReturnStatement} RETURNKEYWORD (template=InLineTemplate | expression=Expression)?; {ReturnStatement} RETURNKEYWORD (template=TemplateInstance)?; InterleavedConstruct: INTERLEAVEDKEYWORD LBRACKET InterleavedGuardList RBRACKET; Loading Loading @@ -335,7 +335,7 @@ CheckPortOpsPresent: PortReceiveOp | PortGetCallOp | PortGetReplyOp | PortCatchOp; PortGetReplyOp: {PortGetReplyOp} GETREPLYOPKEYWORD (LPAREN template=InLineTemplate value=ValueMatchSpec? RPAREN)? from=FromClause? {PortGetReplyOp} GETREPLYOPKEYWORD (LPAREN template=TemplateInstance value=ValueMatchSpec? RPAREN)? from=FromClause? redirect=PortRedirectWithValueAndParam?; PortRedirectWithValueAndParam: Loading @@ -345,7 +345,7 @@ RedirectWithValueAndParamSpec: value=ValueSpec param=ParamSpec? sender=SenderSpec? index=IndexSpec? | redirect=RedirectWithParamSpec; ValueMatchSpec: VALUEKEYWORD template=InLineTemplate; VALUEKEYWORD template=TemplateInstance; CatchStatement: PortOrAny DOT catch=PortCatchOp; Loading @@ -354,13 +354,13 @@ PortCatchOp: {PortCatchOp} CATCHOPKEYWORD (LPAREN param=CatchOpParameter RPAREN)? from=FromClause? redirect=PortRedirect?; CatchOpParameter: signature=Signature COMMA template=InLineTemplate | {CatchOpParameter} TIMEOUTKEYWORD; signature=Signature COMMA template=TemplateInstance | {CatchOpParameter} TIMEOUTKEYWORD; GetCallStatement: PortOrAny DOT call=PortGetCallOp; PortGetCallOp: {PortGetCallOp} GETCALLOPKEYWORD (LPAREN template=InLineTemplate RPAREN)? from=FromClause? {PortGetCallOp} GETCALLOPKEYWORD (LPAREN template=TemplateInstance RPAREN)? from=FromClause? redirect=PortRedirectWithParam?; PortRedirectWithParam: Loading Loading @@ -392,7 +392,7 @@ TriggerStatement: PortOrAny DOT trigger=PortTriggerOp; PortTriggerOp: {PortTriggerOp} TRIGGEROPKEYWORD (LPAREN template=InLineTemplate RPAREN)? from=FromClause? redirect=PortRedirect?; {PortTriggerOp} TRIGGEROPKEYWORD (LPAREN template=TemplateInstance RPAREN)? from=FromClause? redirect=PortRedirect?; ReceiveStatement: any=PortOrAny DOT receive=PortReceiveOp; Loading @@ -403,13 +403,13 @@ PortOrAny: variable=VariableRef)); PortReceiveOp: {PortReceiveOp} RECEIVEOPKEYWORD (LPAREN template=InLineTemplate RPAREN)? from=FromClause? redirect=PortRedirect?; {PortReceiveOp} RECEIVEOPKEYWORD (LPAREN template=TemplateInstance RPAREN)? from=FromClause? redirect=PortRedirect?; FromClause: {FromClause} FROMKEYWORD (template=InLineTemplate | addresses=AddressRefList | ANYKEYWORD COMPONENTKEYWORD); {FromClause} FROMKEYWORD (template=TemplateInstance | addresses=AddressRefList | ANYKEYWORD COMPONENTKEYWORD); AddressRefList: LPAREN templates+=InLineTemplate (COMMA templates+=InLineTemplate)* RPAREN; LPAREN templates+=TemplateInstance (COMMA templates+=TemplateInstance)* RPAREN; PortRedirect: PORTREDIRECTSYMBOL ((value=ValueSpec sender=SenderSpec? index=IndexSpec?) | (sender=SenderSpec index=IndexSpec?) | Loading Loading @@ -442,9 +442,13 @@ FunctionInstance: // ext ref ok? // usage / semantic of PreDefFunctionIdentifier? FunctionRef: FunctionDef | ExtFunctionDef | BaseTemplate | AltstepDef; FunctionDef | ExtFunctionDef | BaseTemplate | AltstepDef | Enumeration; //(IDENTIFIER DOT)? IDENTIFIER; TemplateRef: BaseTemplate | Enumeration | FormalTemplatePar | FormalValuePar | SingleTempVarInstance; FunctionActualParList: (params+=FunctionActualPar (COMMA params+=FunctionActualPar)*) | (asssign+=FunctionActualParAssignment (COMMA asssign+=FunctionActualParAssignment)*); Loading @@ -469,7 +473,7 @@ TimerRefAssignment: timer=[FormalTimerPar|IDENTIFIER] ASSIGNMENTCHAR value=[TimerVarInstance|IDENTIFIER]; FunctionActualPar: template=InLineTemplate | component=ComponentRef | timer=[TimerVarInstance|IDENTIFIER] | port=PortRef | template=TemplateInstance | component=ComponentRef | timer=[TimerVarInstance|IDENTIFIER] | port=PortRef | {FunctionActualPar} MINUS; ComponentRef: Loading Loading @@ -522,7 +526,7 @@ FunctionStatement: test=TestcaseOperation; TestcaseOperation: {TestcaseOperation} TESTCASEKEYWORD DOT STOPKEYWORD (LPAREN ((txt+=FREE_TEXT | template+=InLineTemplate) COMMA?)* {TestcaseOperation} TESTCASEKEYWORD DOT STOPKEYWORD (LPAREN (log+=LogItem COMMA?)* RPAREN)?; SetLocalVerdict: Loading @@ -545,7 +549,7 @@ ComponentReferenceOrLiteral: ref=ComponentOrDefaultReference | {ComponentReferenceOrLiteral} MTCKEYWORD | {ComponentReferenceOrLiteral} SELFOP; StartTCStatement: ref=ComponentOrDefaultReference DOT STARTKEYWORD LPAREN function=FunctionInstance RPAREN; ref=ComponentOrDefaultReference DOT STARTKEYWORD LPAREN (function=FunctionInstance | altstep=AltstepInstance) RPAREN; UnmapStatement: {UnmapStatement} UNMAPKEYWORD (spec=SingleConnectionSpec clause=ParamClause? | spec=AllConnectionsSpec Loading Loading @@ -610,16 +614,16 @@ RaiseStatement: port=[FormalPortAndValuePar|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortRaiseOp; PortRaiseOp: RAISEKEYWORD LPAREN signature=[SignatureDef|QualifiedIdentifier] COMMA template=InLineTemplate RPAREN to=ToClause?; RAISEKEYWORD LPAREN signature=[SignatureDef|QualifiedIdentifier] COMMA template=TemplateInstance RPAREN to=ToClause?; ReplyStatement: port=[FormalPortAndValuePar|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortReplyOp; PortReplyOp: REPLYKEYWORD LPAREN template=InLineTemplate value=ReplyValue? RPAREN to=ToClause?; REPLYKEYWORD LPAREN template=TemplateInstance value=ReplyValue? RPAREN to=ToClause?; ReplyValue: VALUEKEYWORD expr=Expression; VALUEKEYWORD body=TemplateBody; CallStatement: port=[FormalPortAndValuePar|IDENTIFIER] arrayRefs+=ArrayOrBitRef* DOT op=PortCallOp body=PortCallBody?; Loading @@ -628,7 +632,7 @@ PortCallOp: CALLOPKEYWORD LPAREN params=CallParameters RPAREN to=ToClause?; CallParameters: template=InLineTemplate (COMMA value=CallTimerValue)?; template=TemplateInstance (COMMA value=CallTimerValue)?; CallTimerValue: expr=Expression | {CallTimerValue} NOWAITKEYWORD; Loading @@ -653,10 +657,10 @@ SendStatement: port=[FormalPortAndValuePar|IDENTIFIER] arryRefs+=ArrayOrBitRef* DOT send=PortSendOp; PortSendOp: SENDOPKEYWORD LPAREN template=InLineTemplate RPAREN to=ToClause?; SENDOPKEYWORD LPAREN template=TemplateInstance RPAREN to=ToClause?; ToClause: {ToClause} TOKEYWORD (template=InLineTemplate | ref=AddressRefList | ALLKEYWORD COMPONENTKEYWORD); {ToClause} TOKEYWORD (template=TemplateInstance | ref=AddressRefList | ALLKEYWORD COMPONENTKEYWORD); FunctionDefList: (locDef=FunctionLocalDef | locInst=FunctionLocalInst) ws=WithStatement? sc=SEMICOLON?; Loading Loading @@ -849,7 +853,15 @@ EnumerationList: enums+=Enumeration (COMMA enums+=Enumeration)*; Enumeration: name=IDENTIFIER (LPAREN MINUS? NUMBER RPAREN)?; name=IDENTIFIER (LPAREN values+=IntegerValueOrRange (COMMA values+=IntegerValueOrRange)* RPAREN)?; IntegerValueOrRange: lower=IntegerValue (RANGEOP upper=IntegerValue)? ; IntegerValue: MINUS? NUMBER ; UnionFieldDef: (type=Type | nestedType=NestedTypeDef) name=IDENTIFIER array=ArrayDef? subType=SubTypeSpec?; Loading Loading @@ -909,7 +921,7 @@ SingleTempVarInstance: name=IDENTIFIER array=ArrayDef? (ac=ASSIGNMENTCHAR template=TemplateBody)?; /// changed Signature -> Type InLineTemplate: TemplateInstance: (type=Type COLON)? (derived=DerivedRefWithParList ASSIGNMENTCHAR)? template=TemplateBody; DerivedRefWithParList: Loading @@ -928,30 +940,53 @@ FieldSpec: mod=FUZZY_MODIFIER? ref=[FieldReference|IDENTIFIER] ASSIGNMENTCHAR (body=TemplateBody | MINUS); SimpleSpec: expr=SingleExpression (STRINGOP spec=SimpleTemplateSpec)? | spec=SimpleTemplateSpec; //TODO: flip order in case (with predicate?), // but test performance and correctness implications thoroughly // -> seems to be necessary for enumeration with extension? // => // spec=SimpleTemplateSpec // | =>expr=SingleExpression (STRINGOP spec=SimpleTemplateSpec)? | spec=SimpleTemplateSpec ; SimpleTemplateSpec: expr=SingleTemplateExpression (STRINGOP spec=SimpleSpec)?; SingleTemplateExpression: symbol=MatchingSymbol | list=TemplateRefWithParList extended=ExtendedFieldReference?; //TODO: switch back order? // -> keep for now otherwise it gets matched as TemplateRef with ParList // -> test performance and correctness -> overshoots, treats everything as enum symbol=MatchingSymbol | (list=TemplateRefWithParList extended=ExtendedFieldReference?) | =>(enumeration=[Enumeration|QualifiedIdentifier] extension=EnumTemplateExtension) // DONE: is it supposed to be a reference? -> yes ; EnumTemplateExtension: {EnumTemplateExtension} LPAREN template+=TemplateBody (COMMA template+=TemplateBody)* RPAREN ; // TODO: test this! TemplateRefWithParList: template=[BaseTemplate|QualifiedIdentifier] list=TemplateActualParList?; template=[TemplateRef|QualifiedIdentifier] list=TemplateActualParList?; TemplateActualParList: {TemplateActualParList} LPAREN (actual+=TemplateInstanceActualPar (COMMA actual+=TemplateInstanceActualPar)* | assign+=TemplateInstanceAssignment (COMMA assign+=TemplateInstanceAssignment)*)? RPAREN; MatchingSymbol: //TODO: switched to RangeDef instead of Range -> added both -> removed again // -> roll back once EnumTemplateExpression works properly? -> no need now complement=Complement | {MatchingSymbol} any=QUESTIONMARK qwlm=WildcardLengthMatch? | {MatchingSymbol} anyornone=STAR swlm=WildcardLengthMatch? | range=Range | {MatchingSymbol} BIT_STRING_OR_MATCH | {MatchingSymbol} HEX_STRING_OR_MATCH | {MatchingSymbol} OCTET_STRING_OR_MATCH | string=CharStringMatch | subset=SubsetMatch | superset=SupersetMatch | decoded=DecodedContentMatch | templates=ListOfTemplates; DecodedContentMatch: DECODED_MATCH ( LPAREN Expression RPAREN )? template=InLineTemplate DECODED_MATCH ( LPAREN Expression RPAREN )? template=TemplateInstance ; SubsetMatch: Loading @@ -976,10 +1011,10 @@ TemplateOps: MatchOp | ValueofOp; MatchOp: MATCHKEYWORD LPAREN expr=Expression COMMA template=InLineTemplate RPAREN; MATCHKEYWORD LPAREN expr=Expression COMMA template=TemplateInstance RPAREN; ValueofOp: VALUEOFKEYWORD LPAREN template=InLineTemplate RPAREN; VALUEOFKEYWORD LPAREN template=TemplateInstance RPAREN; ConfigurationOps: create=CreateOp | {ConfigurationOps} SELFOP | {ConfigurationOps} SYSTEMKEYWORD | {ConfigurationOps} MTCKEYWORD | Loading Loading @@ -1012,10 +1047,10 @@ Signature: ref=[SignatureDef|QualifiedIdentifier]; TemplateInstanceAssignment: name=[BaseTemplate|IDENTIFIER] ASSIGNMENTCHAR template=InLineTemplate; name=[BaseTemplate|IDENTIFIER] ASSIGNMENTCHAR template=TemplateInstance; TemplateInstanceActualPar: InLineTemplate | {TemplateInstanceActualPar} MINUS; TemplateInstance | {TemplateInstanceActualPar} MINUS; TemplateRestriction: LPAREN (omit=OMITKEYWORD | value=VALUEKEYWORD | present=PRESENTKEYWORD) RPAREN; Loading @@ -1030,7 +1065,7 @@ LogStatement: // This way seems to work and allows parsing constructs like: // log ( "*** f_1: INFO: OK - random value = " & bit2str(i1) & " ***" ); LogItem: /*text=FREE_TEXT |*/ template=InLineTemplate; /*text=FREE_TEXT |*/ template=TemplateInstance; Expression: SingleExpression | CompoundExpression; Loading Loading @@ -1113,7 +1148,11 @@ Value: predef=PredefinedValue | ref=ReferencedValue; ReferencedValue: head=Head fields+=ExtendedFieldReference*; head=Head (fields+=ExtendedFieldReference+ | enumRef=ExtendedEnumReference)?; ExtendedEnumReference: LPAREN value=IntegerValue RPAREN ; RefValueHead: RefValue | ModuleOrGroup; Loading Loading @@ -1146,7 +1185,9 @@ DecodedFieldType: // SingleVarInstance contained in TimerVarInstance (according to EBNF rules) RefValue: ModuleParameter | FieldReference | FormalTemplatePar | SingleTempVarInstance | FunctionRef | TimerVarInstance | FormalPortPar | PortElement | NamedObject; FunctionRef | TimerVarInstance | FormalPortPar | PortElement | NamedObject // | Enumeration //TODO: needed? ; // IDENTIFIER omitted PredefinedValue: Loading Loading @@ -1289,12 +1330,17 @@ SelectCaseConstruct: SELECTKEYWORD (union=UNIONKEYWORD)? LPAREN expression=SingleExpression RPAREN body=SelectCaseBody; SelectCaseBody: LBRACKET (cases+=SelectCase)+ RBRACKET; LBRACKET (cases+=SelectCase)+ else=CaseElse? RBRACKET; SelectCase: CASEKEYWORD (LPAREN template+=InLineTemplate (COMMA template+=InLineTemplate)* RPAREN | else=ELSEKEYWORD) //TODO: check extra else?! -> likely redundant.. -> report issue CASEKEYWORD (LPAREN template+=TemplateInstance (COMMA template+=TemplateInstance)* RPAREN | else=ELSEKEYWORD) statement=StatementBlock; CaseElse: CASEKEYWORD ELSEKEYWORD statement=StatementBlock ; FunctionDef: FUNCTIONKEYWORD det=DETERMINISTIC_MODIFIER? name=IDENTIFIER LPAREN parameterList=FunctionFormalParList? RPAREN runsOn=RunsOnSpec? mtc=MtcSpec? Loading @@ -1321,7 +1367,7 @@ FormalPortPar: FormalTemplatePar: (inOut=(INPARKEYWORD | OUTPARKEYWORD | INOUTPARKEYWORD))? (TEMPLATEKEYWORD | restriction=RestrictedTemplate) (mod=LAZY_MODIFIER | mod=FUZZY_MODIFIER)? type=Type name=IDENTIFIER (ASSIGNMENTCHAR (templ=InLineTemplate | MINUS))?; (mod=LAZY_MODIFIER | mod=FUZZY_MODIFIER)? type=Type name=IDENTIFIER (ASSIGNMENTCHAR (templ=TemplateInstance | MINUS))?; RunsOnSpec: RUNSKEYWORD ONKEYWORD component=[ComponentDef|QualifiedIdentifier]; Loading @@ -1329,9 +1375,12 @@ RunsOnSpec: ReturnType: RETURNKEYWORD (template=TEMPLATEKEYWORD | restricted=RestrictedTemplate)? type=Type; //TODO: try to remove extra=ExtraMatchingAttributes? from this rule //TODO: try to remove extra=ExtraMatchingAttributes? from this rule -> removed? // where does it come from? it is already in TemplateBody, perhaps it was parsed as expression by default? Assignment: ref=VariableRef ASSIGNMENTCHAR (body=TemplateBody | expression=Expression) extra=ExtraMatchingAttributes?; ref=VariableRef ASSIGNMENTCHAR (body=TemplateBody) // extra=ExtraMatchingAttributes? ; VariableRef: ref=ReferencedValue /*ext+=ExtendedFieldReference*/; Loading Loading @@ -2019,13 +2068,13 @@ terminal fragment CHAR: DOLLAR | SINGLEQUOTE | '|' | SEMICOLON | CIRCUMFLEX | '~'; terminal HSTRING returns ecore::EString: SINGLEQUOTE HEX* SINGLEQUOTE 'H'; SINGLEQUOTE (HEX | BINSPACE)* SINGLEQUOTE 'H'; terminal OSTRING returns ecore::EString: SINGLEQUOTE OCT* SINGLEQUOTE 'O'; SINGLEQUOTE (OCT | BINSPACE)* SINGLEQUOTE 'O'; terminal BSTRING returns ecore::EString: SINGLEQUOTE BIN* SINGLEQUOTE 'B'; SINGLEQUOTE (BIN | BINSPACE)* SINGLEQUOTE 'B'; terminal fragment UPPERALPHA: 'A'..'Z'; Loading @@ -2036,6 +2085,11 @@ terminal fragment LOWERALPHA: terminal fragment BIN: '0' | '1'; //TODO: conflict? move after? merge with WS? terminal BINSPACE: ' ' | '\n' ; terminal fragment ALPHA: UPPERALPHA | LOWERALPHA; Loading
de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/scoping/TTCN3ScopeProvider.xtend +43 −4 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import de.ugoe.cs.swe.tTCN3.FunctionFormalParList import de.ugoe.cs.swe.tTCN3.FunctionInstance import de.ugoe.cs.swe.tTCN3.GroupDef import de.ugoe.cs.swe.tTCN3.Head import de.ugoe.cs.swe.tTCN3.InLineTemplate import de.ugoe.cs.swe.tTCN3.Initial import de.ugoe.cs.swe.tTCN3.ModuleControlBody import de.ugoe.cs.swe.tTCN3.ModuleControlPart Loading Loading @@ -87,6 +86,9 @@ import de.ugoe.cs.swe.tTCN3.PortReceiveOp import de.ugoe.cs.swe.tTCN3.Value import org.eclipse.xtext.nodemodel.util.NodeModelUtils import de.ugoe.cs.swe.tTCN3.Assignment import de.ugoe.cs.swe.tTCN3.TemplateInstance import de.ugoe.cs.swe.tTCN3.TemplateRefWithParList import de.ugoe.cs.swe.tTCN3.SingleTemplateExpression //TODO: switch to TTCN3LocalScopeProvider as base class? class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { Loading Loading @@ -207,7 +209,7 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { private def Iterable<EObject> scopeListFieldExpressionList(EObject field) { val module = field.findDesiredParent(TTCN3Module) val inlineTemplate = field.findDesiredParent(InLineTemplate) val inlineTemplate = field.findDesiredParent(TemplateInstance) val template = field.findDesiredParent(TemplateDef) val variable = field.findDesiredParent(VarInstance) val eField = field.findDesiredParent(FieldExpressionSpec) Loading Loading @@ -302,6 +304,13 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { field.scopeFieldExpressionList } def IScope scope_SingleTemplateExpression_enumeration(SingleTemplateExpression it, EReference enumeration) { var list = <EObject>newArrayList list.addAll(containedElementsOfType(TTCN3Package.eINSTANCE.enumeration)) list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.enumeration)) scopeFor(list) } def IScope scope_SingleValueSpec_fieldRef(SingleValueSpec spec, EReference ref) { //TODO: generalise / extract var ArrayList<EObject> list = newArrayList Loading @@ -323,6 +332,18 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { } //TODO: others? } } else if (inlineTemplate.template !== null && inlineTemplate.template.simple !== null && inlineTemplate.template.simple.spec !== null && inlineTemplate.template.simple.spec.expr !== null && inlineTemplate.template.simple.spec.expr.list !== null ) { val t = inlineTemplate.template.simple.spec.expr.list.template if (t instanceof BaseTemplate) { list.addAll(t.type.ref.scopeReferencedFields) } else if (t instanceof FormalTemplatePar) { list.addAll(t.type.ref.scopeReferencedFields) } } scopeFor(list) } Loading Loading @@ -590,6 +611,8 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.extFunctionDef)) list.addAll(containedElementsOfType(TTCN3Package.eINSTANCE.altstepDef)) list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.altstepDef)) list.addAll(containedElementsOfType(TTCN3Package.eINSTANCE.enumeration)) list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.enumeration)) //TODO: others? //TODO: hack for templates, need to be parsed differently in the first place, but not sure how.. var containedTemplates = containedElementsOfType(TTCN3Package.eINSTANCE.moduleDefinition) Loading @@ -602,6 +625,22 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider { return s } def IScope scope_TemplateRefWithParList_template(TemplateRefWithParList it, EReference template) { var list = <EObject>newArrayList list.addAll(containedElementsOfType(TTCN3Package.eINSTANCE.enumeration)) list.addAll(importedElementsOfType(TTCN3Package.eINSTANCE.enumeration)) var container = findDesiredParent(ModuleDefinition) list.addAll(container.eAllOfType(TTCN3Package.eINSTANCE.formalTemplatePar.instanceClass as Class<? extends EObject>)) list.addAll(container.eAllOfType(TTCN3Package.eINSTANCE.formalValuePar.instanceClass as Class<? extends EObject>)) var containedTemplates = containedElementsOfType(TTCN3Package.eINSTANCE.moduleDefinition) .filter[(it as ModuleDefinition).def instanceof TemplateDef] .map[((it as ModuleDefinition).def as TemplateDef).base] list.addAll(containedTemplates) var importedTemplates = importedElementsOfType(TTCN3Package.eINSTANCE.baseTemplate) list.addAll(importedTemplates) var s = scopeFor(list) return s } //TODO: reuse and cache //TODO: check in IDE.. may need to be deactivated Loading
de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/validation/CodeStyleValidator.xtend +19 −6 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ import de.ugoe.cs.swe.tTCN3.FunctionInstance import de.ugoe.cs.swe.tTCN3.GotoStatement import de.ugoe.cs.swe.tTCN3.GroupDef import de.ugoe.cs.swe.tTCN3.ImportDef import de.ugoe.cs.swe.tTCN3.InLineTemplate import de.ugoe.cs.swe.tTCN3.LabelStatement import de.ugoe.cs.swe.tTCN3.ModuleControlBody import de.ugoe.cs.swe.tTCN3.ModuleDefinition Loading Loading @@ -105,6 +104,7 @@ import static extension de.ugoe.cs.swe.common.TTCN3ReferenceHelper.* import static extension de.ugoe.cs.swe.common.TTCN3ScopeHelper.* import static extension org.eclipse.emf.ecore.util.EcoreUtil.* import static extension org.eclipse.xtext.EcoreUtil2.* import de.ugoe.cs.swe.tTCN3.TemplateInstance class CheckDefinitionComeFirstParameter { public boolean hasOtherDefinitions Loading Loading @@ -263,7 +263,7 @@ class CodeStyleValidator extends AbstractDeclarativeValidator { } @Check def checkInlineTemplates(InLineTemplate template) { def checkInlineTemplates(TemplateInstance template) { if (!activeProfile.checkInlineTemplates) return; Loading Loading @@ -459,7 +459,20 @@ class CodeStyleValidator extends AbstractDeclarativeValidator { //TODO: export to reusable debugging dump //val debugNode = NodeModelUtils.findActualNodeFor(r.eContainer) //println(debugNode.startLine+" : "+debugNode.text) var v = (r.eContainer as ReferencedValue).referencedValue.name //TODO: fix casting issue var v = ''; val c = r.eContainer if (c instanceof ReferencedValue) { v = c.referencedValue.name } else if (c instanceof SingleTemplateExpression) { if (c.enumeration !== null) { v = c.enumeration.name //TODO: return? } else { //TODO: return? } // v = c. } //DONE: distinguish between cases based on the assignment //negative distinction => exit scenarios Loading Loading @@ -500,9 +513,9 @@ class CodeStyleValidator extends AbstractDeclarativeValidator { } //expression if (assignment.expression !== null) { // if (assignment.expression !== null) { //handle? } // } //extra? //TODO: handle? Loading Loading @@ -1341,7 +1354,7 @@ class CodeStyleValidator extends AbstractDeclarativeValidator { } @Check def checkNoInlineTemplates(InLineTemplate template) { def checkNoInlineTemplates(TemplateInstance template) { if (!activeProfile.checkNoInlineTemplates) return; Loading