use of org.eclipse.titan.designer.AST.TTCN3.values.Referenced_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.Referenced_Value in project titan.EclipsePlug-ins by eclipse.
the class ASN1_Sequence_Type method checkThisValue.
@Override
public /**
* {@inheritDoc}
*/
boolean checkThisValue(final CompilationTimeStamp timestamp, final IValue value, final Assignment lhs, final ValueCheckingOptions valueCheckingOptions) {
if (getIsErroneous(timestamp)) {
return false;
}
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;
}
switch(last.getValuetype()) {
case SEQUENCE_VALUE:
if (last.isAsn()) {
selfReference = checkThisValueSeq(timestamp, (Sequence_Value) last, lhs, valueCheckingOptions.expected_value, false, valueCheckingOptions.implicit_omit, valueCheckingOptions.str_elem);
} else {
selfReference = checkThisValueSeq(timestamp, (Sequence_Value) last, lhs, valueCheckingOptions.expected_value, valueCheckingOptions.incomplete_allowed, valueCheckingOptions.implicit_omit, valueCheckingOptions.str_elem);
}
break;
case SEQUENCEOF_VALUE:
if (((SequenceOf_Value) last).isIndexed()) {
value.getLocation().reportSemanticError(MessageFormat.format("Indexed assignment notation cannot be used for SEQUENCE type `{0}''", getFullName()));
value.setIsErroneous(true);
} else {
last = last.setValuetype(timestamp, Value_type.SEQUENCE_VALUE);
if (last.isAsn()) {
selfReference = checkThisValueSeq(timestamp, (Sequence_Value) last, lhs, valueCheckingOptions.expected_value, false, valueCheckingOptions.implicit_omit, valueCheckingOptions.str_elem);
} else {
selfReference = checkThisValueSeq(timestamp, (Sequence_Value) last, lhs, valueCheckingOptions.expected_value, valueCheckingOptions.incomplete_allowed, valueCheckingOptions.implicit_omit, valueCheckingOptions.str_elem);
}
}
break;
case UNDEFINED_BLOCK:
last = last.setValuetype(timestamp, Value_type.SEQUENCE_VALUE);
selfReference = checkThisValueSeq(timestamp, (Sequence_Value) last, lhs, valueCheckingOptions.expected_value, false, valueCheckingOptions.implicit_omit, valueCheckingOptions.str_elem);
break;
case EXPRESSION_VALUE:
case MACRO_VALUE:
// already checked
break;
default:
value.getLocation().reportSemanticError(MessageFormat.format(SEQUANCEEPECTED, getFullName()));
value.setIsErroneous(true);
}
value.setLastTimeChecked(timestamp);
return selfReference;
}
use of org.eclipse.titan.designer.AST.TTCN3.values.Referenced_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.Referenced_Value in project titan.EclipsePlug-ins by eclipse.
the class ASN1_Enumerated_Type method checkThisValueRef.
@Override
public final /**
* {@inheritDoc}
*/
IValue checkThisValueRef(final CompilationTimeStamp timestamp, final IValue value) {
IValue temp = value;
if (Value_type.REFERENCED_VALUE.equals(value.getValuetype())) {
// we are not able to parse lower identifier values as default values
// so the parsed reference needs to be converted.
final Reference reference = ((Referenced_Value) value).getReference();
if (reference.getModuleIdentifier() == null && reference.getSubreferences().size() == 1) {
final Identifier identifier = reference.getId();
temp = new Enumerated_Value(identifier);
temp.setMyGovernor(this);
temp.setFullNameParent(this);
temp.setMyScope(value.getMyScope());
return temp;
}
}
if (Value_type.UNDEFINED_LOWERIDENTIFIER_VALUE.equals(temp.getValuetype())) {
if (nameMap != null && nameMap.containsKey(((Undefined_LowerIdentifier_Value) temp).getIdentifier().getName())) {
temp = temp.setValuetype(timestamp, Value_type.ENUMERATED_VALUE);
temp.setMyGovernor(this);
temp.setFullNameParent(this);
temp.setMyScope(value.getMyScope());
return temp;
}
}
return super.checkThisValueRef(timestamp, value);
}
use of org.eclipse.titan.designer.AST.TTCN3.values.Referenced_Value in project titan.EclipsePlug-ins by eclipse.
the class LogArgument method checkValue.
/**
* Does the semantic checking of the log argument. Once it was
* determined that it is a value.
*
* @param timestamp
* the timestamp of the actual semantic check cycle.
* @param value
* the value contained in the log argument.
*/
private void checkValue(final CompilationTimeStamp timestamp, final IValue value) {
final IValue temp = value.setLoweridToReference(timestamp);
switch(temp.getValuetype()) {
case CHARSTRING_VALUE:
internalLogArgument = new String_InternalLogArgument(((Charstring_Value) temp).getValue());
break;
case REFERENCED_VALUE:
final Reference reference = ((Referenced_Value) temp).getReference();
internalLogArgument = new Reference_InternalLogArgument(reference);
checkReference(timestamp, reference);
return;
case EXPRESSION_VALUE:
final Expression_Value castedValue = (Expression_Value) temp;
if (Operation_type.MATCH_OPERATION.equals(castedValue.getOperationType())) {
internalLogArgument = new Match_InternalLogArgument((MatchExpression) castedValue);
} else {
internalLogArgument = new Value_InternalLogArgument(temp);
}
break;
case MACRO_VALUE:
internalLogArgument = new Macro_InternalLogArgument((Macro_Value) temp);
break;
default:
internalLogArgument = new Value_InternalLogArgument(temp);
break;
}
final IType governor = temp.getExpressionGovernor(timestamp, Expected_Value_type.EXPECTED_TEMPLATE);
if (governor == null) {
getLocation().reportSemanticError("Cannot determine the type of the argument");
isErroneous = true;
return;
}
// TODO: Is the next part necessary ???
temp.setMyGovernor(governor);
// TODO:WHY
governor.checkThisValue(timestamp, temp, null, new ValueCheckingOptions(Expected_Value_type.EXPECTED_TEMPLATE, true, true, true, true, false));
final IReferenceChain chain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true);
if (ArgumentType.Value.equals(internalLogArgument.getArgumentType()) && !temp.isUnfoldable(timestamp)) {
final IValue last = temp.getValueRefdLast(timestamp, chain);
if (Value_type.CHARSTRING_VALUE.equals(last.getValuetype())) {
internalLogArgument = new String_InternalLogArgument(((Charstring_Value) last).getValue());
}
} else if (ArgumentType.Macro.equals(internalLogArgument.getArgumentType())) {
final IValue last = temp.getValueRefdLast(timestamp, chain);
switch(last.getValuetype()) {
case CHARSTRING_VALUE:
internalLogArgument = new String_InternalLogArgument(((Charstring_Value) last).getValue());
break;
case MACRO_VALUE:
break;
default:
internalLogArgument = new Value_InternalLogArgument(temp);
break;
}
}
chain.release();
}
Aggregations