From ff2f9b72546311085d781a39c8f2d5f947b8a081 Mon Sep 17 00:00:00 2001 From: balaskoa Date: Mon, 13 Jun 2016 20:39:01 +0200 Subject: [PATCH] Bug 496030 - Refine checking procedure based communication Signed-off-by: balaskoa --- .../AST/TTCN3/statements/Call_Statement.java | 1 + .../TTCN3/statements/Getcall_Statement.java | 3 ++- .../TTCN3/statements/Parameter_Redirect.java | 2 +- .../AST/TTCN3/types/Signature_Type.java | 24 ++++++++++++++++--- .../TTCN3/types/TTCN3_Enumerated_Type.java | 2 +- 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Call_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Call_Statement.java index 224ea35d7..75fa37818 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Call_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Call_Statement.java @@ -242,6 +242,7 @@ public final class Call_Statement extends Statement { switch (signatureType.getTypetype()) { case TYPE_SIGNATURE: + ((Signature_Type) signatureType).checkThisTemplate(timestamp, parameter.getTemplateBody(), false, false); isNonblocking = ((Signature_Type) signatureType).isNonblocking(); break; default: diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Getcall_Statement.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Getcall_Statement.java index 3dc2cd9c2..252b3f002 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Getcall_Statement.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Getcall_Statement.java @@ -176,7 +176,7 @@ public final class Getcall_Statement extends Statement { MessageFormat.format(MESSAGEBASEDPORT, statementName, portType.getTypename())); } else if (inSignatures != null) { if (inSignatures.getNofTypes() == 1) { - signature = inSignatures.getTypeByIndex(0); + signature = inSignatures.getTypeByIndex(0); //??? } else { signature = Port_Utility.getOutgoingType(timestamp, parameter); @@ -214,6 +214,7 @@ public final class Getcall_Statement extends Statement { signature = signature.getTypeRefdLast(timestamp); switch (signature.getTypetype()) { case TYPE_SIGNATURE: + ((Signature_Type) signature).checkThisTemplate(timestamp, parameter.getTemplateBody(), false, false); if (redirect != null) { redirect.check(timestamp, (Signature_Type) signature, false); } diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Parameter_Redirect.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Parameter_Redirect.java index 09b998e53..793e5f96c 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Parameter_Redirect.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/statements/Parameter_Redirect.java @@ -76,7 +76,7 @@ public abstract class Parameter_Redirect extends ASTNode implements ILocateableN final IType variableType = reference.checkVariableReference(timestamp); if (type != null && variableType != null && !type.isIdentical(timestamp, variableType)) { final String message = MessageFormat.format( - "Type missmatch in parameter redirect: A variable of type `{0}'' was expected instead of `{1}''", + "Type mismatch in parameter redirect: A variable of type `{0}'' was expected instead of `{1}''", type.getTypename(), variableType.getTypename()); reference.getLocation().reportSemanticError(message); return; diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Signature_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Signature_Type.java index ba83172cd..53f89054b 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Signature_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/Signature_Type.java @@ -15,6 +15,8 @@ import java.util.Set; import org.eclipse.titan.designer.AST.ASTVisitor; import org.eclipse.titan.designer.AST.ArraySubReference; +import org.eclipse.titan.designer.AST.Assignment; +import org.eclipse.titan.designer.AST.Assignment.Assignment_type; import org.eclipse.titan.designer.AST.FieldSubReference; import org.eclipse.titan.designer.AST.INamedNode; import org.eclipse.titan.designer.AST.IReferenceChain; @@ -35,6 +37,7 @@ import org.eclipse.titan.designer.AST.TTCN3.Expected_Value_type; import org.eclipse.titan.designer.AST.TTCN3.templates.ITTCN3Template; import org.eclipse.titan.designer.AST.TTCN3.templates.NamedTemplate; import org.eclipse.titan.designer.AST.TTCN3.templates.Named_Template_List; +import org.eclipse.titan.designer.AST.TTCN3.templates.SpecificValue_Template; import org.eclipse.titan.designer.AST.TTCN3.templates.ITTCN3Template.Template_type; import org.eclipse.titan.designer.AST.TTCN3.values.NamedValue; import org.eclipse.titan.designer.AST.TTCN3.values.Sequence_Value; @@ -455,14 +458,16 @@ public final class Signature_Type extends Type { template.setMyGovernor(this); switch (template.getTemplatetype()) { - case TEMPLATE_LIST: { + case TEMPLATE_LIST: ITTCN3Template transformed = template.setTemplatetype(timestamp, Template_type.NAMED_TEMPLATE_LIST); checkThisNamedTemplateList(timestamp, (Named_Template_List) transformed, isModified); break; - } case NAMED_TEMPLATE_LIST: checkThisNamedTemplateList(timestamp, (Named_Template_List) template, isModified); break; + case SPECIFIC_VALUE: + ((SpecificValue_Template) template).checkSpecificValue(timestamp,false); + break; default: template.getLocation().reportSemanticError(MessageFormat.format(TEMPLATENOTALLOWED, template.getTemplateTypeName(), getTypename())); break; @@ -476,9 +481,21 @@ public final class Signature_Type extends Type { private void checkThisNamedTemplateList(final CompilationTimeStamp timestamp, final Named_Template_List template, final boolean isModified) { Map componentMap = new HashMap(); boolean inSynch = true; - int nofTypeParameters = getNofParameters(); + int nofTypeParameters = getNofParameters(); //TODO: alternatives:formalParList.getNofInParameters(); formalParList.getNofOutParameters() int nofTemplateComponents = template.getNofTemplates(); int tI = 0; + if(nofTemplateComponents < nofTypeParameters) { + template.getLocation().reportSemanticError( + MessageFormat.format("Too few elements in value list notation for type `{0}'': {1} was expected instead of {2}", + this.getFullName(), nofTypeParameters, nofTemplateComponents)); + } + +// The compiler does not do this check: +// if(nofTemplateComponents > nofTypeParameters) { +// template.getLocation().reportSemanticError( +// MessageFormat.format("Too many elements in value list notation for type `{0}'': {1} was expected instead of {2}", +// this.getFullName(), nofTypeParameters, nofTemplateComponents)); +// } for (int vI = 0; vI < nofTemplateComponents; vI++) { NamedTemplate namedTemplate = template.getTemplateByIndex(vI); Identifier identifier = namedTemplate.getName(); @@ -503,6 +520,7 @@ public final class Signature_Type extends Type { parameter2 = formalParList.getParameterByIndex(tI); if (parameter == parameter2) { found = true; + break; } } if (!found) { diff --git a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/TTCN3_Enumerated_Type.java b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/TTCN3_Enumerated_Type.java index 9c8ed17f7..0029cc1a0 100644 --- a/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/TTCN3_Enumerated_Type.java +++ b/org.eclipse.titan.designer/src/org/eclipse/titan/designer/AST/TTCN3/types/TTCN3_Enumerated_Type.java @@ -314,7 +314,7 @@ public final class TTCN3_Enumerated_Type extends Type implements ITypeWithCompon registerUsage(template); template.setMyGovernor(this); - if (!Template_type.SPECIFIC_VALUE.equals(template.getTemplatetype()) && !Template_type.SPECIFIC_VALUE.equals(template.getTemplatetype())) { + if (!Template_type.SPECIFIC_VALUE.equals(template.getTemplatetype()) ) { template.getLocation().reportSemanticError(MessageFormat.format(TEMPLATENOTALLOWED, template.getTemplateTypeName())); template.setIsErroneous(true); } -- GitLab