Commit 755ca7a5 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

* refinement for data element use and reduction, remove need for new keyword, #153, #155

* update scoping, tests
parent f7d0d212
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -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) {
+5 −5
Original line number Diff line number Diff line
@@ -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 {
@@ -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
+32 −26
Original line number Diff line number Diff line
@@ -367,8 +367,7 @@ DataUseWrapped returns tdl::DataUse:
;

fragment ReductionFragment returns tdl::DataUse:
    (reduction+=CollectionReference)?
    ('.' reduction+=MemberReference)*
    (reduction+=MemberReference)+
;

fragment ParameterBindingFragment returns tdl::DataUse:
@@ -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:    
@@ -420,7 +407,7 @@ DataInstanceUse returns tdl::DataInstanceUse:
    	'instance' dataInstance=[tdl::DataInstance|Identifier]
    	UnassignedFragment?
    	ParameterBindingFragment?
    	ReductionFragment
    	ReductionFragment?
    )
    |
    (
@@ -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?
;
@@ -482,7 +469,7 @@ CastDataUse returns tdl::CastDataUse:
	//TODO: causes ambiguity
//	'as' dataType=[tdl::DataType|Identifier]
    RParen
	(ParameterBindingFragment | ReductionFragment)
	(ParameterBindingFragment | ReductionFragment)?
;


@@ -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:
@@ -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]