use of org.eclipse.titan.designer.AST.TTCN3.values.SequenceOf_Value in project titan.EclipsePlug-ins by eclipse.
the class RotateRightExpression method checkExpressionOperands.
/**
* Checks the parameters of the expression and if they are valid in
* their position in the expression or not.
*
* @param timestamp
* the timestamp of the actual semantic check cycle.
* @param expectedValue
* the kind of value expected.
* @param referenceChain
* a reference chain to detect cyclic references.
*/
private void checkExpressionOperands(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) {
Type_type tempType1 = null;
Type_type tempType2 = null;
long valueSize = 0;
long rotationSize = 0;
IValue tempValue;
if (value1 != null) {
value1.setLoweridToReference(timestamp);
tempType1 = value1.getExpressionReturntype(timestamp, expectedValue);
switch(tempType1) {
case TYPE_BITSTRING:
tempValue = value1.getValueRefdLast(timestamp, expectedValue, referenceChain);
if (Value_type.BITSTRING_VALUE.equals(tempValue.getValuetype())) {
valueSize = ((Bitstring_Value) tempValue).getValueLength();
}
break;
case TYPE_HEXSTRING:
tempValue = value1.getValueRefdLast(timestamp, expectedValue, referenceChain);
if (Value_type.HEXSTRING_VALUE.equals(tempValue.getValuetype())) {
valueSize = ((Hexstring_Value) tempValue).getValueLength();
}
break;
case TYPE_OCTETSTRING:
tempValue = value1.getValueRefdLast(timestamp, expectedValue, referenceChain);
if (Value_type.OCTETSTRING_VALUE.equals(tempValue.getValuetype())) {
valueSize = ((Octetstring_Value) tempValue).getValueLength();
}
break;
case TYPE_CHARSTRING:
tempValue = value1.getValueRefdLast(timestamp, expectedValue, referenceChain);
if (Value_type.CHARSTRING_VALUE.equals(tempValue.getValuetype())) {
valueSize = ((Charstring_Value) tempValue).getValueLength();
}
break;
case TYPE_UCHARSTRING:
tempValue = value1.getValueRefdLast(timestamp, expectedValue, referenceChain);
if (Value_type.UNIVERSALCHARSTRING_VALUE.equals(tempValue.getValuetype())) {
valueSize = ((UniversalCharstring_Value) tempValue).getValueLength();
}
break;
case TYPE_SET_OF:
tempValue = value1.getValueRefdLast(timestamp, expectedValue, referenceChain);
if (Value_type.SEQUENCEOF_VALUE.equals(tempValue.getValuetype())) {
tempValue = tempValue.setValuetype(timestamp, Value_type.SETOF_VALUE);
}
if (Value_type.SETOF_VALUE.equals(tempValue.getValuetype())) {
valueSize = ((SetOf_Value) tempValue).getNofComponents();
}
break;
case TYPE_SEQUENCE_OF:
tempValue = value1.getValueRefdLast(timestamp, expectedValue, referenceChain);
if (Value_type.SEQUENCEOF_VALUE.equals(tempValue.getValuetype())) {
valueSize = ((SequenceOf_Value) tempValue).getNofComponents();
} else if (Value_type.SETOF_VALUE.equals(tempValue.getValuetype())) {
valueSize = ((SetOf_Value) tempValue).getNofComponents();
}
break;
case TYPE_ARRAY:
tempValue = value1.getValueRefdLast(timestamp, expectedValue, referenceChain);
if (Value_type.SEQUENCEOF_VALUE.equals(tempValue.getValuetype())) {
tempValue = tempValue.setValuetype(timestamp, Value_type.ARRAY_VALUE);
}
if (Value_type.ARRAY_VALUE.equals(tempValue.getValuetype())) {
valueSize = ((Array_Value) tempValue).getNofComponents();
}
break;
case TYPE_UNDEFINED:
setIsErroneous(true);
break;
default:
location.reportSemanticError(FIRSTOPERANDERROR);
setIsErroneous(true);
break;
}
}
if (value2 != null) {
value2.setLoweridToReference(timestamp);
tempType2 = value2.getExpressionReturntype(timestamp, expectedValue);
switch(tempType2) {
case TYPE_INTEGER:
tempValue = value2.getValueRefdLast(timestamp, expectedValue, referenceChain);
if (Value_type.INTEGER_VALUE.equals(tempValue.getValuetype()) && !getIsErroneous(timestamp)) {
if (!((Integer_Value) tempValue).isNative()) {
value2.getLocation().reportSemanticError(MessageFormat.format(LARGEINTEGERSECONDOPERANDERROR, ((Integer_Value) tempValue).getValueValue()));
setIsErroneous(true);
break;
}
rotationSize = ((Integer_Value) tempValue).getValue();
if (value1 != null && !value1.isUnfoldable(timestamp)) {
final String severity = Platform.getPreferencesService().getString(ProductConstants.PRODUCT_ID_DESIGNER, PreferenceConstants.REPORTINCORRECTSHIFTROTATESIZE, GeneralConstants.WARNING, null);
if (valueSize == 0 || valueSize == 1) {
location.reportConfigurableSemanticProblem(severity, EFFECTLESSROTATION);
} else if (rotationSize < 0) {
location.reportConfigurableSemanticProblem(severity, NEGATIVEROTATEPROBLEM);
} else if (rotationSize == 0) {
location.reportConfigurableSemanticProblem(severity, ZEROROTATEPROBLEM);
} else if (rotationSize > valueSize) {
location.reportConfigurableSemanticProblem(severity, MessageFormat.format(TOOBIGROTATEPROBLEM, valueSize, rotationSize, rotationSize % valueSize));
}
}
}
break;
case TYPE_UNDEFINED:
setIsErroneous(true);
break;
default:
location.reportSemanticError(SECONDOPERANDERROR);
setIsErroneous(true);
break;
}
}
}
use of org.eclipse.titan.designer.AST.TTCN3.values.SequenceOf_Value in project titan.EclipsePlug-ins by eclipse.
the class LengthofExpression method evaluateValue.
@Override
public /**
* {@inheritDoc}
*/
IValue evaluateValue(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) {
if (lastTimeChecked != null && !lastTimeChecked.isLess(timestamp)) {
return lastValue;
}
isErroneous = false;
lastTimeChecked = timestamp;
lastValue = this;
if (templateInstance == null) {
return lastValue;
}
checkExpressionOperands(timestamp, expectedValue, referenceChain);
if (getIsErroneous(timestamp)) {
return lastValue;
}
if (isUnfoldable(timestamp, referenceChain)) {
return lastValue;
}
final ITTCN3Template template = templateInstance.getTemplateBody();
final IValue value = ((SpecificValue_Template) template).getSpecificValue().getValueRefdLast(timestamp, referenceChain);
int length;
switch(value.getValuetype()) {
case CHARSTRING_VALUE:
length = ((Charstring_Value) value).getValueLength();
break;
case UNIVERSALCHARSTRING_VALUE:
length = ((UniversalCharstring_Value) value).getValueLength();
break;
case BITSTRING_VALUE:
length = ((Bitstring_Value) value).getValueLength();
break;
case HEXSTRING_VALUE:
length = ((Hexstring_Value) value).getValueLength();
break;
case OCTETSTRING_VALUE:
length = ((Octetstring_Value) value).getValueLength();
break;
case SEQUENCEOF_VALUE:
length = ((SequenceOf_Value) value).getNofComponents();
break;
case SETOF_VALUE:
length = ((SetOf_Value) value).getNofComponents();
break;
case ARRAY_VALUE:
length = ((Array_Value) value).getNofComponents();
break;
default:
setIsErroneous(true);
return lastValue;
}
lastValue = new Integer_Value(length);
lastValue.copyGeneralProperties(this);
return lastValue;
}
use of org.eclipse.titan.designer.AST.TTCN3.values.SequenceOf_Value in project titan.EclipsePlug-ins by eclipse.
the class SubstrExpression method checkExpressionOperandsHelper.
private void checkExpressionOperandsHelper(final CompilationTimeStamp timestamp, final IValue value1, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) {
if (value1 == null || value2 == null || value3 == null || getIsErroneous(timestamp)) {
return;
}
long valueSize = -1;
if (!value1.isUnfoldable(timestamp)) {
IValue temp = value1.setLoweridToReference(timestamp);
temp = temp.getValueRefdLast(timestamp, referenceChain);
switch(temp.getValuetype()) {
case BITSTRING_VALUE:
valueSize = ((Bitstring_Value) temp).getValueLength();
break;
case HEXSTRING_VALUE:
valueSize = ((Hexstring_Value) temp).getValueLength();
break;
case OCTETSTRING_VALUE:
valueSize = ((Octetstring_Value) temp).getValueLength();
break;
case CHARSTRING_VALUE:
valueSize = ((Charstring_Value) temp).getValueLength();
break;
case UNIVERSALCHARSTRING_VALUE:
valueSize = ((UniversalCharstring_Value) temp).getValueLength();
break;
case SEQUENCEOF_VALUE:
valueSize = ((SequenceOf_Value) temp).getNofComponents();
if (valueSize == 0) {
templateInstance1.getLocation().reportSemanticError(OPERANDERROR11);
}
break;
case SETOF_VALUE:
valueSize = ((SetOf_Value) temp).getNofComponents();
if (valueSize == 0) {
templateInstance1.getLocation().reportSemanticError(OPERANDERROR11);
}
break;
default:
break;
}
}
if (valueSize < 0) {
return;
}
if (value2.isUnfoldable(timestamp)) {
if (!value3.isUnfoldable(timestamp)) {
final IValue last3 = value3.getValueRefdLast(timestamp, expectedValue, referenceChain);
final long last3Value = ((Integer_Value) last3).getValue();
if (last3Value > valueSize) {
location.reportSemanticError(MessageFormat.format(OPERANDERROR6, last3Value, valueSize));
setIsErroneous(true);
}
}
} else {
final IValue last2 = value2.getValueRefdLast(timestamp, expectedValue, referenceChain);
final long last2Value = ((Integer_Value) last2).getValue();
if (value3.isUnfoldable(timestamp)) {
if (last2Value > valueSize) {
location.reportSemanticError(MessageFormat.format(OPERANDERROR7, last2Value, valueSize));
setIsErroneous(true);
}
} else {
final IValue last3 = value3.getValueRefdLast(timestamp, expectedValue, referenceChain);
final long last3Value = ((Integer_Value) last3).getValue();
if (last2Value + last3Value > valueSize) {
location.reportSemanticError(MessageFormat.format(OPERANDERROR8, last2Value, last3Value, valueSize));
setIsErroneous(true);
}
}
}
}
use of org.eclipse.titan.designer.AST.TTCN3.values.SequenceOf_Value in project titan.EclipsePlug-ins by eclipse.
the class IncorrectRotate method getFirstRotateOperandLength.
/**
* @param ct the compilation timestamp to be used
* @param value the first operand of the rotate operation
* @return the length of the first operand if it can be determined
*/
private static long getFirstRotateOperandLength(final CompilationTimeStamp ct, final Value value) {
if (value == null) {
return 0;
}
final Type_type tempType = value.getExpressionReturntype(ct, null);
final IValue refd = value.getValueRefdLast(ct, null);
long valueSize = 0;
switch(tempType) {
case TYPE_BITSTRING:
if (Value_type.BITSTRING_VALUE.equals(refd.getValuetype())) {
valueSize = ((Bitstring_Value) refd).getValueLength();
}
break;
case TYPE_HEXSTRING:
if (Value_type.HEXSTRING_VALUE.equals(refd.getValuetype())) {
valueSize = ((Hexstring_Value) refd).getValueLength();
}
break;
case TYPE_OCTETSTRING:
if (Value_type.OCTETSTRING_VALUE.equals(refd.getValuetype())) {
valueSize = ((Octetstring_Value) refd).getValueLength();
}
break;
case TYPE_CHARSTRING:
if (Value_type.CHARSTRING_VALUE.equals(refd.getValuetype())) {
valueSize = ((Charstring_Value) refd).getValueLength();
}
break;
case TYPE_UCHARSTRING:
if (Value_type.UNIVERSALCHARSTRING_VALUE.equals(refd.getValuetype())) {
valueSize = ((UniversalCharstring_Value) refd).getValueLength();
}
break;
case TYPE_SET_OF:
if (Value_type.SEQUENCEOF_VALUE.equals(value.getValuetype())) {
valueSize = ((SequenceOf_Value) value).getNofComponents();
} else if (Value_type.SETOF_VALUE.equals(value.getValuetype())) {
valueSize = ((SetOf_Value) value).getNofComponents();
}
break;
case TYPE_SEQUENCE_OF:
if (Value_type.SEQUENCEOF_VALUE.equals(value.getValuetype())) {
valueSize = ((SequenceOf_Value) value).getNofComponents();
} else if (Value_type.SETOF_VALUE.equals(value.getValuetype())) {
valueSize = ((SetOf_Value) value).getNofComponents();
}
break;
case TYPE_ARRAY:
if (Value_type.SEQUENCEOF_VALUE.equals(value.getValuetype())) {
valueSize = ((SequenceOf_Value) value).getNofComponents();
}
if (Value_type.ARRAY_VALUE.equals(value.getValuetype())) {
valueSize = ((Array_Value) value).getNofComponents();
}
break;
default:
break;
}
return valueSize;
}
use of org.eclipse.titan.designer.AST.TTCN3.values.SequenceOf_Value in project titan.EclipsePlug-ins by eclipse.
the class SequenceOf_Type method checkThisValueSequenceOf.
/**
* Checks the SequenceOf_value kind value against this type.
* <p>
* Please note, that this function can only be called once we know for sure
* that the value is of set-of type.
*
* @param timestamp the timestamp of the actual semantic check cycle.
* @param value the value to be checked
* @param expectedValue the kind of value expected here.
* @param incompleteAllowed wheather incomplete value is allowed or not.
* @param implicitOmit true if the implicit omit optional attribute was set
* for the value, false otherwise
*/
public boolean checkThisValueSequenceOf(final CompilationTimeStamp timestamp, final SequenceOf_Value value, final Assignment lhs, final Expected_Value_type expectedValue, final boolean incompleteAllowed, final boolean implicitOmit, final boolean strElem) {
boolean selfReference = false;
if (value.isIndexed()) {
boolean checkHoles = Expected_Value_type.EXPECTED_CONSTANT.equals(expectedValue);
BigInteger maxIndex = BigInteger.valueOf(-1);
final Map<BigInteger, Integer> indexMap = new HashMap<BigInteger, Integer>(value.getNofComponents());
for (int i = 0, size = value.getNofComponents(); i < size; i++) {
final IValue component = value.getValueByIndex(i);
final IValue index = value.getIndexByIndex(i);
final IReferenceChain referenceChain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true);
final IValue indexLast = index.getValueRefdLast(timestamp, referenceChain);
referenceChain.release();
final IType tempType = TypeFactory.createType(Type_type.TYPE_INTEGER);
tempType.check(timestamp);
indexLast.setMyGovernor(tempType);
final IValue temporalValue = tempType.checkThisValueRef(timestamp, indexLast);
tempType.checkThisValue(timestamp, temporalValue, lhs, new ValueCheckingOptions(Expected_Value_type.EXPECTED_DYNAMIC_VALUE, true, false, true, false, false));
if (indexLast.getIsErroneous(timestamp) || !Value_type.INTEGER_VALUE.equals(temporalValue.getValuetype())) {
checkHoles = false;
} else {
final BigInteger tempIndex = ((Integer_Value) temporalValue).getValueValue();
if (tempIndex.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) == 1) {
index.getLocation().reportSemanticError(MessageFormat.format("A integer value less than `{0}'' was expected for indexing type `{1}'' instead of `{2}''", Integer.MAX_VALUE, getTypename(), tempIndex));
checkHoles = false;
} else if (tempIndex.compareTo(BigInteger.ZERO) == -1) {
index.getLocation().reportSemanticError(MessageFormat.format("A non-negative integer value was expected for indexing type `{0}'' instead of `{1}''", getTypename(), tempIndex));
checkHoles = false;
} else if (indexMap.containsKey(tempIndex)) {
index.getLocation().reportSemanticError(MessageFormat.format("Duplicate index value `{0}'' for components {1} and {2}", tempIndex, indexMap.get(tempIndex), i + 1));
checkHoles = false;
} else {
indexMap.put(tempIndex, Integer.valueOf(i + 1));
if (maxIndex.compareTo(tempIndex) == -1) {
maxIndex = tempIndex;
}
}
}
component.setMyGovernor(getOfType());
final IValue tempValue2 = getOfType().checkThisValueRef(timestamp, component);
selfReference |= getOfType().checkThisValue(timestamp, tempValue2, lhs, new ValueCheckingOptions(expectedValue, incompleteAllowed, false, true, implicitOmit, strElem));
}
if (checkHoles) {
if (maxIndex.compareTo(BigInteger.valueOf(indexMap.size() - 1)) != 0) {
value.getLocation().reportSemanticError("It's not allowed to create hole(s) in constant values");
}
}
} else {
for (int i = 0, size = value.getNofComponents(); i < size; i++) {
final IValue component = value.getValueByIndex(i);
component.setMyGovernor(getOfType());
if (Value_type.NOTUSED_VALUE.equals(component.getValuetype())) {
if (!incompleteAllowed) {
component.getLocation().reportSemanticError(INCOMPLETEPRESENTERROR);
}
} else {
final IValue tempValue2 = getOfType().checkThisValueRef(timestamp, component);
selfReference |= getOfType().checkThisValue(timestamp, tempValue2, lhs, new ValueCheckingOptions(expectedValue, incompleteAllowed, false, true, implicitOmit, strElem));
}
}
}
value.setLastTimeChecked(timestamp);
return selfReference;
}
Aggregations