BaseTools: use combined version of OrderedDict
authorCarsey, Jaben </o=Intel/ou=Americas01/cn=Workers/cn=Carsey, Jaben>
Tue, 3 Apr 2018 21:03:08 +0000 (05:03 +0800)
committerYonghong Zhu <yonghong.zhu@intel.com>
Sun, 8 Apr 2018 06:50:17 +0000 (14:50 +0800)
since we need order and a default entry, use collections dicts to
auto generate.

Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Jaben Carsey <jaben.carsey@intel.com>
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
BaseTools/Source/Python/Workspace/WorkspaceCommon.py

index abe34cf9a071ec60cda6b030310c78b1871ebd50..8c27b4ad5b9b4ed9ec970973b4bb56ca66cf16ba 100644 (file)
 #\r
 \r
 from Common.Misc import sdict\r
+from collections import OrderedDict, defaultdict\r
 from Common.DataType import SUP_MODULE_USER_DEFINED\r
 from BuildClassObject import LibraryClassObject\r
 import Common.GlobalData as GlobalData\r
 from Workspace.BuildClassObject import StructurePcd\r
 \r
+class OrderedListDict(OrderedDict, defaultdict):\r
+    def __init__(self, *args, **kwargs):\r
+        super(OrderedListDict, self).__init__(*args, **kwargs)\r
+        self.default_factory = list\r
+\r
 ## Get all packages from platform for specified arch, target and toolchain\r
 #\r
 #  @param Platform: DscBuildData instance\r
@@ -106,7 +112,7 @@ def _GetModuleLibraryInstances(Module, Platform, BuildDatabase, Arch, Target, To
     # EdkII module\r
     LibraryConsumerList = [Module]\r
     Constructor = []\r
-    ConsumedByList = sdict()\r
+    ConsumedByList = OrderedListDict()\r
     LibraryInstance = sdict()\r
 \r
     while len(LibraryConsumerList) > 0:\r
@@ -145,8 +151,6 @@ def _GetModuleLibraryInstances(Module, Platform, BuildDatabase, Arch, Target, To
             if LibraryModule.ConstructorList != [] and LibraryModule not in Constructor:\r
                 Constructor.append(LibraryModule)\r
 \r
-            if LibraryModule not in ConsumedByList:\r
-                ConsumedByList[LibraryModule] = []\r
             # don't add current module itself to consumer list\r
             if M != Module:\r
                 if M in ConsumedByList[LibraryModule]:\r
@@ -164,7 +168,7 @@ def _GetModuleLibraryInstances(Module, Platform, BuildDatabase, Arch, Target, To
     for LibraryClassName in LibraryInstance:\r
         M = LibraryInstance[LibraryClassName]\r
         LibraryList.append(M)\r
-        if ConsumedByList[M] == []:\r
+        if len(ConsumedByList[M]) == 0:\r
             Q.append(M)\r
 \r
     #\r
@@ -185,7 +189,7 @@ def _GetModuleLibraryInstances(Module, Platform, BuildDatabase, Arch, Target, To
                     # remove edge e from the graph if Node has no constructor\r
                     ConsumedByList[Item].remove(Node)\r
                     EdgeRemoved = True\r
-                    if ConsumedByList[Item] == []:\r
+                    if len(ConsumedByList[Item]) == 0:\r
                         # insert Item into Q\r
                         Q.insert(0, Item)\r
                         break\r
@@ -207,7 +211,7 @@ def _GetModuleLibraryInstances(Module, Platform, BuildDatabase, Arch, Target, To
             # remove edge e from the graph\r
             ConsumedByList[Item].remove(Node)\r
 \r
-            if ConsumedByList[Item] != []:\r
+            if len(ConsumedByList[Item]) != 0:\r
                 continue\r
             # insert Item into Q, if Item has no other incoming edges\r
             Q.insert(0, Item)\r
@@ -216,7 +220,7 @@ def _GetModuleLibraryInstances(Module, Platform, BuildDatabase, Arch, Target, To
     # if any remaining node Item in the graph has a constructor and an incoming edge, then the graph has a cycle\r
     #\r
     for Item in LibraryList:\r
-        if ConsumedByList[Item] != [] and Item in Constructor and len(Constructor) > 1:\r
+        if len(ConsumedByList[Item]) != 0 and Item in Constructor and len(Constructor) > 1:\r
             return []\r
         if Item not in SortedLibraryList:\r
             SortedLibraryList.append(Item)\r