| 556 | } |
| 557 | |
| 558 | erpc_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 |
nothing calls this directly
no test coverage detected