Commit 51656668 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ ttcn3 generation fixes for enums, dataelementuse, and others

+ debugging operation
parent 53142b3e
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -9,6 +9,17 @@ operation Any debugAnnotations() : Boolean {
	("  Comments:    "+self.comment).println();
	return true;
}
operation Any debugElement(prefix : String) {
	var pattern = ".+\\.(.+)Impl.+(\\(?)";
	(prefix+self.toString().replaceAll(pattern, "$1 $2")).println();
	for (c in self.eContents()) {
		c.debugElement(prefix+"  ");
	}
	for (c in self.eCrossReferences()) {
		(prefix+"->"+c.toString().replaceAll(pattern, "$1 $2")).println();
		//c.debugElement(prefix+"  ");
	}
}

operation Any debugTimeConstraintVariables() : Boolean {
    var expressionConstraint = 
+216 −109
Original line number Diff line number Diff line
@@ -84,25 +84,29 @@ operation String getStringValue() : TTCN!Value {
    return v;
}

operation TDL!DataUse getDataInstance() : TDL!DataInstance {
	if (self.isKindOf(TDL!DataInstanceUse)) {
		return self.dataInstance;
	} else if (self.isKindOf(TDL!DataElementUse) and self.dataElement.isKindOf(TDL!DataInstance)) {
		return self.dataElement;
	} else {
		("  TODO: "+self.~rule+" : Not Implemented Yet : "+self.type).log(1);
		return null;
	}
}

operation Any transformSingleMemberAssignment(m : TDL!Member, mad : TDL!DataUse) : TTCN!TemplateBody {
    ("transformSingleMemberAssignment: "+self.name+"::"+m.name).log(1);
    var body = new TTCN!TemplateBody();
    if (mad.isDefined() and mad.isKindOf(TDL!DataInstanceUse)) {
        if (mad.dataInstance.isDefined() and mad.argument.isEmpty()) {
    if (mad.isDefined()) {
	    var di = mad.getDataInstance();
	    if (di.isDefined()) { 
	    	//TODO: add support for DataElementUse
	        if (mad.argument.isEmpty()) {
	            var e = di.equivalent();
	            body.simple = new TTCN!SimpleSpec();
	            body.simple.expr = new TTCN!Value();
            body.simple.expr.ref = new TTCN!ReferencedValue();
            body.simple.expr.ref.head = new TTCN!Head();
            
            //Template ->target = BaseTemplate reference
            //Constant ->target = SingleConstDef reference
            var e = mad.dataInstance.equivalent();
            if (e.isKindOf(TTCN!TemplateDef)) {
                body.simple.expr.ref.head.target = e.base;
            } else if (e.isKindOf(TTCN!ConstDef)) {
                body.simple.expr.ref.head.target = e.defs.list.get(0);             
            } else {
                //what else can it be?
            }
	            body.simple.expr.ref = e.getReferencedValue(); 
	            	            
	            //reduction
	            //use extended field references
@@ -113,25 +117,14 @@ operation Any transformSingleMemberAssignment(m : TDL!Member, mad : TDL!DataUse)
	                    if (mr.member.isDefined()) {
	                        var efr = new TTCN!ExtendedFieldReference();
	                        efr.field = mr.member.equivalent();
                        
	                        body.simple.expr.ref.fields.add(efr);
	                    }
	                    if (mr.collectionIndex.isDefined() 
                      and mr.collectionIndex.dataInstance.isDefined()) {
	                      and mr.collectionIndex.getDataInstance().isDefined()) {
	                        var ci = mr.collectionIndex.getDataInstance().equivalent();
	                        var efr = new TTCN!ExtendedFieldReference();
	                        efr.array = new TTCN!Value();
                        efr.array.ref = new TTCN!ReferencedValue();
                        efr.array.ref.head = new TTCN!Head();
                        
                        var ci = mr.collectionIndex.dataInstance.equivalent();
                        if (ci.isKindOf(TTCN!TemplateDef)) {
                            efr.array.ref.head.target = ci.base;
                        } else if (ci.isKindOf(TTCN!ConstDef)) {
                            efr.array.ref.head.target = ci.defs.list.get(0);             
                        } else {
                            //what else can it be?
                        }

	                        efr.array.ref = ci.getReferencedValue();
	                        body.simple.expr.ref.fields.add(efr);
	                    }
	                }            
@@ -150,7 +143,7 @@ operation Any transformSingleMemberAssignment(m : TDL!Member, mad : TDL!DataUse)
	        } else {
	            //nested anonymous definitions
	            //or overriding
            ("  : "+mad.item).log(1);
	            ("  : TODO: "+mad.item).log(1);
	            if (mad.item.isDefined()) {
		            body = self.transformDefaultMatchingSymbol(m, mad);
	            } else {
@@ -160,6 +153,11 @@ operation Any transformSingleMemberAssignment(m : TDL!Member, mad : TDL!DataUse)
        } else {
        	body = self.transformDefaultMatchingSymbol(m, mad);
        }
    } else {
    	body = self.transformDefaultMatchingSymbol(m, mad);
    }
    self.debugElement("Self: ");
    body.debugElement("Body: ");
    return body;
}

@@ -218,42 +216,82 @@ operation TDL!Member getFieldDef(type:TDL!StructuredDataType) : TTCN!StructField
    }
}

operation Any getReferencedValue() : TTCN!ReferencedValue {
	var v = new TTCN!ReferencedValue();
    v.head = new TTCN!Head();
    
    //Template ->target = BaseTemplate reference
    //Constant ->target = SingleConstDef reference
    if (self.isKindOf(TTCN!TemplateDef)) {
        v.head.target = self.base;
    } else if (self.isKindOf(TTCN!ConstDef)) {
        v.head.target = self.defs.list.get(0);             
    } else if (self.isKindOf(TTCN!Enumeration)) {
        v.head.target = self;             
    } else {
    	("  TODO: Not implemented yet: getReferencedValue for"+self).log(1);
        //what else can it be?
    }
    return v;
}

//TODO: deprecated? -> not at present
operation TDL!StructuredDataInstance transformMemberAssignment() : TTCN!CompoundExpression {
    var expr;
    ("transformMemberAssignment: "+self.name).println();
    ("transformMemberAssignment: "+self.name).log(1);
    if (not self.memberAssignment.isEmpty()) {
        expr = new TTCN!FieldExpressionList();
        for (ma in self.memberAssignment) {
            var fes = new TTCN!FieldExpressionSpec(); 
            //fes.fieldRef = ma.member.equivalent();
            fes.fieldRef = ma.member.getFieldDef(self.dataType);
            ("  "+ma.member.name+"->"+fes.fieldRef.eContainer().eContainer().name).println();
            ("  "+ma.member.name+"->"+fes.fieldRef.eContainer().eContainer().name).log(1);
            
            //ma.memberSpec
            fes.expr = new TTCN!Value();
            if (ma.memberSpec.isKindOf(TDL!DataInstanceUse) 
              and ma.memberSpec.dataInstance.isDefined()) {
                fes.expr.ref = new TTCN!ReferencedValue();
                fes.expr.ref.head = new TTCN!Head();
                
                //Template ->target = BaseTemplate reference
                //Constant ->target = SingleConstDef reference
                var e = ma.memberSpec.dataInstance.equivalent();
                if (e.isKindOf(TTCN!TemplateDef)) {
                    fes.expr.ref.head.target = e.base;
                } else if (e.isKindOf(TTCN!ConstDef)) {
                    fes.expr.ref.head.target = e.defs.list.get(0);             
            //TODO: other data uses?
            var di = ma.memberSpec.getDataInstance();
            if (di.isDefined()) {
	            (di).println();
                var e = di.equivalent();
                e.println();

                if (e.isUndefined()) {
                	if (di.dataType.name = "Boolean") {
                		fes.expr.predef = new TTCN!PredefinedValue();
	            		fes.expr.predef.boolean = di.name.toString().toLower();
                	}
                } else {
                    //what else can it be?
	                fes.expr.ref = e.getReferencedValue();
                }
                //TODO: handle overriding parameters?
            } else if (ma.memberSpec.isKindOf(TDL!LiteralValueUse)) {
            	//TODO: extract
            	fes.expr.predef = new TTCN!PredefinedValue();
            	if (ma.memberSpec.intValue.isDefined()) {
            		fes.expr.predef.integer = ma.memberSpec.intValue.toString();
            	} else if (ma.memberSpec.boolValue.isDefined()) {
            		fes.expr.predef.boolean = ma.memberSpec.boolValue.toString();
            	} else {
	                fes.expr.predef.charString = "\""+ma.memberSpec.value+"\"";
            	}
            } else if (ma.memberSpec.isKindOf(TDL!SpecialValueUse)) {
            	fes.expr.predef = new TTCN!PredefinedValue();
            	if (ma.memberSpec.isKindOf(TDL!OmitValue)) {
	                fes.expr.predef.omit = "omit";
            	} else if (ma.memberSpec.isKindOf(TDL!AnyValue)) {
            		fes.expr.predef.charString = "TODO: ? (AnyValue)"; 
            	} else if (ma.memberSpec.isKindOf(TDL!AnyValueOrOmit)) {
            		fes.expr.predef.charString = "TODO: * (AnyValueOrOmit)"; 
            	}
            	
            } else {
                //TODO: handle DataElementUse, others
                fes.expr.predef = new TTCN!PredefinedValue();
                fes.expr.predef.charString = "\"TODO: Not Implemented Yet\"";
            }
	            ("    NOT IMPLEMENTED YET: "+ma.memberSpec).log(1);
                
            }
            expr.specs.add(fes);
        }
        //TODO: handle unassigned members? -> add guards to corresponding rule
@@ -267,6 +305,7 @@ operation TDL!StructuredDataInstance transformMemberAssignment() : TTCN!Compound
        ("  TODO: "+self.~rule+" : What is going on here: "+self).log(1);
        expr = new TTCN!ArrayExpression();
    }
    expr.debugElement("Expr:");
    return expr;

}
@@ -276,6 +315,7 @@ operation TDL!StaticDataUse transformWildcardMemberAssignment() : TTCN!FieldSpec
    //unassignedMember?
    //argument -> ParameterBinding (parameter:Member, dataUse:DataUse)
    //reduction? -> MemberReference
    ("transformWildcardMemberAssignment: "+self.name).log(1);
    var field = new TTCN!FieldSpecList();
    var t;
    if (self.dataInstance.isDefined()) {
@@ -306,6 +346,7 @@ operation TDL!StaticDataUse transformWildcardMemberAssignment() : TTCN!FieldSpec
	        var ma = self.argument.selectOne(a|a.parameter = m);
	        //default: no wildcard, defined
	        //in case not defined, check for inherited
	        ma.println();
	        if (ma.isDefined()) {
	            mad = ma.dataUse;
	        } else if (ma.isUndefined() 
@@ -326,20 +367,37 @@ operation TDL!StaticDataUse transformWildcardMemberAssignment() : TTCN!FieldSpec
    return field;
}

//operation TDL!StructuredDataInstance transformWildcardMemberAssignment() : TTCN!FieldSpecList {
//    ("transformWildcardMemberAssignment: "+self.name).log(1);
//    var field = new TTCN!FieldSpecList();
//    for (m in self.dataType.allMembers()) { //TODO: why all? why not only assigned?
////    for (ma in self.memberAssignment) {
//        var fs = new TTCN!FieldSpec(); 
//        fs.ref = m.equivalent();
//        
//        var ma = self.memberAssignment.selectOne(ma|ma.member = m);
//        var mad;
//        if (ma.isDefined()) {
//            mad = ma.memberSpec;
//        } 
//
//        fs.body = new TTCN!TemplateBody();
//        fs.body = self.transformSingleMemberAssignment(m, mad);
//        field.spec.add(fs);
//    }
//    return field;
//}

//TODO: reactivate or differentiate above
operation TDL!StructuredDataInstance transformWildcardMemberAssignment() : TTCN!FieldSpecList {
    ("transformWildcardMemberAssignmentX: "+self.name).log(1);
    var field = new TTCN!FieldSpecList();
    for (m in self.dataType.allMembers()) {
    for (ma in self.memberAssignment) {
        var fs = new TTCN!FieldSpec(); 
        fs.ref = m.equivalent();
        
        var ma = self.memberAssignment.selectOne(ma|ma.member = m);
        var mad;
        if (ma.isDefined()) {
            mad = ma.memberSpec;
        } 
        fs.ref = ma.member.equivalent();

        fs.body = new TTCN!TemplateBody();
        fs.body = self.transformSingleMemberAssignment(m, mad);
        fs.body = self.transformSingleMemberAssignment(ma.member, ma.memberSpec);
        field.spec.add(fs);
    }
    return field;
@@ -560,6 +618,64 @@ operation TDL!DataInstanceUse getTemplateBody() : TTCN!TemplateBody {
	return self.getTemplateBody(false);
}

operation TDL!DataElementUse getTemplateBody() : TTCN!TemplateBody {
	return self.getTemplateBody(false);
}

//TODO: refactor, copied from below
operation TDL!DataElementUse getTemplateBody(flat : Boolean) : TTCN!TemplateBody {
    var tb = new TTCN!TemplateBody();
    tb.simple = new TTCN!SimpleSpec();
    tb.simple.expr = new TTCN!Value();
    if (useDataMapping) {
        var mapping = TDL!DataElementMapping.allInstances().select(m|m.mappableDataElement = self.dataElement).first(); //TODO: extract parameter
        tb.simple.expr.predef = new TTCN!PredefinedValue();
        if (mapping.isDefined()) {
            //t.ref = new TTCN!TypeReference();
            //TODO: check if defined
            //t.ref.head = mapping.elementURI;
            tb.simple.expr.predef.charString = mapping.elementURI.replaceAll("\"","");
        } else {
            tb.simple.expr.predef.charString = "MAP_"+self.dataInstance.name;
        }
    } else {
    	if (self.dataElement.isDefined() and self.dataElement.isKindOf(TDL!DataInstance)) {
	        tb.simple.expr.ref = new TTCN!ReferencedValue();
	        tb.simple.expr.ref.head = new TTCN!Head();
	        tb.simple.expr.ref.head.target = self.dataElement.equivalent().base;
    	} else if (self.dataElement.isDefined() and self.dataElement.isKindOf(TDL!DataType)) { //TODO:differentiate structured vs simple vs collection
			if (flat) {
		        ("  TODO: "+self.~rule+" : Not supported yet: "+self).log(1);
		        tb.simple.expr.predef = new TTCN!PredefinedValue();
		        tb.simple.expr.predef.charString = "\"TODO_INLINE_DATA_ELEMENT_FOR_"+self.dataElement.name+"\"";
			} else if (self.argument.isEmpty()) {
				//TODO: make sure type is present
				tb.simple.expr = new TTCN!ArrayExpression();				
			} else {
		        tb.simple=null;
		        tb.~type = self.dataElement.getTTCNType();
				tb.field = new TTCN!FieldSpecList();
		    
		    	for (a in self.argument) {
			        var fs = new TTCN!FieldSpec(); 
			        fs.ref = a.parameter.equivalent();
			        fs.body = a.dataUse.getTemplateBody(true); //TODO: expand?
		    	    tb.field.spec.add(fs);
		    	}
			}
	        
    	} else if (self.item.isDefined()) {
	        ("  TODO: "+self.~rule+" : Not supported yet: "+self).log(1);
	        tb.simple.expr.predef = new TTCN!PredefinedValue();
	        tb.simple.expr.predef.charString = "\"TODO_INLINE_COLLECTION\"";
    	} else {
	        ("  TODO: "+self.~rule+" : Not supported yet: "+self).log(1);
    	}
    }
    return tb;
	
}

operation TDL!DataInstanceUse getTemplateBody(flat : Boolean) : TTCN!TemplateBody {
    var tb = new TTCN!TemplateBody();
    tb.simple = new TTCN!SimpleSpec();
@@ -673,24 +789,15 @@ operation String getVerdictStatement() : TTCN!FunctionStatement {
}

operation TDL!DataUse getVerdictStatement() : TTCN!FunctionStatement {
    var sfs = new TTCN!FunctionStatement();
    sfs.verdict = new TTCN!SetLocalVerdict();
    sfs.verdict.expression = new TTCN!Value();
	var verdictName = "pass"; //TODO: more reasonable default?
    //TODO: handle corresponding verdict properly
    if (self.isKindOf(TDL!DataInstanceUse)) {
        sfs.verdict.expression.predef = new TTCN!PredefinedValue();
        if (self.dataInstance.name = "pass") {
            sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#pass;
        } else if (self.dataInstance.name = "fail") {
            sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#fail;
        } else if (self.dataInstance.name = "inconclusive") {
            sfs.verdict.expression.predef.verdictType = TTCN!VerdictTypeValue#inconc;
        } else {
            //TODO
        }
    	verdictName = self.dataInstance.name;
 	} else if (self.isKindOf(TDL!DataElementUse)) { //TODO: check that it is a dataInstance of type Verdict?
 		verdictName = self.dataElement.name;
    } else {
       //TODO
 	}
    return sfs;
 	return verdictName.getVerdictStatement(); 
}
+15 −7
Original line number Diff line number Diff line
@@ -236,11 +236,17 @@ rule EnumDT2E
    t.structured.enumDef = e;
    
    e.list = new TTCN!EnumerationList();
    for (v in dt.value) {
        var literal = new TTCN!Enumeration();
        literal.name = v.TTCNname();
        e.list.enums.add(literal);  
}

rule EnumInstance2E 
    transform di : TDL!SimpleDataInstance
    to e : TTCN!Enumeration {
    guard : not useDataMapping and di.eContainer.isKindOf(TDL!EnumDataType)
    
    e.name = di.TTCNname();
    
    var ep = di.dataType.equivalent();
    ep.list.enums.add(e);
}


@@ -828,6 +834,8 @@ rule StructuredDI2TD

	di.~rule = self;

	(di.name).log(1);

    var md = new TTCN!ModuleDefinition();
    md.def = td;
    var m = di.eContainer.equivalent();
@@ -862,7 +870,7 @@ rule StructuredDI2TD
//              or ma.memberSpec.isKindOf(TDL!AnyValueOrOmit))).log(1);
        tb.field = di.transformWildcardMemberAssignment();
    } else {
        ("Simple: "+di.name).log(1);
        ("Structure -> Simple: "+di.name).log(1);
        tb.simple = new TTCN!SimpleSpec();
        tb.simple.expr = di.transformMemberAssignment();
    }