use of org.eclipse.titan.designer.AST.IType in project titan.EclipsePlug-ins by eclipse.
the class FormalParameter method checkActualParameterTimer.
/**
* Checks if the actual parameter paired with this formal parameter is
* semantically correct as a timer parameter.
*
* @param timestamp
* the timestamp of the actual semantic check cycle.
* @param actualParameter
* the template instance assigned as actual parameter to
* this formal parameter
* @param expectedValue
* the value kind expected from the actual parameter.
*
* @return the actual parameter created from the value, or null if there
* was an error.
*/
private ActualParameter checkActualParameterTimer(final CompilationTimeStamp timestamp, final TemplateInstance actualParameter, final Expected_Value_type expectedValue) {
final IType parameterType = actualParameter.getType();
if (parameterType != null) {
actualParameter.getLocation().reportSemanticError(EXPLICITESPECIFICATIONFORTIMER);
actualParameter.checkType(timestamp, null);
}
final Reference derivedReference = actualParameter.getDerivedReference();
if (derivedReference != null) {
derivedReference.getLocation().reportSemanticError(INLINETEMPLATEFORTIMER);
actualParameter.checkDerivedReference(timestamp, null);
}
final ITTCN3Template template = actualParameter.getTemplateBody();
if (Template_type.SPECIFIC_VALUE.equals(template.getTemplatetype()) && ((SpecificValue_Template) template).isReference()) {
final Reference reference = ((SpecificValue_Template) template).getReference();
final Assignment assignment = reference.getRefdAssignment(timestamp, true, null);
if (assignment == null) {
final ActualParameter temp = new Value_ActualParameter(null);
temp.setIsErroneous();
return temp;
}
switch(assignment.getAssignmentType()) {
case A_TIMER:
final ArrayDimensions dimensions = ((Def_Timer) assignment).getDimensions();
if (dimensions != null) {
dimensions.checkIndices(timestamp, reference, "timer", false, expectedValue);
} else if (reference.getSubreferences().size() > 1) {
reference.getLocation().reportSemanticError(MessageFormat.format(SUBREFERENCEERROR1, assignment.getDescription()));
}
break;
case A_PAR_TIMER:
if (reference.getSubreferences().size() > 1) {
reference.getLocation().reportSemanticError(MessageFormat.format(SUBREFERENCEERROR2, assignment.getDescription()));
}
break;
default:
reference.getLocation().reportSemanticError(MessageFormat.format(TIMEREXPECTED1, assignment.getAssignmentName()));
break;
}
return new Referenced_ActualParameter(reference);
}
actualParameter.getLocation().reportSemanticError(TIMEREXPECTED2);
final ActualParameter temp = new Value_ActualParameter(null);
temp.setIsErroneous();
return temp;
}
use of org.eclipse.titan.designer.AST.IType in project titan.EclipsePlug-ins by eclipse.
the class FormalParameterList method check.
public final void check(final CompilationTimeStamp timestamp, final Assignment_type definitionType) {
if (lastTimeChecked != null && !lastTimeChecked.isLess(timestamp)) {
return;
}
minimumNofParameters = 0;
isStartable = true;
for (int i = 0, size = parameters.size(); i < size; i++) {
FormalParameter parameter = parameters.get(i);
final Identifier identifier = parameter.getIdentifier();
if (parentScope != null) {
if (parentScope.hasAssignmentWithId(timestamp, identifier)) {
parameter.getLocation().reportSemanticError(MessageFormat.format(HIDINGSCOPEELEMENT, identifier.getDisplayName()));
parentScope.hasAssignmentWithId(timestamp, identifier);
final List<ISubReference> subReferences = new ArrayList<ISubReference>();
subReferences.add(new FieldSubReference(identifier));
final Reference reference = new Reference(null, subReferences);
final Assignment assignment = parentScope.getAssBySRef(timestamp, reference);
if (assignment != null && assignment.getLocation() != null) {
assignment.getLocation().reportSingularSemanticWarning(MessageFormat.format(HIDDENSCOPEELEMENT, identifier.getDisplayName()));
}
} else if (parentScope.isValidModuleId(identifier)) {
parameter.getLocation().reportSemanticWarning(MessageFormat.format(HIDINGMODULEIDENTIFIER, identifier.getDisplayName()));
}
}
parameter.check(timestamp);
if (parameter.getAssignmentType() != parameter.getRealAssignmentType()) {
parameter = parameter.setParameterType(parameter.getRealAssignmentType());
parameters.set(i, parameter);
}
if (Assignment_type.A_TEMPLATE.semanticallyEquals(definitionType)) {
if (!Assignment_type.A_PAR_VAL_IN.semanticallyEquals(parameter.getAssignmentType()) && !Assignment_type.A_PAR_TEMP_IN.semanticallyEquals(parameter.getAssignmentType())) {
parameter.getLocation().reportSemanticError("A template cannot have " + parameter.getAssignmentName());
}
} else if (Assignment_type.A_TESTCASE.semanticallyEquals(definitionType)) {
if (Assignment_type.A_PAR_TIMER.semanticallyEquals(parameter.getAssignmentType()) && Assignment_type.A_PAR_PORT.semanticallyEquals(parameter.getAssignmentType())) {
parameter.getLocation().reportSemanticError("A testcase cannot have " + parameter.getAssignmentName());
}
} else {
// everything is allowed for functions and altsteps
}
// startability check
switch(parameter.getAssignmentType()) {
case A_PAR_VAL:
case A_PAR_VAL_IN:
case A_PAR_VAL_OUT:
case A_PAR_VAL_INOUT:
case A_PAR_TEMP_IN:
case A_PAR_TEMP_OUT:
case A_PAR_TEMP_INOUT:
{
final IType tempType = parameter.getType(timestamp);
if (isStartable && tempType != null && tempType.isComponentInternal(timestamp)) {
isStartable = false;
}
break;
}
default:
isStartable = false;
}
if (!parameter.hasDefaultValue()) {
minimumNofParameters = i + 1;
}
}
if (parameters.size() > reportTooManyParametersSize) {
getLocation().reportConfigurableSemanticProblem(reportTooManyParameters, MessageFormat.format(TOOMANYPARAMETERS, reportTooManyParametersSize));
}
checkUniqueness(timestamp);
lastTimeChecked = timestamp;
}
use of org.eclipse.titan.designer.AST.IType in project titan.EclipsePlug-ins by eclipse.
the class Activate_Referenced_Statement method check.
@Override
public /**
* {@inheritDoc}
*/
void check(final CompilationTimeStamp timestamp) {
if (lastTimeChecked != null && !lastTimeChecked.isLess(timestamp)) {
return;
}
isErroneous = false;
lastTimeChecked = timestamp;
if (dereferredValue == null) {
setIsErroneous();
return;
}
dereferredValue.setLoweridToReference(timestamp);
IType type = dereferredValue.getExpressionGovernor(timestamp, Expected_Value_type.EXPECTED_DYNAMIC_VALUE);
if (type != null) {
type = type.getTypeRefdLast(timestamp);
}
if (type == null || type.getIsErroneous(timestamp)) {
setIsErroneous();
return;
}
if (!Type_type.TYPE_ALTSTEP.equals(type.getTypetype())) {
dereferredValue.getLocation().reportSemanticError(MessageFormat.format(ALTSTEPEXPECTED, type.getTypename()));
setIsErroneous();
return;
}
if (((Altstep_Type) type).isRunsOnSelf()) {
dereferredValue.getLocation().reportSemanticError(RUNONSELFERROR);
setIsErroneous();
return;
}
if (myStatementBlock != null) {
myStatementBlock.checkRunsOnScope(timestamp, type, this, STATEMENT_NAME);
}
actualParameterList2 = new ActualParameterList();
final FormalParameterList formalParameterList = ((Altstep_Type) type).getFormalParameters();
if (formalParameterList.checkActualParameterList(timestamp, actualParameterList, actualParameterList2)) {
setIsErroneous();
return;
}
actualParameterList2.setFullNameParent(this);
actualParameterList2.setMyScope(getMyScope());
if (!formalParameterList.checkActivateArgument(timestamp, actualParameterList2, getFullName())) {
setIsErroneous();
}
}
use of org.eclipse.titan.designer.AST.IType in project titan.EclipsePlug-ins by eclipse.
the class Assignment_Statement method checkTemplateAssignment.
private void checkTemplateAssignment(final CompilationTimeStamp timestamp, final Assignment assignment, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) {
IType type = getType(timestamp, assignment);
if (type == null) {
isErroneous = true;
return;
}
// temp
type.check(timestamp);
type = type.getFieldType(timestamp, reference, 1, expectedValue, false);
if (type == null) {
isErroneous = true;
return;
}
template.setMyGovernor(type);
final ITTCN3Template temporalTemplate = type.checkThisTemplateRef(timestamp, template, expectedValue, referenceChain);
selfReference = temporalTemplate.checkThisTemplateGeneric(timestamp, type, true, true, true, true, false, assignment);
checkTemplateRestriction(timestamp);
if (reference.refersToStringElement()) {
if (!template.isValue(timestamp)) {
template.getLocation().reportSemanticError(TEMPLATEASSIGNMENTTOVALUE);
template.setIsErroneous(true);
// isErroneous = true; //????
return;
}
}
}
use of org.eclipse.titan.designer.AST.IType in project titan.EclipsePlug-ins by eclipse.
the class Assignment_Statement method checkVarAssignment.
private void checkVarAssignment(final CompilationTimeStamp timestamp, final Assignment assignment, final IValue value) {
final IType varType = getType(timestamp, assignment);
if (varType == null || value == null) {
isErroneous = true;
return;
}
final IType type = varType.getFieldType(timestamp, reference, 1, Expected_Value_type.EXPECTED_DYNAMIC_VALUE, false);
if (type == null) {
isErroneous = true;
return;
}
value.setMyGovernor(type);
IValue lastValue = type.checkThisValueRef(timestamp, value);
final IReferenceChain referenceChain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true);
lastValue = lastValue.getValueRefdLast(timestamp, referenceChain);
referenceChain.release();
if (Value_type.OMIT_VALUE.equals(lastValue.getValuetype())) {
final ISubReference lastReference = reference.removeLastSubReference();
if (lastReference == null || lastReference.getId() == null) {
value.getLocation().reportSemanticError(OMITTOMANDATORYASSIGNMENT1);
isErroneous = true;
reference.addSubReference(lastReference);
return;
}
final Identifier lastField = lastReference.getId();
final List<ISubReference> baseReference = reference.getSubreferences(0, reference.getSubreferences().size() - 1);
reference.addSubReference(lastReference);
final Reference newReference = new TemporalReference(null, baseReference);
newReference.clearStringElementReferencing();
IType baseType = varType.getFieldType(timestamp, newReference, 1, Expected_Value_type.EXPECTED_DYNAMIC_VALUE, false);
if (baseType == null) {
isErroneous = true;
return;
}
baseType = baseType.getTypeRefdLast(timestamp);
if (baseType.getIsErroneous(timestamp)) {
isErroneous = true;
return;
}
CompField componentField;
switch(baseType.getTypetype()) {
case TYPE_TTCN3_SEQUENCE:
componentField = ((TTCN3_Sequence_Type) baseType).getComponentByName(lastField.getName());
if (componentField != null && !componentField.isOptional()) {
value.getLocation().reportSemanticError(MessageFormat.format(OMITTOMANDATORYASSIGNMENT2, lastField.getDisplayName(), baseType.getTypename()));
value.setIsErroneous(true);
}
break;
case TYPE_ASN1_SEQUENCE:
componentField = ((ASN1_Sequence_Type) baseType).getComponentByName(lastField);
if (componentField != null && !componentField.isOptional()) {
value.getLocation().reportSemanticError(MessageFormat.format(OMITTOMANDATORYASSIGNMENT2, lastField.getDisplayName(), baseType.getTypename()));
value.setIsErroneous(true);
}
break;
case TYPE_TTCN3_SET:
componentField = ((TTCN3_Set_Type) baseType).getComponentByName(lastField.getName());
if (componentField != null && !componentField.isOptional()) {
value.getLocation().reportSemanticError(MessageFormat.format(OMITTOMANDATORYASSIGNMENT2, lastField.getDisplayName(), baseType.getTypename()));
value.setIsErroneous(true);
}
break;
case TYPE_ASN1_SET:
componentField = ((ASN1_Set_Type) baseType).getComponentByName(lastField);
if (componentField != null && !componentField.isOptional()) {
value.getLocation().reportSemanticError(MessageFormat.format(OMITTOMANDATORYASSIGNMENT2, lastField.getDisplayName(), baseType.getTypename()));
value.setIsErroneous(true);
}
break;
default:
// TODO:check this!!!
value.getLocation().reportSemanticError(OMITTOMANDATORYASSIGNMENT1);
value.setIsErroneous(true);
isErroneous = true;
break;
}
} else {
final boolean isStringElement = reference.refersToStringElement();
selfReference = type.checkThisValue(timestamp, value, assignment, new ValueCheckingOptions(Expected_Value_type.EXPECTED_DYNAMIC_VALUE, true, false, !isStringElement, false, isStringElement));
if (isStringElement) {
// The length of the right hand side should be 1
final IType lastType = type.getTypeRefdLast(timestamp);
int stringLength = 1;
switch(lastType.getTypetype()) {
case TYPE_BITSTRING:
case TYPE_BITSTRING_A:
if (!Value_type.BITSTRING_VALUE.equals(lastValue.getValuetype())) {
return;
}
stringLength = ((Bitstring_Value) lastValue).getValueLength();
break;
case TYPE_HEXSTRING:
if (!Value_type.HEXSTRING_VALUE.equals(lastValue.getValuetype())) {
lastValue = null;
} else {
stringLength = ((Hexstring_Value) lastValue).getValueLength();
}
break;
case TYPE_OCTETSTRING:
if (!Value_type.OCTETSTRING_VALUE.equals(lastValue.getValuetype())) {
return;
}
stringLength = ((Octetstring_Value) lastValue).getValueLength();
break;
case TYPE_CHARSTRING:
case TYPE_NUMERICSTRING:
case TYPE_PRINTABLESTRING:
case TYPE_IA5STRING:
case TYPE_VISIBLESTRING:
case TYPE_UTCTIME:
case TYPE_GENERALIZEDTIME:
if (!Value_type.CHARSTRING_VALUE.equals(lastValue.getValuetype())) {
return;
}
stringLength = ((Charstring_Value) lastValue).getValueLength();
break;
case TYPE_UCHARSTRING:
case TYPE_UTF8STRING:
case TYPE_TELETEXSTRING:
case TYPE_VIDEOTEXSTRING:
case TYPE_GRAPHICSTRING:
case TYPE_GENERALSTRING:
case TYPE_UNIVERSALSTRING:
case TYPE_BMPSTRING:
case TYPE_OBJECTDESCRIPTOR:
if (Value_type.UNIVERSALCHARSTRING_VALUE.equals(lastValue.getValuetype())) {
stringLength = ((UniversalCharstring_Value) lastValue).getValueLength();
} else if (Value_type.CHARSTRING_VALUE.equals(lastValue.getValuetype())) {
stringLength = ((Charstring_Value) lastValue).getValueLength();
} else {
return;
}
break;
default:
lastValue = null;
return;
}
if (stringLength != 1) {
final String message = MessageFormat.format("The length of the string to be assigned to a string element of type `{0}'' should be 1 instead of {1}", type.getTypename(), stringLength);
value.getLocation().reportSemanticError(message);
value.setIsErroneous(true);
}
}
}
}
Aggregations