MCPcopy Create free account
hub / github.com/EmbeddedRPC/erpc / parseMemberType

Method parseMemberType

erpcsniffer/src/Sniffer.cpp:558–638  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

556}
557
558erpc_status_t Sniffer::parseMemberType(StructType *structType, StructMember *structMember, string &parsedMemberInfo)
559{
560 erpc_status_t err;
561 DataType *currentDataType = structMember->getDataType();
562 // DataType *currentTrueDataType = currentDataType->getTrueDataType();
563
564 if (structType)
565 {
566 // check if data type is referenced
567 for (StructMember *referenced : structType->getMembers())
568 {
569 Annotation *ann;
570 string referencedName;
571 if ((ann = referenced->findAnnotation(LENGTH_ANNOTATION, Annotation::program_lang_t::kC)) ||
572 (ann = referenced->findAnnotation(DISCRIMINATOR_ANNOTATION, Annotation::program_lang_t::kC)))
573 {
574 if (Value *val = ann->getValueObject())
575 {
576 referencedName = val->toString();
577 }
578 }
579 DataType *referencedDataType = referenced->getDataType()->getTrueDataType();
580 if (referencedName.empty() && referencedDataType->isUnion())
581 {
582 UnionType *unionType = dynamic_cast<UnionType *>(referencedDataType);
583 assert(unionType);
584 referencedName = unionType->getDiscriminatorName();
585 }
586 if (!referencedName.empty() && structMember->getName().compare(referencedName) == 0)
587 {
588 parsedMemberInfo = "serialized via other member";
589 return kErpcStatus_Success;
590 }
591 }
592
593 // check if reference is null-able
594 Annotation *ann;
595 if ((ann = structMember->findAnnotation(LENGTH_ANNOTATION, Annotation::program_lang_t::kC)) ||
596 (ann = structMember->findAnnotation(DISCRIMINATOR_ANNOTATION, Annotation::program_lang_t::kC)))
597 {
598 if (Value *val = ann->getValueObject())
599 {
600 StructMember *reference =
601 dynamic_cast<StructMember *>(structType->getScope().getSymbol(val->toString(), false));
602 err = readNullFlag(reference, parsedMemberInfo);
603 if (err)
604 {
605 return err;
606 }
607 else if (!parsedMemberInfo.empty())
608 {
609 return kErpcStatus_Success;
610 }
611 }
612 }
613 }
614
615 // check if current member is null-able

Callers

nothing calls this directly

Calls 10

getValueObjectMethod · 0.80
getTrueDataTypeMethod · 0.80
isUnionMethod · 0.80
getDiscriminatorNameMethod · 0.80
getSymbolMethod · 0.80
getDataTypeMethod · 0.45
findAnnotationMethod · 0.45
toStringMethod · 0.45
emptyMethod · 0.45
getNameMethod · 0.45

Tested by

no test coverage detected