@@ -3483,9 +3483,46 @@ typedef std::unique_ptr<FileNameToGroupNameMap> pFileNameToGroupNameMap;
3483
3483
3484
3484
class YamlGroupInputParser {
3485
3485
StringRef RecordPath;
3486
-
3486
+ std::string Separator = " . " ;
3487
3487
static llvm::StringMap<pFileNameToGroupNameMap> AllMaps;
3488
3488
3489
+ bool parseRoot (FileNameToGroupNameMap &Map, llvm::yaml::Node *Root,
3490
+ StringRef ParentName) {
3491
+ llvm::yaml::MappingNode *MapNode = dyn_cast<llvm::yaml::MappingNode>(Root);
3492
+ if (!MapNode) {
3493
+ return true ;
3494
+ }
3495
+ for (auto Pair : *MapNode) {
3496
+ auto *Key = dyn_cast_or_null<llvm::yaml::ScalarNode>(Pair.getKey ());
3497
+ auto *Value = dyn_cast_or_null<llvm::yaml::SequenceNode>(Pair.getValue ());
3498
+
3499
+ if (!Key || !Value) {
3500
+ return true ;
3501
+ }
3502
+ llvm::SmallString<16 > GroupNameStorage;
3503
+ llvm::SmallString<16 > CombinedNameStorage;
3504
+ StringRef GroupName = Key->getValue (GroupNameStorage);
3505
+ if (!ParentName.empty ()) {
3506
+ CombinedNameStorage.append (ParentName);
3507
+ CombinedNameStorage.append (Separator);
3508
+ }
3509
+ CombinedNameStorage.append (GroupName);
3510
+ StringRef CombinedName = CombinedNameStorage.str ();
3511
+ for (llvm::yaml::Node &Entry : *Value) {
3512
+ if (auto *FileEntry= dyn_cast<llvm::yaml::ScalarNode>(&Entry)) {
3513
+ llvm::SmallString<16 > FileNameStorage;
3514
+ StringRef FileName = FileEntry->getValue (FileNameStorage);
3515
+ Map[FileName] = CombinedName;
3516
+ } else if (Entry.getType () == llvm::yaml::Node::NodeKind::NK_Mapping) {
3517
+ if (parseRoot (Map, &Entry, CombinedName))
3518
+ return true ;
3519
+ } else
3520
+ return true ;
3521
+ }
3522
+ }
3523
+ return false ;
3524
+ }
3525
+
3489
3526
public:
3490
3527
YamlGroupInputParser (StringRef RecordPath): RecordPath(RecordPath) {}
3491
3528
@@ -3526,22 +3563,8 @@ class YamlGroupInputParser {
3526
3563
return true ;
3527
3564
}
3528
3565
pFileNameToGroupNameMap pMap (new FileNameToGroupNameMap ());
3529
- for (auto Pair : *Map) {
3530
- auto *Key = dyn_cast_or_null<llvm::yaml::ScalarNode>(Pair.getKey ());
3531
- auto *Value = dyn_cast_or_null<llvm::yaml::SequenceNode>(Pair.getValue ());
3532
-
3533
- if (!Key || !Value) {
3534
- return true ;
3535
- }
3536
- llvm::SmallString<16 > GroupNameStorage;
3537
- StringRef GroupName = Key->getValue (GroupNameStorage);
3538
- for (llvm::yaml::Node &Entry : *Value) {
3539
- auto *FileEntry= dyn_cast<llvm::yaml::ScalarNode>(&Entry);
3540
- llvm::SmallString<16 > FileNameStorage;
3541
- StringRef FileName = FileEntry->getValue (FileNameStorage);
3542
- (*pMap)[FileName] = GroupName;
3543
- }
3544
- }
3566
+ if (parseRoot (*pMap, Root, " " ))
3567
+ return true ;
3545
3568
3546
3569
// Save the parsed map to the owner.
3547
3570
AllMaps[RecordPath] = std::move (pMap);
0 commit comments