use of org.eclipse.titan.designer.AST.IType in project titan.EclipsePlug-ins by eclipse.
the class Done_Statement method generateCodeExpression.
@Override
public /**
* {@inheritDoc}
*/
void generateCodeExpression(final JavaGenData aData, final ExpressionStruct expression) {
aData.addCommonLibraryImport("TTCN_Runtime");
aData.addBuiltinTypeImport("TitanComponent");
if (componentreference != null) {
if (doneMatch != null) {
// value returning done
// figure out what type the done() function belongs to
IType t = doneMatch.getExpressionGovernor(CompilationTimeStamp.getBaseTimestamp(), Expected_Value_type.EXPECTED_TEMPLATE);
if (t == null) {
ErrorReporter.INTERNAL_ERROR("Encountered a done with unknown governor `" + getFullName() + "''");
return;
}
while (t instanceof Referenced_Type && !t.hasDoneAttribute()) {
final IReferenceChain refChain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true);
t = ((IReferencingType) t).getTypeRefd(CompilationTimeStamp.getBaseTimestamp(), refChain);
refChain.release();
}
if (!t.hasDoneAttribute()) {
ErrorReporter.INTERNAL_ERROR("Encountered a done return type without done attribute `" + getFullName() + "''");
return;
}
// determine whether the done() function is in the same module
final Module t_module = t.getMyScope().getModuleScope();
if (t_module != myStatementBlock.getModuleScope()) {
expression.expression.append(MessageFormat.format("{0}.", t_module.getIdentifier().getName()));
}
expression.expression.append("done(");
componentreference.generateCodeExpression(aData, expression, true);
expression.expression.append(", ");
// FIXME handle decoded match
doneMatch.generateCode(aData, expression, Restriction_type.TR_NONE);
// expression.expression.append(", ");
// FIXME handle value redirection
} else {
// simple done
componentreference.generateCodeExpressionMandatory(aData, expression, true);
expression.expression.append(".done(");
}
// FIXME handle index redirection
expression.expression.append(')');
} else if (isAny) {
// any component.done
expression.expression.append("TTCN_Runtime.component_done(TitanComponent.ANY_COMPREF)");
} else {
// all component.done
expression.expression.append("TTCN_Runtime.component_done(TitanComponent.ALL_COMPREF)");
}
}
use of org.eclipse.titan.designer.AST.IType in project titan.EclipsePlug-ins by eclipse.
the class Getcall_Statement method checkGetcallStatement.
public static void checkGetcallStatement(final CompilationTimeStamp timestamp, final Statement statement, final String statementName, final Reference portReference, final TemplateInstance parameter, final TemplateInstance fromClause, final Parameter_Redirect redirect, final Reference redirectSender) {
final Port_Type portType = Port_Utility.checkPortReference(timestamp, statement, portReference);
if (parameter == null) {
if (portType != null) {
final PortTypeBody body = portType.getPortBody();
if (OperationModes.OP_Message.equals(body.getOperationMode())) {
portReference.getLocation().reportSemanticError(MessageFormat.format(MESSAGEBASEDPORT, statementName, portType.getTypename()));
} else if (body.getInSignatures() == null) {
portReference.getLocation().reportSemanticError(MessageFormat.format(NOINSIGNATURES, portType.getTypename()));
}
}
if (redirect != null) {
redirect.getLocation().reportSemanticError(REDIRECTWITHOUTSIGNATURE);
redirect.checkErroneous(timestamp);
}
} else {
IType signature = null;
boolean signatureDetermined = false;
if (portType != null) {
final PortTypeBody body = portType.getPortBody();
final TypeSet inSignatures = body.getInSignatures();
if (OperationModes.OP_Message.equals(body.getOperationMode())) {
portReference.getLocation().reportSemanticError(MessageFormat.format(MESSAGEBASEDPORT, statementName, portType.getTypename()));
} else if (inSignatures != null) {
if (inSignatures.getNofTypes() == 1) {
signature = inSignatures.getTypeByIndex(0);
} else {
signature = Port_Utility.getOutgoingType(timestamp, parameter);
if (signature == null) {
parameter.getLocation().reportSemanticError(UNKNOWNSIGNATURETYPE);
} else {
if (!inSignatures.hasType(timestamp, signature)) {
parameter.getLocation().reportSemanticError(MessageFormat.format(SIGNATURENOTPRESENT, signature.getTypename(), portType.getTypename()));
}
}
}
signatureDetermined = true;
} else {
portReference.getLocation().reportSemanticError(MessageFormat.format(NOINSIGNATURES, portType.getTypename()));
}
} else if (portReference == null) {
// any port is referenced, or there was a syntax
// error
parameter.getLocation().reportSemanticError(MessageFormat.format(ANYWITHPARAMETER, statementName));
if (redirect != null) {
redirect.getLocation().reportSemanticError(MessageFormat.format(ANYWITHREDIRECT, statementName));
}
}
if (!signatureDetermined) {
signature = Port_Utility.getOutgoingType(timestamp, parameter);
}
if (signature != null) {
parameter.check(timestamp, signature);
signature = signature.getTypeRefdLast(timestamp);
switch(signature.getTypetype()) {
case TYPE_SIGNATURE:
((Signature_Type) signature).checkThisTemplate(timestamp, parameter.getTemplateBody(), false, false, null);
if (redirect != null) {
redirect.check(timestamp, (Signature_Type) signature, false);
}
break;
default:
parameter.getLocation().reportSemanticError(MessageFormat.format(SIGNATUREPARAMETEREXPECTED, signature.getTypename()));
if (redirect != null) {
redirect.checkErroneous(timestamp);
}
break;
}
}
}
Port_Utility.checkFromClause(timestamp, statement, portType, fromClause, redirectSender);
}
use of org.eclipse.titan.designer.AST.IType in project titan.EclipsePlug-ins by eclipse.
the class Call_Statement method checkCallBody.
/**
* Checks the response and exception handling part of a call operation.
*
* @param timestamp
* the timestamp of the actual build cycle.
* @param portType
* the port type of the actual call statement.
* @param signature
* the signature type of the actual call statement.
*/
private void checkCallBody(final CompilationTimeStamp timestamp, final Port_Type portType, final IType signature) {
boolean hasCatchTimeout = false;
for (int i = 0; i < altGuards.getNofAltguards(); i++) {
final AltGuard altGuard = altGuards.getAltguardByIndex(i);
if (!altguard_type.AG_OP.equals(altGuard.getType())) {
continue;
}
final Statement statement = ((Operation_Altguard) altGuard).getGuardStatement();
if (Statement_type.S_CATCH.equals(statement.getType())) {
((Catch_Statement) statement).setCallSettings(true, timerValue != null);
hasCatchTimeout |= ((Catch_Statement) statement).hasTimeout();
}
}
altGuards.setMyLaicStmt(altGuards, null);
altGuards.setMyAltguards(altGuards);
altGuards.check(timestamp);
if (portType != null) {
// operation.
for (int i = 0; i < altGuards.getNofAltguards(); i++) {
final AltGuard altguard = altGuards.getAltguardByIndex(i);
if (!altguard_type.AG_OP.equals(altguard.getType())) {
continue;
}
final Statement statement = ((Operation_Altguard) altguard).getGuardStatement();
if (statement.getIsErroneous()) {
continue;
}
switch(statement.getType()) {
case S_GETREPLY:
{
final Reference tempPortReference = ((Getreply_Statement) statement).getPortReference();
if (tempPortReference == null) {
final String message = MessageFormat.format("The `{0}'' operation must refer to the same port as the previous `call'' statement: `{1}'' was expected instead of `any port''", statement.getStatementName(), portReference.getId().getDisplayName());
statement.getLocation().reportSemanticError(message);
} else if (!portReference.getId().equals(tempPortReference.getId())) {
final String message = MessageFormat.format("The `{0}'' operation refers to a different port than the previous `call'' statement: `{1}'' was expected instead of `{2}''", statement.getStatementName(), portReference.getId().getDisplayName(), tempPortReference.getId().getDisplayName());
tempPortReference.getLocation().reportSemanticError(message);
}
final TemplateInstance instance = ((Getreply_Statement) statement).getReceiveParameter();
if (instance != null) {
final IType tempSignature = instance.getExpressionGovernor(timestamp, Expected_Value_type.EXPECTED_DYNAMIC_VALUE);
if (tempSignature != null && signature != null && !signature.isCompatible(timestamp, tempSignature, null, null, null)) {
final String message = MessageFormat.format(GETRPELYTOWRONGSIGNATURE, signature.getTypename(), tempSignature.getTypename());
instance.getLocation().reportSemanticError(message);
}
}
break;
}
case S_CATCH:
final Reference tempPortReference = ((Catch_Statement) statement).getPortReference();
if (tempPortReference == null) {
final String message = MessageFormat.format("The `{0}'' operation must refer to the same port as the previous `call'' statement: `{1}'' was expected instead of `any port''", statement.getStatementName(), portReference.getId().getDisplayName());
statement.getLocation().reportSemanticError(message);
} else if (!portReference.getId().equals(tempPortReference.getId())) {
final String message = MessageFormat.format("The `{0}'' operation refers to a different port than the previous `call'' statement: `{1}'' was expected instead of `{2}''", statement.getStatementName(), portReference.getId().getDisplayName(), tempPortReference.getId().getDisplayName());
tempPortReference.getLocation().reportSemanticError(message);
}
final Signature_Type tempSignature = ((Catch_Statement) statement).getSignatureType();
if (tempSignature != null && signature != null && !signature.isCompatible(timestamp, tempSignature, null, null, null)) {
final String message = MessageFormat.format("The `catch'' operation refers to a different signature than the previous `call'' statement: `{0}'' was expected instead of `{1}''", signature.getTypename(), tempSignature.getTypename());
statement.getLocation().reportSemanticError(message);
}
break;
default:
break;
}
}
}
if (timerValue != null && !hasCatchTimeout) {
location.reportSemanticWarning("The call operation has a timer, but the timeout expection is not cought");
}
}
use of org.eclipse.titan.designer.AST.IType in project titan.EclipsePlug-ins by eclipse.
the class Catch_Statement method checkCatch.
public static void checkCatch(final CompilationTimeStamp timestamp, final Statement statement, final String statementName, final Reference portReference, final Reference signatureReference, final TemplateInstance parameter, final boolean timeout, final TemplateInstance fromClause, final Reference redirectValue, final Reference redirectSender) {
final Port_Type portType = Port_Utility.checkPortReference(timestamp, statement, portReference);
if (signatureReference == null) {
if (timeout) {
if (portReference == null) {
statement.getLocation().reportSemanticError(TIMEOUTONANYPORT);
} else {
if (portType != null) {
final PortTypeBody body = portType.getPortBody();
// in the compiler
if (OperationModes.OP_Message.equals(body.getOperationMode())) {
portReference.getLocation().reportSemanticError(MessageFormat.format(TIMEOUTONMESSAGEPORT, portType.getTypename()));
} else if (!body.getreplyAllowed(timestamp)) {
portReference.getLocation().reportSemanticError(MessageFormat.format(TIMEOUTWITHOUTOUTSIGNATURES, portType.getTypename()));
}
}
}
if (statement instanceof Catch_Statement) {
final Catch_Statement catchStatement = (Catch_Statement) statement;
if (!catchStatement.inCall) {
statement.getLocation().reportSemanticError(TIMEOUTNOTPERMITTED1);
} else if (!catchStatement.callHasTimer) {
statement.getLocation().reportSemanticError(TIMEOUTNOTPERMITTED2);
}
}
if (fromClause != null) {
fromClause.getLocation().reportSemanticError(TIMEOUTWITHFROM);
}
if (redirectSender != null) {
redirectSender.getLocation().reportSemanticError(TIMEOUTWITHSENDERREDIRECT);
}
} else {
if (portType != null) {
final PortTypeBody body = portType.getPortBody();
if (OperationModes.OP_Message.equals(body.getOperationMode())) {
portReference.getLocation().reportSemanticError(MessageFormat.format(MESSAGEPORT, statementName, portType.getTypename()));
} else if (!body.catchAllowed(timestamp)) {
portReference.getLocation().reportSemanticError(MessageFormat.format(PORTWITHOUTEXCEPTIONSUPPORT, portType.getTypename()));
}
}
}
if (redirectValue != null) {
redirectValue.getLocation().reportSemanticError(VALUEREDIRECTWITHOUTPARAMETER);
Port_Utility.checkValueRedirect(timestamp, redirectValue, null);
}
} else {
Signature_Type signature = Port_Utility.checkSignatureReference(timestamp, signatureReference);
if (portType != null) {
final PortTypeBody body = portType.getPortBody();
if (OperationModes.OP_Message.equals(body.getOperationMode())) {
portReference.getLocation().reportSemanticError(MessageFormat.format(MESSAGEPORT, statementName, portType.getTypename()));
} else if (body.catchAllowed(timestamp)) {
final TypeSet outSignatures = body.getOutSignatures();
if (signature != null) {
if (!outSignatures.hasType(timestamp, signature)) {
signatureReference.getLocation().reportSemanticError(MessageFormat.format(MISSINGSIGNATURE, signature.getTypename(), portType.getTypename()));
}
} else if (outSignatures.getNofTypes() == 1) {
signature = (Signature_Type) outSignatures.getTypeByIndex(0).getTypeRefdLast(timestamp);
}
} else {
portReference.getLocation().reportSemanticError(MessageFormat.format(PORTWITHOUTEXCEPTIONSUPPORT, portType.getTypename()));
}
} else if (portReference == null) {
if (parameter != null) {
parameter.getLocation().reportSemanticError(MessageFormat.format(ANYPORTWITHPARAMETER, statementName));
}
if (redirectValue != null) {
redirectValue.getLocation().reportSemanticError(MessageFormat.format(ANYPORTWITHVALUEREDIRECT, statementName));
}
}
// the receive parameter must also be present
IType exceptionType = null;
boolean exceptionTypeDetermined = false;
final boolean[] valueRedirectChecked = new boolean[] { false };
if (signature != null) {
final SignatureExceptions exceptions = signature.getSignatureExceptions();
if (exceptions == null) {
signatureReference.getLocation().reportSemanticError(MessageFormat.format(SIGNATUREWITHOUTEXCEPTIONS, signature.getTypename()));
} else {
if (exceptions.getNofExceptions() == 1) {
exceptionType = exceptions.getExceptionByIndex(0);
} else if (parameter != null) {
exceptionType = Port_Utility.getIncomingType(timestamp, parameter, redirectValue, valueRedirectChecked);
if (exceptionType == null) {
parameter.getLocation().reportSemanticError(UNKNOWNEXCEPTIONTYPE);
} else {
final int nofCompatibleTypes = exceptions.getNofCompatibleExceptions(timestamp, exceptionType);
if (nofCompatibleTypes == 0) {
final String message = MessageFormat.format(MISSINGEXCEPTIONTYPE, exceptionType.getTypename(), signature.getTypename());
parameter.getLocation().reportSemanticError(message);
} else if (nofCompatibleTypes > 1) {
final String message = MessageFormat.format(AMBIGUOUSEXCEPTIONTYPE, exceptionType.getTypename(), signature.getTypename());
parameter.getLocation().reportSemanticError(message);
}
}
}
exceptionTypeDetermined = true;
}
}
if (!exceptionTypeDetermined) {
exceptionType = Port_Utility.getIncomingType(timestamp, parameter, redirectValue, valueRedirectChecked);
}
if (exceptionType != null && parameter != null) {
parameter.check(timestamp, exceptionType);
if (!valueRedirectChecked[0]) {
Port_Utility.checkValueRedirect(timestamp, redirectValue, exceptionType);
}
exceptionType = exceptionType.getTypeRefdLast(timestamp);
switch(exceptionType.getTypetype()) {
case TYPE_SIGNATURE:
parameter.getLocation().reportSemanticError(MessageFormat.format(EXCEPTIONPARAMEXPECTED1, exceptionType.getTypename()));
break;
case TYPE_PORT:
parameter.getLocation().reportSemanticError(MessageFormat.format(EXCEPTIONPARAMEXPECTED2, exceptionType.getTypename()));
break;
case TYPE_DEFAULT:
parameter.getLocation().reportSemanticError(EXCEPTIONPARAMEXPECTED3);
break;
default:
// accept it
break;
}
}
}
Port_Utility.checkFromClause(timestamp, statement, portType, fromClause, redirectSender);
}
use of org.eclipse.titan.designer.AST.IType in project titan.EclipsePlug-ins by eclipse.
the class Check_Getreply_Statement method generateCodeExpression.
@Override
public /**
* {@inheritDoc}
*/
void generateCodeExpression(final JavaGenData aData, final ExpressionStruct expression) {
if (portReference != null) {
portReference.generateCode(aData, expression);
expression.expression.append(".check_getreply(");
if (parameter != null) {
// FIXME handle redirect
parameter.generateCode(aData, expression, Restriction_type.TR_NONE);
final IType signature = parameter.getTemplateBody().getMyGovernor();
final IType signatureType = signature.getTypeRefdLast(CompilationTimeStamp.getBaseTimestamp());
final IType returnType = ((Signature_Type) signatureType).getSignatureReturnType();
if (returnType != null) {
expression.expression.append(".set_value_template(");
if (valueMatch != null) {
valueMatch.generateCode(aData, expression, Restriction_type.TR_NONE);
} else {
// the value match is not present
// we must substitute it with ? in the signature template
expression.expression.append(MessageFormat.format("new {0}(template_sel.ANY_VALUE)", returnType.getGenNameTemplate(aData, expression.expression, myScope)));
}
expression.expression.append(')');
}
expression.expression.append(", ");
generateCodeExprFromclause(aData, expression);
// FIXME handle redirections
expression.expression.append(", ");
if (redirectSender == null) {
expression.expression.append("null");
} else {
redirectSender.generateCode(aData, expression);
}
} else {
// the signature template is not present
generateCodeExprFromclause(aData, expression);
expression.expression.append(", ");
if (redirectSender == null) {
expression.expression.append("null");
} else {
redirectSender.generateCode(aData, expression);
}
}
// FIXME handle index redirection
expression.expression.append(", null");
} else {
// the operation refers to any port
expression.expression.append("TitanPort.any_check_getreply(");
generateCodeExprFromclause(aData, expression);
expression.expression.append(", ");
if (redirectSender == null) {
expression.expression.append("null");
} else {
redirectSender.generateCode(aData, expression);
}
}
expression.expression.append(')');
}
Aggregations