Loading plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/scoping/TDLScopeProvider.java +15 −2 Original line number Diff line number Diff line Loading @@ -475,10 +475,23 @@ public class TDLScopeProvider extends AbstractDeclarativeScopeProvider { MemberReference preceding = reduction.get(rIndex - 1); if (preceding.getMember()!=null) { referenceType = preceding.getMember().getDataType(); } else { if (rIndex > 1) { preceding = reduction.get(rIndex - 2); if (preceding.getMember()!=null) { referenceType = preceding.getMember().getDataType(); if (referenceType instanceof CollectionDataType) { referenceType = ((CollectionDataType) referenceType).getItemType(); } } else { //TODO: handle, e.g. first reference referenceType = ((DataUse)context.eContainer()).resolveBaseDataType(); } } else { //TODO: handle, e.g. first reference referenceType = ((DataUse)context.eContainer()).resolveBaseDataType(); } } } } if (referenceType instanceof CollectionDataType) { Loading plugins/org.etsi.mts.tdl.tx.tests/src/models/testAdvancedDataUse.tdltx +5 −5 Original line number Diff line number Diff line Loading @@ -15,11 +15,11 @@ Package AdvancedDataUse { Collection Group of User // Data Instances User user1 ( name = "Alice", addr = new Address ( street = "Main St", zip = 12345 ) ) User user1 ( name = "Alice", addr = Address ( street = "Main St", zip = 12345 ) ) Group group1 [ user1, new User ( name = "Bob", addr = new Address ( street = "Second St", zip = 54321 ) ) User ( name = "Bob", addr = Address ( street = "Second St", zip = 54321 ) ) ] Component MyCompType { Loading @@ -39,16 +39,16 @@ Package AdvancedDataUse { testerInstance::g sends user1.addr.zip to sutInstance::g // Reduction: accessing collection element and member testerInstance::g sends group1[0].name to sutInstance::g testerInstance::g sends group1.get(0).name to sutInstance::g // Anonymous instance with nested reduction testerInstance::g sends new User ( testerInstance::g sends User ( name = "Charlie", addr = user1.addr ) to sutInstance::g // Collection indexing with another data use testerInstance::g sends group1[index1] to sutInstance::g testerInstance::g sends group1.get(index1) to sutInstance::g } Integer index1 Loading plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtx.xtext +32 −26 Original line number Diff line number Diff line Loading @@ -367,8 +367,7 @@ DataUseWrapped returns tdl::DataUse: ; fragment ReductionFragment returns tdl::DataUse: (reduction+=CollectionReference)? ('.' reduction+=MemberReference)* (reduction+=MemberReference)+ ; fragment ParameterBindingFragment returns tdl::DataUse: Loading @@ -382,31 +381,19 @@ fragment CheckFragment returns tdl::DataUse: ParameterBinding returns tdl::ParameterBinding: parameter=[tdl::Parameter|Identifier] // ('.' parameter+=[tdl::Parameter|Identifier])* ( '|' //TODO: is there a better way? ParameterReductionFragment )? //TODO: is there a better way? -> will need to be rethought, semantics for collections still problematic.. ('|' ParameterReductionFragment)? '=' dataUse=DataUse ; fragment ParameterReductionFragment returns tdl::ParameterBinding: (reduction+=CollectionReference)? ('.' reduction+=MemberReference)* (reduction+=MemberReference)+ ; MemberReference returns tdl::MemberReference: member=[tdl::Member|Identifier] ( '.' 'get' //TODO: other keyword? '[' collectionIndex=DataUse ']' )? ; CollectionReference returns tdl::MemberReference: '.' 'get' //TODO: other keyword? '[' collectionIndex=DataUse ']' ('.' member=[tdl::Member|Identifier]) | ('.' 'get' LParen collectionIndex=DataUse RParen) ; StaticDataUse returns tdl::StaticDataUse: Loading @@ -420,7 +407,7 @@ DataInstanceUse returns tdl::DataInstanceUse: 'instance' dataInstance=[tdl::DataInstance|Identifier] UnassignedFragment? ParameterBindingFragment? ReductionFragment ReductionFragment? ) | ( Loading Loading @@ -468,7 +455,7 @@ LiteralValueUse returns tdl::LiteralValueUse: //Note overloaded syntax with constraints, in a sense this is a constraint too.. ( LBrace dataType=[tdl::DataType|Identifier] RBrace (ParameterBindingFragment | ReductionFragment) (ParameterBindingFragment | ReductionFragment)? )? CheckFragment? ; Loading @@ -482,7 +469,7 @@ CastDataUse returns tdl::CastDataUse: //TODO: causes ambiguity // 'as' dataType=[tdl::DataType|Identifier] RParen (ParameterBindingFragment | ReductionFragment) (ParameterBindingFragment | ReductionFragment)? ; Loading @@ -498,19 +485,19 @@ DynamicDataUse returns tdl::DynamicDataUse: FunctionCall returns tdl::FunctionCall: 'instance' 'returned' 'from' function=[tdl::Function|Identifier] ParameterBindingFragment ReductionFragment ReductionFragment? ; //TODO: deprecated? FormalParameterUse returns tdl::FormalParameterUse: 'parameter' parameter=[tdl::FormalParameter|Identifier] (ParameterBindingFragment | ReductionFragment) (ParameterBindingFragment | ReductionFragment)? ; VariableUse returns tdl::VariableUse: componentInstance=[tdl::ComponentInstance|Identifier] '::' variable=[tdl::Variable|Identifier] (ParameterBindingFragment | ReductionFragment) (ParameterBindingFragment | ReductionFragment)? ; PredefinedFunctionCall returns tdl::PredefinedFunctionCall: Loading Loading @@ -545,6 +532,25 @@ PredefinedFunctionCallBinary returns tdl::PredefinedFunctionCall: ; DataElementUse returns tdl::DataElementUse: {tdl::DataElementUse} ( dataElement=[tdl::NamedElement|Identifier] UnassignedFragmentNamedElement? ParameterBindingFragment? ReductionFragment? ->CollectionItemFragment? CheckFragment? ) | ( UnassignedFragmentNamedElement? (ParameterBindingFragment | CollectionItemFragment) CheckFragment? ) ; //TODO: this breaks translation and serialisation OldDataElementUse returns tdl::DataElementUse: //'unified' //this gets embedded in the first alternative somehow!? -> shouldn't be needed anyway //express also through table // - (binding) [index] [items] Loading Loading
plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/scoping/TDLScopeProvider.java +15 −2 Original line number Diff line number Diff line Loading @@ -475,10 +475,23 @@ public class TDLScopeProvider extends AbstractDeclarativeScopeProvider { MemberReference preceding = reduction.get(rIndex - 1); if (preceding.getMember()!=null) { referenceType = preceding.getMember().getDataType(); } else { if (rIndex > 1) { preceding = reduction.get(rIndex - 2); if (preceding.getMember()!=null) { referenceType = preceding.getMember().getDataType(); if (referenceType instanceof CollectionDataType) { referenceType = ((CollectionDataType) referenceType).getItemType(); } } else { //TODO: handle, e.g. first reference referenceType = ((DataUse)context.eContainer()).resolveBaseDataType(); } } else { //TODO: handle, e.g. first reference referenceType = ((DataUse)context.eContainer()).resolveBaseDataType(); } } } } if (referenceType instanceof CollectionDataType) { Loading
plugins/org.etsi.mts.tdl.tx.tests/src/models/testAdvancedDataUse.tdltx +5 −5 Original line number Diff line number Diff line Loading @@ -15,11 +15,11 @@ Package AdvancedDataUse { Collection Group of User // Data Instances User user1 ( name = "Alice", addr = new Address ( street = "Main St", zip = 12345 ) ) User user1 ( name = "Alice", addr = Address ( street = "Main St", zip = 12345 ) ) Group group1 [ user1, new User ( name = "Bob", addr = new Address ( street = "Second St", zip = 54321 ) ) User ( name = "Bob", addr = Address ( street = "Second St", zip = 54321 ) ) ] Component MyCompType { Loading @@ -39,16 +39,16 @@ Package AdvancedDataUse { testerInstance::g sends user1.addr.zip to sutInstance::g // Reduction: accessing collection element and member testerInstance::g sends group1[0].name to sutInstance::g testerInstance::g sends group1.get(0).name to sutInstance::g // Anonymous instance with nested reduction testerInstance::g sends new User ( testerInstance::g sends User ( name = "Charlie", addr = user1.addr ) to sutInstance::g // Collection indexing with another data use testerInstance::g sends group1[index1] to sutInstance::g testerInstance::g sends group1.get(index1) to sutInstance::g } Integer index1 Loading
plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtx.xtext +32 −26 Original line number Diff line number Diff line Loading @@ -367,8 +367,7 @@ DataUseWrapped returns tdl::DataUse: ; fragment ReductionFragment returns tdl::DataUse: (reduction+=CollectionReference)? ('.' reduction+=MemberReference)* (reduction+=MemberReference)+ ; fragment ParameterBindingFragment returns tdl::DataUse: Loading @@ -382,31 +381,19 @@ fragment CheckFragment returns tdl::DataUse: ParameterBinding returns tdl::ParameterBinding: parameter=[tdl::Parameter|Identifier] // ('.' parameter+=[tdl::Parameter|Identifier])* ( '|' //TODO: is there a better way? ParameterReductionFragment )? //TODO: is there a better way? -> will need to be rethought, semantics for collections still problematic.. ('|' ParameterReductionFragment)? '=' dataUse=DataUse ; fragment ParameterReductionFragment returns tdl::ParameterBinding: (reduction+=CollectionReference)? ('.' reduction+=MemberReference)* (reduction+=MemberReference)+ ; MemberReference returns tdl::MemberReference: member=[tdl::Member|Identifier] ( '.' 'get' //TODO: other keyword? '[' collectionIndex=DataUse ']' )? ; CollectionReference returns tdl::MemberReference: '.' 'get' //TODO: other keyword? '[' collectionIndex=DataUse ']' ('.' member=[tdl::Member|Identifier]) | ('.' 'get' LParen collectionIndex=DataUse RParen) ; StaticDataUse returns tdl::StaticDataUse: Loading @@ -420,7 +407,7 @@ DataInstanceUse returns tdl::DataInstanceUse: 'instance' dataInstance=[tdl::DataInstance|Identifier] UnassignedFragment? ParameterBindingFragment? ReductionFragment ReductionFragment? ) | ( Loading Loading @@ -468,7 +455,7 @@ LiteralValueUse returns tdl::LiteralValueUse: //Note overloaded syntax with constraints, in a sense this is a constraint too.. ( LBrace dataType=[tdl::DataType|Identifier] RBrace (ParameterBindingFragment | ReductionFragment) (ParameterBindingFragment | ReductionFragment)? )? CheckFragment? ; Loading @@ -482,7 +469,7 @@ CastDataUse returns tdl::CastDataUse: //TODO: causes ambiguity // 'as' dataType=[tdl::DataType|Identifier] RParen (ParameterBindingFragment | ReductionFragment) (ParameterBindingFragment | ReductionFragment)? ; Loading @@ -498,19 +485,19 @@ DynamicDataUse returns tdl::DynamicDataUse: FunctionCall returns tdl::FunctionCall: 'instance' 'returned' 'from' function=[tdl::Function|Identifier] ParameterBindingFragment ReductionFragment ReductionFragment? ; //TODO: deprecated? FormalParameterUse returns tdl::FormalParameterUse: 'parameter' parameter=[tdl::FormalParameter|Identifier] (ParameterBindingFragment | ReductionFragment) (ParameterBindingFragment | ReductionFragment)? ; VariableUse returns tdl::VariableUse: componentInstance=[tdl::ComponentInstance|Identifier] '::' variable=[tdl::Variable|Identifier] (ParameterBindingFragment | ReductionFragment) (ParameterBindingFragment | ReductionFragment)? ; PredefinedFunctionCall returns tdl::PredefinedFunctionCall: Loading Loading @@ -545,6 +532,25 @@ PredefinedFunctionCallBinary returns tdl::PredefinedFunctionCall: ; DataElementUse returns tdl::DataElementUse: {tdl::DataElementUse} ( dataElement=[tdl::NamedElement|Identifier] UnassignedFragmentNamedElement? ParameterBindingFragment? ReductionFragment? ->CollectionItemFragment? CheckFragment? ) | ( UnassignedFragmentNamedElement? (ParameterBindingFragment | CollectionItemFragment) CheckFragment? ) ; //TODO: this breaks translation and serialisation OldDataElementUse returns tdl::DataElementUse: //'unified' //this gets embedded in the first alternative somehow!? -> shouldn't be needed anyway //express also through table // - (binding) [index] [items] Loading