use of org.eclipse.titan.designer.AST.TTCN3.values.Integer_Value in project titan.EclipsePlug-ins by eclipse.
the class ASN1_Integer_Type method checkBoundary.
private IValue checkBoundary(final CompilationTimeStamp timestamp, final Value value, final BOUNDARY_TYPE btype) {
if (value == null) {
return null;
}
value.setMyGovernor(this);
IValue temp = checkThisValueRef(timestamp, value);
checkThisValueLimit(timestamp, temp, new ValueCheckingOptions(Expected_Value_type.EXPECTED_DYNAMIC_VALUE, false, false, true, false, false));
temp = temp.getValueRefdLast(timestamp, Expected_Value_type.EXPECTED_DYNAMIC_VALUE, null);
if (Value_type.REAL_VALUE.equals(temp.getValuetype())) {
if (((Real_Value) temp).isNegativeInfinity()) {
if (BOUNDARY_TYPE.UPPER.equals(btype)) {
value.getLocation().reportSemanticError(INCORRECTUPPERBOUNDARY);
value.setIsErroneous(true);
}
return temp;
} else if (((Real_Value) temp).isPositiveInfinity()) {
if (BOUNDARY_TYPE.LOWER.equals(btype)) {
value.getLocation().reportSemanticError(INCORRECTLOWERBOUNDARY);
value.setIsErroneous(true);
}
return temp;
} else {
value.getLocation().reportSemanticError(INTEGERVALUEEXPECTED);
value.setIsErroneous(true);
return null;
}
}
switch(temp.getValuetype()) {
case INTEGER_VALUE:
break;
default:
temp = null;
break;
}
return temp;
}
use of org.eclipse.titan.designer.AST.TTCN3.values.Integer_Value in project titan.EclipsePlug-ins by eclipse.
the class ASN1_Integer_Type method checkThisValue.
@Override
public /**
* {@inheritDoc}
*/
boolean checkThisValue(final CompilationTimeStamp timestamp, final IValue value, final Assignment lhs, final ValueCheckingOptions valueCheckingOptions) {
final boolean selfReference = super.checkThisValue(timestamp, value, lhs, valueCheckingOptions);
final IValue last = value.getValueRefdLast(timestamp, valueCheckingOptions.expected_value, null);
if (null == last || last.getIsErroneous(timestamp)) {
return selfReference;
}
// already handled ones
switch(value.getValuetype()) {
case OMIT_VALUE:
case REFERENCED_VALUE:
return selfReference;
case UNDEFINED_LOWERIDENTIFIER_VALUE:
if (Value_type.REFERENCED_VALUE.equals(last.getValuetype())) {
return selfReference;
}
break;
default:
break;
}
switch(last.getValuetype()) {
case INTEGER_VALUE:
break;
case NAMED_INTEGER_VALUE:
if (null != namedNumbers) {
// convert it into an integer value
final Identifier name = ((Named_Integer_Value) last).getIdentifier();
final NamedValue namedValue = namedNumbers.getNamedValueByName(name);
IValue tempValue = namedValue.getValue();
final ReferenceChain referenceChain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true);
tempValue = tempValue.getValueRefdLast(timestamp, referenceChain);
referenceChain.release();
if (!tempValue.getIsErroneous(timestamp) && Value_type.INTEGER_VALUE.equals(tempValue.getValuetype())) {
final int temp = ((Integer_Value) tempValue).intValue();
final Integer_Value converted = new Integer_Value(temp);
converted.copyGeneralProperties(value);
((Named_Integer_Value) last).setCalculatedValue(converted);
} else {
// FIXME Most probably we were not able
// to build the semantic structure for
// something, because it is not yet
// supported, like referenced values in
// sets
}
}
break;
case EXPRESSION_VALUE:
case MACRO_VALUE:
// already checked
break;
default:
value.getLocation().reportSemanticError(INTEGERVALUEEXPECTED);
value.setIsErroneous(true);
}
value.setLastTimeChecked(timestamp);
return selfReference;
}
use of org.eclipse.titan.designer.AST.TTCN3.values.Integer_Value in project titan.EclipsePlug-ins by eclipse.
the class ASN1_Integer_Type method checkThisTemplate.
@Override
public /**
* {@inheritDoc}
*/
boolean checkThisTemplate(final CompilationTimeStamp timestamp, final ITTCN3Template template, final boolean isModified, final boolean implicitOmit, final Assignment lhs) {
registerUsage(template);
template.setMyGovernor(this);
if (getIsErroneous(timestamp)) {
return false;
}
if (Template_type.VALUE_RANGE.equals(template.getTemplatetype())) {
final ValueRange range = ((Value_Range_Template) template).getValueRange();
final IValue lower = checkBoundary(timestamp, range.getMin(), BOUNDARY_TYPE.LOWER);
final IValue upper = checkBoundary(timestamp, range.getMax(), BOUNDARY_TYPE.UPPER);
range.setTypeType(getTypetypeTtcn3());
if (lower != null && Value.Value_type.INTEGER_VALUE.equals(lower.getValuetype()) && upper != null && Value.Value_type.INTEGER_VALUE.equals(upper.getValuetype())) {
if (!getIsErroneous(timestamp) && ((Integer_Value) lower).getValue() > ((Integer_Value) upper).getValue()) {
template.getLocation().reportSemanticError(INCORRECTBOUNDARIES);
}
}
// TODO: some checks are still missing
} else {
template.getLocation().reportSemanticError(MessageFormat.format(TEMPLATENOTALLOWED, template.getTemplateTypeName()));
}
if (template.getLengthRestriction() != null) {
template.getLocation().reportSemanticError(LENGTHRESTRICTIONNOTALLOWED);
}
return false;
}
use of org.eclipse.titan.designer.AST.TTCN3.values.Integer_Value in project titan.EclipsePlug-ins by eclipse.
the class ASN1_BitString_Type method checkThisValue.
@Override
public /**
* {@inheritDoc}
*/
boolean checkThisValue(final CompilationTimeStamp timestamp, final IValue value, final Assignment lhs, final ValueCheckingOptions valueCheckingOptions) {
final boolean selfReference = super.checkThisValue(timestamp, value, lhs, valueCheckingOptions);
IValue last = value.getValueRefdLast(timestamp, valueCheckingOptions.expected_value, null);
if (last == null || last.getIsErroneous(timestamp)) {
return selfReference;
}
// already handled ones
switch(value.getValuetype()) {
case OMIT_VALUE:
case REFERENCED_VALUE:
return selfReference;
case UNDEFINED_LOWERIDENTIFIER_VALUE:
if (Value_type.REFERENCED_VALUE.equals(last.getValuetype())) {
return selfReference;
}
break;
default:
break;
}
if (last.isAsn()) {
if (last instanceof IReferencingType) {
final IType type = last.getMyGovernor().getTypeRefdLast(timestamp);
switch(type.getTypetype()) {
case TYPE_BITSTRING:
case TYPE_BITSTRING_A:
break;
default:
value.getLocation().reportSemanticError("(reference to) BIT STRING value was expected");
value.setIsErroneous(true);
value.setLastTimeChecked(timestamp);
return selfReference;
}
}
switch(last.getValuetype()) {
case BITSTRING_VALUE:
break;
case HEXSTRING_VALUE:
last.setValuetype(timestamp, Value_type.BITSTRING_VALUE);
break;
case UNDEFINED_BLOCK:
{
last = last.setValuetype(timestamp, Value_type.NAMED_BITS);
if (namedValues == null) {
value.getLocation().reportSemanticError(MessageFormat.format("No named bits are defined in type `{0}''", getTypename()));
value.setIsErroneous(true);
value.setLastTimeChecked(timestamp);
return selfReference;
}
final Named_Bits namedBits = (Named_Bits) last;
final StringBuilder builder = new StringBuilder(namedBits.getNofIds());
for (int i = 0; i < namedBits.getNofIds(); i++) {
final Identifier id = namedBits.getIdByIndex(i);
if (!namedValues.hasNamedValueWithName(id)) {
id.getLocation().reportSemanticError(MessageFormat.format("No named bit with name `{0}'' is defined in type `{1}''", id.getDisplayName(), getTypename()));
value.setIsErroneous(true);
value.setLastTimeChecked(timestamp);
return selfReference;
}
IValue tempValue = namedValues.getNamedValueByName(id).getValue();
final ReferenceChain referenceChain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true);
tempValue = tempValue.getValueRefdLast(timestamp, referenceChain);
referenceChain.release();
if (!tempValue.getIsErroneous(timestamp) && Value_type.INTEGER_VALUE.equals(tempValue.getValuetype())) {
final int bitIndex = ((Integer_Value) tempValue).intValue();
while (builder.length() <= bitIndex) {
builder.append('0');
}
builder.setCharAt(bitIndex, '1');
} else {
// FIXME Most probably we were
// not able to build the
// semantic structure for
// something, because it is not
// yet supported, like
// referenced values in sets
}
}
last = new Bitstring_Value(builder.toString());
last.copyGeneralProperties(value);
namedBits.setRealValue((Bitstring_Value) last);
break;
}
default:
value.getLocation().reportSemanticError(BITSTRINGVALUEEXPECTED1);
value.setIsErroneous(true);
value.setLastTimeChecked(timestamp);
return selfReference;
}
} else {
switch(last.getValuetype()) {
case BITSTRING_VALUE:
break;
case EXPRESSION_VALUE:
case MACRO_VALUE:
// already checked
break;
default:
value.getLocation().reportSemanticError(BITSTRINGVALUEEXPECTED2);
value.setIsErroneous(true);
}
}
if (valueCheckingOptions.sub_check) {
// there is no parent type to check
if (subType != null) {
subType.checkThisValue(timestamp, last);
}
}
value.setLastTimeChecked(timestamp);
return selfReference;
}
use of org.eclipse.titan.designer.AST.TTCN3.values.Integer_Value in project titan.EclipsePlug-ins by eclipse.
the class ASN1_Enumerated_Type method checkEnumItem.
/**
* Helper function for checking a single enumeration item. Checks if the
* name of the item is not a duplicate, and its value is in correct
* order. Also for items after the ellipsis if the value is missing a
* new one is assigned.
*
* @param timestamp
* the timestamp of the actual semantic check cycle.
* @param item
* the enumeration item to work on.
* @param afterEllipsis
* true if the enumeration item is after the ellipsis.
* @param valueMap
* a value map so that the correctness of the item's
* value can be checked.
*/
private final void checkEnumItem(final CompilationTimeStamp timestamp, final EnumItem item, final boolean afterEllipsis, final Map<Integer, EnumItem> valueMap) {
final Identifier itemID = item.getId();
if (nameMap.containsKey(itemID.getName())) {
nameMap.get(itemID.getName()).getLocation().reportSingularSemanticError(MessageFormat.format(Assignments.DUPLICATEDEFINITIONFIRST, itemID.getDisplayName()));
itemID.getLocation().reportSemanticError(MessageFormat.format(DUPLICATEENUMERATEDREPEATED, itemID.getDisplayName()));
} else {
nameMap.put(itemID.getName(), item);
}
if (!itemID.getHasValid(Identifier_type.ID_TTCN)) {
itemID.getLocation().reportSemanticWarning(MessageFormat.format(ASN1Assignment.UNREACHABLE, itemID.getDisplayName()));
}
final Value value = item.getValue();
if (!item.isOriginal()) {
if (afterEllipsis) {
while (valueMap.containsKey(firstUnused)) {
firstUnused++;
}
valueMap.put(firstUnused, item);
// again.
if (null == value || ((Integer_Value) value).getValue() != firstUnused) {
final Integer_Value tempValue = new Integer_Value(firstUnused.longValue());
tempValue.setLocation(item.getLocation());
item.setValue(tempValue);
}
}
return;
}
final IReferenceChain referenceChain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true);
final IValue last = value.getValueRefdLast(timestamp, referenceChain);
referenceChain.release();
if (last.getIsErroneous(timestamp)) {
return;
}
if (!Value_type.INTEGER_VALUE.equals(last.getValuetype())) {
value.getLocation().reportSemanticError(MessageFormat.format("INTEGER value was expected for enumeration `{0}''", itemID.getDisplayName()));
value.setIsErroneous(true);
return;
}
final Integer_Value temp = (Integer_Value) last;
if (!temp.isNative()) {
value.getLocation().reportSemanticError(MessageFormat.format("The numeric value of enumeration `{0}'' ({1}) is too large for being represented in memory", itemID.getDisplayName(), temp.getValueValue()));
value.setIsErroneous(true);
return;
}
final Integer enumValue = Integer.valueOf(temp.intValue());
if (afterEllipsis) {
if (enumValue >= firstUnused) {
valueMap.put(enumValue, item);
while (valueMap.containsKey(firstUnused)) {
firstUnused++;
}
} else {
value.getLocation().reportSemanticError(MessageFormat.format("ENUMERATED values shall be monotonically growing after the ellipsis: the value of `{0}'' must be at least {1} instead of {2}", itemID.getDisplayName(), firstUnused, enumValue));
value.setIsErroneous(true);
}
} else {
if (valueMap.containsKey(enumValue)) {
final Location tempLocation = valueMap.get(enumValue).getLocation();
tempLocation.reportSingularSemanticError(MessageFormat.format(DUPLICATEDENUMERATIONVALUEFIRST, enumValue, valueMap.get(enumValue).getId().getDisplayName()));
value.getLocation().reportSemanticError(MessageFormat.format(DUPLICATEDENUMERATIONVALUEREPEATED, enumValue, itemID.getDisplayName()));
setIsErroneous(true);
} else {
valueMap.put(enumValue, item);
}
}
}
Aggregations