use of org.eclipse.titan.designer.AST.TTCN3.definitions.Def_Port in project titan.EclipsePlug-ins by eclipse.
the class Def_Type_Visit_Handler method visitDefTypeChildrenNodes.
public void visitDefTypeChildrenNodes(IVisitableNode node) {
if (node instanceof Def_Port) {
Def_Port port = (Def_Port) node;
componentPortNames.add(port.getIdentifier().toString());
}
if (node instanceof Def_Var) {
Def_Var var = (Def_Var) node;
componentVarNames.add(var.getIdentifier().toString());
if (var.getType(compilationCounter) instanceof Integer_Type) {
componentVarTypes.add("INTEGER");
}
}
if (waitForCompReference && (node instanceof Reference)) {
componentPortTypes.add(((Reference) node).getId().toString());
}
if (waitForSetOfFieldType) {
if (node instanceof Reference) {
setOfFieldType = node.toString();
myASTVisitor.nodeNameSetOfTypesHashMap.put(parentName, setOfFieldType);
waitForSetOfFieldType = false;
} else if (node instanceof Type && !(node instanceof Referenced_Type) && !(node instanceof SetOf_Type)) {
Type type = (Type) node;
setOfFieldType = TypeMapper.map(type.getTypename());
myASTVisitor.nodeNameSetOfTypesHashMap.put(parentName, setOfFieldType);
waitForSetOfFieldType = false;
}
}
if (waitForRecordOfFieldType) {
if (node instanceof Reference) {
recordOfFieldType = node.toString();
myASTVisitor.nodeNameRecordOfTypesHashMap.put(parentName, recordOfFieldType);
waitForRecordOfFieldType = false;
} else if (node instanceof Type && !(node instanceof Referenced_Type) && !(node instanceof SequenceOf_Type)) {
Type type = (Type) node;
recordOfFieldType = TypeMapper.map(type.getTypename());
myASTVisitor.nodeNameRecordOfTypesHashMap.put(parentName, recordOfFieldType);
waitForRecordOfFieldType = false;
}
}
if (node instanceof CompField) {
// component
CompField compFieldNode = (CompField) node;
if (compFieldNode.getType() instanceof Referenced_Type) {
compFieldTypes.add(((Referenced_Type) compFieldNode.getType()).getReference().getId().toString());
} else {
compFieldTypes.add(myASTVisitor.cutModuleNameFromBeginning(compFieldNode.getType().getTypename()));
}
compFieldNames.add(compFieldNode.getIdentifier().toString());
}
if (node instanceof Charstring_Value) {
// charstring
Charstring_Value singleValuedNode = (Charstring_Value) node;
charstringValue = singleValuedNode.getValue();
}
if (node instanceof Integer_Value) {
String value = ((Integer_Value) node).toString();
if (myASTVisitor.isNextIntegerNegative) {
value = "-" + value;
}
expressionValue.add("new INTEGER(\"" + value + "\")");
}
if (node instanceof Real_Value) {
String value = ((Real_Value) node).toString();
if (myASTVisitor.isNextIntegerNegative) {
value = "-" + value;
}
if (value.equals("-Infinity") || value.equals("Infinity")) {
value = "null";
}
expressionValue.add(value);
}
if (node instanceof Undefined_LowerIdentifier_Value) {
String value = ((Undefined_LowerIdentifier_Value) node).getIdentifier().toString();
if (myASTVisitor.isNextIntegerNegative) {
value = "-" + value;
}
expressionValue.add(value);
}
if (node instanceof EnumerationItems) {
for (int i = 0; i < ((EnumerationItems) node).getItems().size(); i++) {
enumItems.add(((EnumerationItems) node).getItems().get(i).getId().toString());
if (((EnumerationItems) node).getItems().get(i).getValue() != null) {
enumItemValues.add(((EnumerationItems) node).getItems().get(i).getValue().toString());
} else {
enumItemValues.add(null);
}
}
}
if (waitingForPortAttriburtes && (node instanceof Referenced_Type)) {
isPortTypeAReferencedType = true;
}
if (waitingForPortAttriburtes && (node instanceof PortTypeBody)) {
PortTypeBody body = (PortTypeBody) node;
int inCount = body.getInMessages().getNofTypes();
int outCount = body.getOutMessage().getNofTypes();
for (int i = 0; i < inCount; i++) {
inMessageName.add(myASTVisitor.cutModuleNameFromBeginning(body.getInMessages().getTypeByIndex(i).getTypename()));
}
for (int i = 0; i < outCount; i++) {
outMessageName.add(myASTVisitor.cutModuleNameFromBeginning(body.getOutMessage().getTypeByIndex(i).getTypename()));
}
int shorterListSize = inMessageName.size() <= outMessageName.size() ? inMessageName.size() : outMessageName.size();
// if inout delete from both lists and add to inout
for (int i = 0; i < inMessageName.size(); i++) {
for (int j = 0; j < outMessageName.size(); j++) {
if (inMessageName.get(i).equals(outMessageName.get(j))) {
inOutMessageName.add(inMessageName.get(i));
inMessageName.remove(i);
if (j == (outMessageName.size() - 1)) {
i--;
}
outMessageName.remove(j);
j--;
}
}
}
myASTVisitor.portNamePortTypeHashMap.put(currentPortName, body.getTestportType().toString());
portTypeList.add(body.getTestportType().toString());
}
}
use of org.eclipse.titan.designer.AST.TTCN3.definitions.Def_Port in project titan.EclipsePlug-ins by eclipse.
the class SizeOfExpression 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.
*
* @return the size of the expression, or -1 in case of error
*/
private long checkExpressionOperands(final CompilationTimeStamp timestamp, final Expected_Value_type expectedValue, final IReferenceChain referenceChain) {
Expected_Value_type internalExpectedValue;
if (Expected_Value_type.EXPECTED_DYNAMIC_VALUE.equals(expectedValue)) {
internalExpectedValue = Expected_Value_type.EXPECTED_TEMPLATE;
} else {
internalExpectedValue = expectedValue;
}
ITTCN3Template template = templateInstance.getTemplateBody();
template.setLoweridToReference(timestamp);
template = template.getTemplateReferencedLast(timestamp, referenceChain);
if (template.getIsErroneous(timestamp)) {
setIsErroneous(true);
return -1;
}
// Timer and port arrays are handled separately
if (template.getTemplatetype() == Template_type.SPECIFIC_VALUE) {
final SpecificValue_Template specValTempl = (SpecificValue_Template) template;
IValue val = specValTempl.getSpecificValue();
val.setMyGovernor(specValTempl.getMyGovernor());
if (val.getValuetype() == Value_type.UNDEFINED_LOWERIDENTIFIER_VALUE) {
val = val.setLoweridToReference(timestamp);
}
if (val != null && val.getValuetype() == Value_type.REFERENCED_VALUE) {
final Referenced_Value referencedValue = (Referenced_Value) val;
final Reference ref = referencedValue.getReference();
final Assignment temporalAss = ref.getRefdAssignment(timestamp, true);
if (temporalAss != null) {
final Assignment_type asstype = temporalAss.getAssignmentType();
ArrayDimensions dimensions;
if (asstype == Assignment_type.A_PORT) {
dimensions = ((Def_Port) temporalAss).getDimensions();
return checkTimerPort(timestamp, ref, dimensions, temporalAss);
} else if (asstype == Assignment_type.A_TIMER) {
dimensions = ((Def_Timer) temporalAss).getDimensions();
return checkTimerPort(timestamp, ref, dimensions, temporalAss);
}
}
}
}
IType governor = templateInstance.getExpressionGovernor(timestamp, internalExpectedValue);
if (governor == null) {
final ITTCN3Template templ = template.setLoweridToReference(timestamp);
governor = templ.getExpressionGovernor(timestamp, internalExpectedValue);
}
if (governor == null) {
if (!template.getIsErroneous(timestamp)) {
templateInstance.getLocation().reportSemanticError("Cannot determine the type of the argument in the `sizeof' operation. If type is known, use valueof(<type>: ...) as argument.");
}
setIsErroneous(true);
return -1;
}
IsValueExpression.checkExpressionTemplateInstance(timestamp, this, templateInstance, governor, referenceChain, internalExpectedValue);
if (isErroneous) {
return -1;
}
IType type = governor.getTypeRefdLast(timestamp);
switch(type.getTypetype()) {
case TYPE_SEQUENCE_OF:
case TYPE_SET_OF:
case TYPE_TTCN3_SEQUENCE:
case TYPE_TTCN3_SET:
case TYPE_ASN1_SEQUENCE:
case TYPE_ASN1_SET:
case TYPE_ARRAY:
case TYPE_OBJECTID:
case TYPE_ROID:
case TYPE_UNDEFINED:
break;
default:
templateInstance.getLocation().reportSemanticError("Reference to a value or template of type record, record of, set, set of, objid or array was expected");
setIsErroneous(true);
return -1;
}
IValue value = null;
Reference reference = null;
Assignment assignment = null;
List<ISubReference> subreferences = null;
switch(template.getTemplatetype()) {
case INDEXED_TEMPLATE_LIST:
return -1;
case TEMPLATE_REFD:
reference = ((Referenced_Template) template).getReference();
assignment = reference.getRefdAssignment(timestamp, false);
subreferences = reference.getSubreferences();
break;
case TEMPLATE_LIST:
case NAMED_TEMPLATE_LIST:
case SUBSET_MATCH:
case SUPERSET_MATCH:
// compute later
break;
case SPECIFIC_VALUE:
value = ((SpecificValue_Template) template).getSpecificValue().getValueRefdLast(timestamp, referenceChain);
if (value != null) {
switch(value.getValuetype()) {
case SEQUENCEOF_VALUE:
case SETOF_VALUE:
case ARRAY_VALUE:
case RELATIVEOBJECTIDENTIFIER_VALUE:
case OBJECTID_VALUE:
case SEQUENCE_VALUE:
case SET_VALUE:
break;
case REFERENCED_VALUE:
{
reference = ((Referenced_Value) value).getReference();
assignment = reference.getRefdAssignment(timestamp, false);
subreferences = reference.getSubreferences();
break;
}
default:
templateInstance.getLocation().reportSemanticError(MessageFormat.format("`sizeof'' operation is not applicable to `{0}''", value.createStringRepresentation()));
setIsErroneous(true);
return -1;
}
}
break;
default:
templateInstance.getLocation().reportSemanticError(MessageFormat.format("`sizeof'' operation is not applicable to {0}", template.getTemplateTypeName()));
setIsErroneous(true);
return -1;
}
if (assignment != null) {
if (assignment.getIsErroneous()) {
setIsErroneous(true);
return -1;
}
switch(assignment.getAssignmentType()) {
case A_CONST:
value = ((Def_Const) assignment).getValue();
break;
case A_EXT_CONST:
case A_MODULEPAR:
case A_MODULEPAR_TEMPLATE:
if (Expected_Value_type.EXPECTED_CONSTANT.equals(internalExpectedValue)) {
templateInstance.getLocation().reportSemanticError(MessageFormat.format("Reference to an (evaluable) constant value was expected instead of {0}", assignment.getDescription()));
setIsErroneous(true);
return -1;
}
break;
case A_VAR:
case A_PAR_VAL:
case A_PAR_VAL_IN:
case A_PAR_VAL_OUT:
case A_PAR_VAL_INOUT:
switch(internalExpectedValue) {
case EXPECTED_CONSTANT:
templateInstance.getLocation().reportSemanticError(MessageFormat.format("Reference to a constant value was expected instead of {0}", assignment.getDescription()));
setIsErroneous(true);
return -1;
case EXPECTED_STATIC_VALUE:
templateInstance.getLocation().reportSemanticError(MessageFormat.format("Reference to a static value was expected instead of {0}", assignment.getDescription()));
setIsErroneous(true);
return -1;
default:
break;
}
break;
case A_TEMPLATE:
template = ((Def_Template) assignment).getTemplate(timestamp);
if (!Expected_Value_type.EXPECTED_TEMPLATE.equals(internalExpectedValue)) {
templateInstance.getLocation().reportSemanticError(MessageFormat.format("Reference to a value was expected instead of {0}", assignment.getDescription()));
setIsErroneous(true);
return -1;
}
break;
case A_VAR_TEMPLATE:
case A_PAR_TEMP_IN:
case A_PAR_TEMP_OUT:
case A_PAR_TEMP_INOUT:
if (!Expected_Value_type.EXPECTED_TEMPLATE.equals(internalExpectedValue)) {
templateInstance.getLocation().reportSemanticError(MessageFormat.format("Reference to a value was expected instead of {0}", assignment.getDescription()));
setIsErroneous(true);
return -1;
}
break;
case A_FUNCTION_RVAL:
case A_EXT_FUNCTION_RVAL:
switch(internalExpectedValue) {
case EXPECTED_CONSTANT:
templateInstance.getLocation().reportSemanticError(MessageFormat.format("Reference to a constant value was expected instead of the return value of {0}", assignment.getDescription()));
setIsErroneous(true);
return -1;
case EXPECTED_STATIC_VALUE:
templateInstance.getLocation().reportSemanticError(MessageFormat.format("Reference to a static value was expected instead of the return value of {0}", assignment.getDescription()));
setIsErroneous(true);
return -1;
default:
break;
}
break;
case A_FUNCTION_RTEMP:
case A_EXT_FUNCTION_RTEMP:
if (!Expected_Value_type.EXPECTED_TEMPLATE.equals(internalExpectedValue)) {
templateInstance.getLocation().reportSemanticError(MessageFormat.format("Reference to a value was expected instead of a call of {0}, which returns a template", assignment.getDescription()));
setIsErroneous(true);
return -1;
}
break;
case A_TIMER:
case A_PORT:
// were already checked separately.
break;
default:
templateInstance.getLocation().reportSemanticError(MessageFormat.format("Reference to a {0} was expected instead of {1}", Expected_Value_type.EXPECTED_TEMPLATE.equals(internalExpectedValue) ? "value or template" : "value", assignment.getDescription()));
setIsErroneous(true);
return -1;
}
type = assignment.getType(timestamp).getFieldType(timestamp, reference, 1, Expected_Value_type.EXPECTED_DYNAMIC_VALUE, false);
if (type == null || type.getIsErroneous(timestamp)) {
setIsErroneous(true);
return -1;
}
type = type.getTypeRefdLast(timestamp);
switch(type.getTypetype()) {
case TYPE_SEQUENCE_OF:
case TYPE_SET_OF:
case TYPE_TTCN3_SEQUENCE:
case TYPE_TTCN3_SET:
case TYPE_ASN1_SEQUENCE:
case TYPE_ASN1_SET:
case TYPE_ARRAY:
case TYPE_OBJECTID:
case TYPE_ROID:
case TYPE_UNDEFINED:
break;
default:
templateInstance.getLocation().reportSemanticError("Reference to a value or template of type record, record of, set, set of, objid or array was expected");
setIsErroneous(true);
return -1;
}
}
// check for index overflows in subrefs if possible
if (value != null) {
switch(value.getValuetype()) {
case SEQUENCEOF_VALUE:
if (((SequenceOf_Value) value).isIndexed()) {
return -1;
}
break;
case SETOF_VALUE:
if (((SetOf_Value) value).isIndexed()) {
return -1;
}
break;
case ARRAY_VALUE:
if (((Array_Value) value).isIndexed()) {
return -1;
}
break;
default:
break;
}
/* The reference points to a constant. */
if (subreferences != null && !reference.hasUnfoldableIndexSubReference(timestamp)) {
value = value.getReferencedSubValue(timestamp, reference, 1, referenceChain);
if (value == null) {
setIsErroneous(true);
return -1;
}
value = value.getValueRefdLast(timestamp, referenceChain);
} else {
// stop processing
value = null;
}
} else if (template != null) {
/* The size of INDEXED_TEMPLATE_LIST nodes is unknown at compile
time. Don't try to evaluate it at compile time. */
if (reference != null && reference.hasUnfoldableIndexSubReference(timestamp)) {
return -1;
}
if (reference != null && subreferences != null) {
template = template.getReferencedSubTemplate(timestamp, reference, referenceChain);
if (template == null) {
setIsErroneous(true);
return -1;
}
template = template.getTemplateReferencedLast(timestamp);
}
}
if (template != null) {
if (template.getIsErroneous(timestamp)) {
setIsErroneous(true);
return -1;
}
switch(template.getTemplatetype()) {
case TEMPLATE_REFD:
template = null;
break;
case SPECIFIC_VALUE:
value = ((SpecificValue_Template) template).getSpecificValue().getValueRefdLast(timestamp, referenceChain);
template = null;
break;
case TEMPLATE_LIST:
case NAMED_TEMPLATE_LIST:
case SUBSET_MATCH:
case SUPERSET_MATCH:
break;
default:
// FIXME this can not happen
templateInstance.getLocation().reportSemanticError(MessageFormat.format("`sizeof'' operation is not applicable to {0}", template.getTemplateTypeName()));
setIsErroneous(true);
return -1;
}
}
if (value != null) {
switch(value.getValuetype()) {
case SEQUENCEOF_VALUE:
case SETOF_VALUE:
case ARRAY_VALUE:
case RELATIVEOBJECTIDENTIFIER_VALUE:
case OBJECTID_VALUE:
case SEQUENCE_VALUE:
case SET_VALUE:
break;
default:
value = null;
return -1;
}
}
/* evaluation */
if (Type_type.TYPE_ARRAY.equals(type.getTypetype())) {
return ((Array_Type) type).getDimension().getSize();
} else if (template != null) {
return evaluateTemplate(template, timestamp);
} else if (value != null) {
return evaluateValue(value);
} else {
return -1;
}
}
use of org.eclipse.titan.designer.AST.TTCN3.definitions.Def_Port in project titan.EclipsePlug-ins by eclipse.
the class Port_Utility method checkConnectionEndpoint.
/**
* Checks a reference to see if it really references a valid component
* type.
*
* @param timestamp
* the timestamp of the actual semantic check cycle.
* @param source
* the statement to report an error to, in case it is in
* a control part.
* @param componentReference
* the reference of the component to be checked.
* @param portReference
* the reference to a port of the component to be
* checked.
* @param allowSystem
* tells if the system component should be allowed or not
* as an endpoint.
*
* @return the referenced component type, or null if there were
* problems.
*/
public static IType checkConnectionEndpoint(final CompilationTimeStamp timestamp, final Statement source, final Value componentReference, final PortReference portReference, final boolean allowSystem) {
final IType componentType = checkComponentReference(timestamp, source, componentReference, true, allowSystem);
if (portReference == null) {
return componentType;
}
if (componentType == null) {
// the component type can not be determined
final List<ISubReference> subreferences = portReference.getSubreferences();
if (subreferences.size() > 1) {
// check array indices
for (int i = 0; i < subreferences.size(); i++) {
final ISubReference subreference = subreferences.get(i);
if (subreference instanceof ArraySubReference) {
final Value value = ((ArraySubReference) subreference).getValue();
value.setLoweridToReference(timestamp);
final Type_type temporalType1 = value.getExpressionReturntype(timestamp, Expected_Value_type.EXPECTED_DYNAMIC_VALUE);
switch(temporalType1) {
case TYPE_INTEGER:
{
final IReferenceChain referenceChain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true);
final IValue last1 = value.getValueRefdLast(timestamp, Expected_Value_type.EXPECTED_DYNAMIC_VALUE, referenceChain);
referenceChain.release();
if (!last1.isUnfoldable(timestamp) && Value.Value_type.INTEGER_VALUE.equals(last1.getValuetype())) {
if (((Integer_Value) last1).signum() < 0) {
value.getLocation().reportSemanticError(ArraySubReference.NATIVEINTEGEREXPECTED);
value.setIsErroneous(true);
}
}
break;
}
case TYPE_UNDEFINED:
value.setIsErroneous(true);
break;
default:
if (!value.getIsErroneous(timestamp)) {
value.getLocation().reportSemanticError(ArraySubReference.INTEGERINDEXEXPECTED);
value.setIsErroneous(true);
}
break;
}
}
}
}
return null;
}
final ComponentTypeBody componentBody = ((Component_Type) componentType).getComponentBody();
portReference.setBaseScope(componentBody);
portReference.setComponent((Component_Type) componentType);
// for compatibility
portReference.getRefdAssignment(timestamp, false);
final Identifier portIdentifier = portReference.getId();
if (!componentBody.hasLocalAssignmentWithId(portIdentifier)) {
portReference.getLocation().reportSemanticError(MessageFormat.format(NOPORTWITHNAME, componentType.getTypename(), portIdentifier.getDisplayName()));
return null;
}
final Assignment assignment = componentBody.getLocalAssignmentById(portIdentifier);
if (assignment == null) {
return null;
}
if (!Assignment_type.A_PORT.semanticallyEquals(assignment.getAssignmentType())) {
portReference.getLocation().reportSemanticError(MessageFormat.format(DEFINITIONNOTPORT, portIdentifier.getDisplayName(), componentType.getTypename(), assignment.getAssignmentName()));
return null;
}
final ArrayDimensions dimensions = ((Def_Port) assignment).getDimensions();
if (dimensions != null) {
dimensions.checkIndices(timestamp, portReference, "port", false, Expected_Value_type.EXPECTED_DYNAMIC_VALUE);
} else if (portReference.getSubreferences().size() > 1) {
portReference.getLocation().reportSemanticError(MessageFormat.format("Port `{0}'' is not an array. The reference cannot have field or array sub-references", portIdentifier.getDisplayName()));
}
Port_Type portType = ((Def_Port) assignment).getType(timestamp);
if (portType != null) {
final PortTypeBody portBody = portType.getPortBody();
if (PortType_type.PT_USER.equals(portBody.getPortType())) {
final IType providerType = portBody.getProviderType();
if (providerType instanceof Port_Type) {
portType = (Port_Type) providerType;
}
}
}
return portType;
}
use of org.eclipse.titan.designer.AST.TTCN3.definitions.Def_Port in project titan.EclipsePlug-ins by eclipse.
the class Port_Utility method checkPortReference.
/**
* Checks a port reference.
* Statement independent version.
*
* @param timestamp
* the timestamp of the actual build cycle.
* @param portReference
* the port reference to be checked
*
* @return the port type of the reference if it is a correct port
* reference, or null otherwise
*/
public static Port_Type checkPortReference(final CompilationTimeStamp timestamp, final Reference portReference) {
if (portReference == null) {
return null;
}
final Assignment assignment = portReference.getRefdAssignment(timestamp, true);
if (assignment == null || assignment.getIsErroneous()) {
return null;
}
IType result = null;
switch(assignment.getAssignmentType()) {
case A_PORT:
final ArrayDimensions dimensions = ((Def_Port) assignment).getDimensions();
if (dimensions != null) {
dimensions.checkIndices(timestamp, portReference, "port", false, Expected_Value_type.EXPECTED_DYNAMIC_VALUE);
} else if (portReference.getSubreferences().size() > 1) {
portReference.getLocation().reportSemanticError(MessageFormat.format("Reference to single {0} cannot have field or array sub-references", assignment.getDescription()));
}
result = ((Def_Port) assignment).getType(timestamp);
break;
case A_PAR_PORT:
if (portReference.getSubreferences().size() > 1) {
portReference.getLocation().reportSemanticError(MessageFormat.format("Reference to {0} cannot have field or array sub-references", assignment.getDescription()));
}
result = ((FormalParameter) assignment).getType(timestamp);
break;
default:
portReference.getLocation().reportSemanticError(MessageFormat.format(PORTREFERENCEEXPECTED, assignment.getAssignmentName()));
break;
}
if (result == null) {
return null;
}
result = result.getTypeRefdLast(timestamp);
if (Type_type.TYPE_PORT.equals(result.getTypetype())) {
return (Port_Type) result;
}
return null;
}
use of org.eclipse.titan.designer.AST.TTCN3.definitions.Def_Port in project titan.EclipsePlug-ins by eclipse.
the class LogArgument method checkReference.
/**
* Does the semantic checking of the log argument. Once it was
* determined that it is a reference.
*
* @param timestamp
* the timestamp of the actual semantic check cycle.
* @param reference
* the reference contained in the log argument.
*/
private void checkReference(final CompilationTimeStamp timestamp, final Reference reference) {
if (reference == null) {
return;
}
final Assignment assignment = reference.getRefdAssignment(timestamp, true);
if (assignment == null || assignment.getIsErroneous()) {
return;
}
switch(assignment.getAssignmentType()) {
case A_FUNCTION_RVAL:
case A_FUNCTION_RTEMP:
case A_EXT_FUNCTION_RVAL:
case A_EXT_FUNCTION_RTEMP:
{
reference.getMyScope().checkRunsOnScope(timestamp, assignment, reference, "call");
final IType assingmentType = assignment.getType(timestamp);
if (assingmentType != null) {
assingmentType.getFieldType(timestamp, reference, 1, Expected_Value_type.EXPECTED_DYNAMIC_VALUE, false);
}
break;
}
case A_CONST:
{
final IType assingmentType = assignment.getType(timestamp);
if (assingmentType != null && assingmentType.getFieldType(timestamp, reference, 1, Expected_Value_type.EXPECTED_DYNAMIC_VALUE, false) != null) {
final IReferenceChain chain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true);
if (assignment instanceof Def_Const) {
((Def_Const) assignment).getValue().getReferencedSubValue(timestamp, reference, 1, chain);
} else {
((Value_Assignment) assignment).getValue().getReferencedSubValue(timestamp, reference, 1, chain);
}
chain.release();
}
break;
}
case A_TEMPLATE:
{
final IType assingmentType = assignment.getType(timestamp);
if (assingmentType != null && assingmentType.getFieldType(timestamp, reference, 1, Expected_Value_type.EXPECTED_DYNAMIC_VALUE, false) != null) {
final IReferenceChain chain = ReferenceChain.getInstance(IReferenceChain.CIRCULARREFERENCE, true);
((Def_Template) assignment).getTemplate(timestamp).getReferencedSubTemplate(timestamp, reference, chain);
chain.release();
}
break;
}
case A_MODULEPAR_TEMPLATE:
{
final IType assingmentType = assignment.getType(timestamp);
if (assingmentType != null) {
assingmentType.getFieldType(timestamp, reference, 1, Expected_Value_type.EXPECTED_DYNAMIC_VALUE, false);
}
break;
}
case A_EXT_CONST:
case A_MODULEPAR:
case A_VAR:
case A_VAR_TEMPLATE:
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 assingmentType = assignment.getType(timestamp);
if (assingmentType != null) {
assingmentType.getFieldType(timestamp, reference, 1, Expected_Value_type.EXPECTED_DYNAMIC_VALUE, false);
}
break;
}
case A_PORT:
{
final ArrayDimensions dimensions = ((Def_Port) assignment).getDimensions();
if (dimensions != null) {
dimensions.checkIndices(timestamp, reference, assignment.getAssignmentName(), true, Expected_Value_type.EXPECTED_DYNAMIC_VALUE);
} else if (reference.getSubreferences().size() > 1) {
getLocation().reportSemanticError(MessageFormat.format("Reference to single {0} cannot have field or array sub-references", assignment.getDescription()));
isErroneous = true;
}
break;
}
case A_TIMER:
{
final ArrayDimensions dimensions = ((Def_Timer) assignment).getDimensions();
if (dimensions != null) {
dimensions.checkIndices(timestamp, reference, assignment.getAssignmentName(), true, Expected_Value_type.EXPECTED_DYNAMIC_VALUE);
} else if (reference.getSubreferences().size() > 1) {
getLocation().reportSemanticError(MessageFormat.format("Reference to single {0} cannot have field or array sub-references", assignment.getDescription()));
isErroneous = true;
}
break;
}
case A_PAR_TIMER:
case A_PAR_PORT:
if (reference.getSubreferences().size() > 1) {
getLocation().reportSemanticError(MessageFormat.format("Reference to {0} cannot have field or array sub-references", assignment.getDescription()));
isErroneous = true;
}
break;
case A_FUNCTION:
case A_EXT_FUNCTION:
getLocation().reportSemanticError(MessageFormat.format("Reference to a value, template, timer or port was ecpected instead of a call of {0}, which does not have a return type", assignment.getDescription()));
isErroneous = true;
break;
default:
getLocation().reportSemanticError(MessageFormat.format("Reference to a value, template, timer or port was expected instead of {0}", assignment.getDescription()));
isErroneous = true;
break;
}
}
Aggregations