Commit 0cecb571 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ improvements to reusable operations

+ LiteralValueUse compatibility (int / bool)
+ inherited member handling
+ better value and template handling
parent 8be02fe3
Loading
Loading
Loading
Loading
+103 −21
Original line number Diff line number Diff line
@@ -73,12 +73,17 @@ operation TTCN!TTCN3Module createTypeDefBody() : TTCN!TypeDefBody{
operation String getStringBody() : TTCN!TemplateBody {
    var tb = new TTCN!TemplateBody();
    tb.simple = new TTCN!SimpleSpec();
    tb.simple.expr = new TTCN!Value();
    tb.simple.expr.predef = new TTCN!PredefinedValue();
    tb.simple.expr.predef.charString = "\""+self+"\"";
    tb.simple.expr = self.getStringValue();
	return tb;
}

operation String getStringValue() : TTCN!Value {
    var v = new TTCN!Value();
    v.predef = new TTCN!PredefinedValue();
    v.predef.charString = "\""+self+"\"";
    return v;
}

operation Any transformSingleMemberAssignment(m : TDL!Member, mad : TDL!DataUse) : TTCN!TemplateBody {
    var body = new TTCN!TemplateBody();
    if (mad.isDefined() and mad.isKindOf(TDL!DataInstanceUse)) {
@@ -200,14 +205,30 @@ operation Any transformDefaultMatchingSymbol(m : TDL!Member, mad : TDL!DataUse)
	return body;
}

//TODO: deprecated?
operation TDL!Member isInherited(type:TDL!StructuredDataType) : Boolean {
    return self.eContainer() != type;
}

operation TDL!Member getFieldDef(type:TDL!StructuredDataType) : TTCN!StructFieldDef {
    if (self.isInherited(type)) { 
        var r = type.equivalent();
        return r.body.defs.select(d | d.name = self.TTCNname()).first();
    } else {
        return self.equivalent();
    }
}

//TODO: deprecated? -> not at present
operation TDL!StructuredDataInstance transformMemberAssignment() : TTCN!CompoundExpression {
    var expr;
    ("transformMemberAssignment: "+self.name).println();
    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.equivalent();
            fes.fieldRef = ma.member.getFieldDef(self.dataType);
            ("  "+ma.member.name+"->"+fes.fieldRef.eContainer().eContainer().name).println();
            
            //ma.memberSpec
            fes.expr = new TTCN!Value();
@@ -228,6 +249,7 @@ operation TDL!StructuredDataInstance transformMemberAssignment() : TTCN!Compound
                }
                //TODO: handle overriding parameters?
            } else {
                //TODO: handle DataElementUse, others
                fes.expr.predef = new TTCN!PredefinedValue();
                fes.expr.predef.charString = "\"TODO: Not Implemented Yet\"";
            }
@@ -397,6 +419,22 @@ operation TDL!DataInstanceUse getDataUseValue() : TTCN!Value {
    return value;
}

operation TDL!LiteralValueUse getDataUseValue() : TTCN!Value {
    var v = new TTCN!Value();
    v.predef = new TTCN!PredefinedValue();
    //TODO: also infer from context?
    if (self.intValue.isDefined()) {
        v.predef.integer = self.intValue.asString();
    } else if (self.boolValue.isDefined()) {
        v.predef.boolean = self.boolValue.asString();
    } else {
        v.predef.charString = "\""+self.value+"\"";
    }

    return v;      
}


operation TDL!GateReference checkGateReference() : Boolean {
    var accepted = false;
    if (self.component.role = TDL!ComponentInstanceRole#Tester) {
@@ -436,9 +474,19 @@ operation TDL!GateReference createConnectionPort() {
    if (self.eContainer.isKindOf(TDL!Connection)) {
        var opposite = self.eContainer.endPoint.select(e|e <> self).first();
        
        var pe = new TTCN!PortElement();
        //only if it does not exist
        var targetName = self.gate.TTCNname()+"_to_"+opposite.component.TTCNname()+"_"+opposite.gate.TTCNname();
        var cdl = self.component.type.equivalent().defs.select(e|
            e.element.port.isDefined() and 
            e.element.port.instances.first().name = targetName).first();

        var pe;        
        if (cdl.isDefined()) {
            pe = cdl.element.port.instances.first();
        } else {
	        pe = new TTCN!PortElement();
	    
        pe.name = self.gate.TTCNname()+"_to_"+opposite.component.TTCNname()+"_"+opposite.gate.TTCNname();
	        pe.name = targetName;
	    
	        var d = new TTCN!ComponentDefList();
	        self.component.type.equivalent().defs.add(d);
@@ -449,6 +497,7 @@ operation TDL!GateReference createConnectionPort() {
	    
	        d.element.port.ref = self.gate.type.equivalent();
	        d.element.port.instances.add(pe);
        }
    
        //TODO: check this has no side effects
        self.equivalent().port = pe;
@@ -457,11 +506,30 @@ operation TDL!GateReference createConnectionPort() {
    }
}

//TODO: move to helper?
operation TTCN!ComponentRef getComponentName() : String {
    if (self.ref.isDefined()) {
        return self.ref.variable.ref.head.target.name;
    } else if (self.system.isDefined()) {
        return self.system;
    } else if (self.mtc.isDefined()) {
        return self.mtc;
    } else if (self.`self`.isDefined()) {
        return self.`self`;
    }
}

operation TDL!LiteralValueUse getTemplateBody() : TTCN!TemplateBody {
	//TODO: add support for integer?
	if (self.intValue.isDefined() or self.boolValue.isDefined()) {
	    var tb = new TTCN!TemplateBody();
	    tb.simple = new TTCN!SimpleSpec();
	    tb.simple.expr = self.getDataUseValue();
	    return tb;
	} else {
		return self.value.replaceAll("\"", "").getStringBody();
	}
}

operation TDL!LiteralValueUse getTemplateBody(flat : Boolean) : TTCN!TemplateBody {
	//TODO: add support for integer?
@@ -469,10 +537,24 @@ operation TDL!LiteralValueUse getTemplateBody(flat : Boolean) : TTCN!TemplateBod
}

operation TDL!FormalParameterUse getTemplateBody(flat : Boolean) : TTCN!TemplateBody {
	//TODO: add support for integer?
	return ("TODO:"+self.type.name+":"+self.parameter.name).getStringBody();
}

operation TDL!VariableUse getTemplateBody() : TTCN!TemplateBody {
    var tb = new TTCN!TemplateBody();
    tb.simple = new TTCN!SimpleSpec();
    tb.simple.expr = new TTCN!Value();
    tb.simple.expr.ref = new TTCN!ReferencedValue();
    tb.simple.expr.ref.head = new TTCN!Head();
    tb.simple.expr.ref.head.target = self.variable.equivalent();
    return tb;
//    return ("TODO:"
//        +self.componentInstance.name
//        +"::"
//        +self.variable.name
//        +" {"+self.resolveDataType().name+"}").getStringBody();
}


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