1. Enable naming check of path/function/variable names.
authorhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 24 Mar 2008 09:30:14 +0000 (09:30 +0000)
committerhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 24 Mar 2008 09:30:14 +0000 (09:30 +0000)
2. Add a function to get include path list for a source file.

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1085 7335b38e-4728-0410-8992-fb3ffe349368

Source/Python/Ecc/Check.py
Source/Python/Ecc/Ecc.py
Source/Python/Ecc/EccGlobalData.py
Source/Python/Ecc/EccToolError.py
Source/Python/Ecc/MetaDataParser.py [new file with mode: 0644]

index 6287704..d55b90e 100644 (file)
@@ -34,6 +34,7 @@ class Check(object):
         self.MetaDataFileCheck()\r
         self.DoxygenCheck()\r
         self.IncludeFileCheck()\r
+        self.NamingConventionCheck()\r
     \r
     #\r
     # Include file checking\r
@@ -381,6 +382,103 @@ class Check(object):
         for Record in RecordSet:\r
             EccGlobalData.gDb.TblReport.Insert(ErrorID, OtherMsg = "The %s value '%s' is used more than one time" % (Name.upper(), Record[1]), BelongsToTable = Table.Table, BelongsToItem = Record[0])\r
 \r
+    #\r
+    # Naming Convention Check\r
+    #\r
+    def NamingConventionCheck(self):\r
+        self.NamingConventionCheckDefineStatement()\r
+        self.NamingConventionCheckTypedefStatement()\r
+        self.NamingConventionCheckIfndefStatement()\r
+        self.NamingConventionCheckPathName()\r
+        self.NamingConventionCheckVariableName()\r
+        self.NamingConventionCheckFunctionName()\r
+        self.NamingConventionCheckSingleCharacterVariable()\r
+        \r
+    #\r
+    # Check whether only capital letters are used for #define declarations\r
+    #\r
+    def NamingConventionCheckDefineStatement(self):\r
+        pass\r
+    \r
+    #\r
+    # Check whether only capital letters are used for typedef declarations\r
+    #\r
+    def NamingConventionCheckTypedefStatement(self):\r
+        pass\r
+    \r
+    #\r
+    # Check whether the #ifndef at the start of an include file uses both prefix and postfix underscore characters, '_'.\r
+    #\r
+    def NamingConventionCheckIfndefStatement(self):\r
+        pass\r
+    \r
+    #\r
+    # Rule for path name, variable name and function name\r
+    # 1. First character should be upper case\r
+    # 2. Existing lower case in a word\r
+    # 3. No space existence\r
+    # Check whether the path name followed the rule\r
+    #\r
+    def NamingConventionCheckPathName(self):\r
+        if EccGlobalData.gConfig.NamingConventionCheckPathName == '1' or EccGlobalData.gConfig.NamingConventionCheckAll == '1':\r
+            EdkLogger.quiet("Checking naming covention of file path name ...")\r
+            Pattern = re.compile(r'^[A-Z]+\S*[a-z]\S*$')\r
+            SqlCommand = """select ID, Name from File"""\r
+            RecordSet = EccGlobalData.gDb.TblFile.Exec(SqlCommand)\r
+            for Record in RecordSet:\r
+                if not Pattern.match(Record[1]):\r
+                    EccGlobalData.gDb.TblReport.Insert(ERROR_NAMING_CONVENTION_CHECK_PATH_NAME, OtherMsg = "The file path '%s' does not follow the rules" % (Record[1]), BelongsToTable = 'File', BelongsToItem = Record[0])\r
+    \r
+    #\r
+    # Rule for path name, variable name and function name\r
+    # 1. First character should be upper case\r
+    # 2. Existing lower case in a word\r
+    # 3. No space existence\r
+    # 4. Global variable name must start with a 'g'\r
+    # Check whether the variable name followed the rule\r
+    #\r
+    def NamingConventionCheckVariableName(self):\r
+        if EccGlobalData.gConfig.NamingConventionCheckVariableName == '1' or EccGlobalData.gConfig.NamingConventionCheckAll == '1':\r
+            EdkLogger.quiet("Checking naming covention of variable name ...")\r
+            Pattern = re.compile(r'^[A-Zgm]+\S*[a-z]\S*$')\r
+            for IdentifierTable in EccGlobalData.gIdentifierTableList:\r
+                SqlCommand = """select ID, Name from %s where Model = %s""" %(IdentifierTable, MODEL_IDENTIFIER_VARIABLE)\r
+                RecordSet = EccGlobalData.gDb.TblFile.Exec(SqlCommand)\r
+                for Record in RecordSet:\r
+                    if not Pattern.match(Record[1]):\r
+                        EccGlobalData.gDb.TblReport.Insert(ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME, OtherMsg = "The variable name '%s' does not follow the rules" % (Record[1]), BelongsToTable = IdentifierTable, BelongsToItem = Record[0])\r
+\r
+\r
+    #\r
+    # Rule for path name, variable name and function name\r
+    # 1. First character should be upper case\r
+    # 2. Existing lower case in a word\r
+    # 3. No space existence\r
+    # Check whether the function name followed the rule\r
+    #\r
+    def NamingConventionCheckFunctionName(self):\r
+        if EccGlobalData.gConfig.NamingConventionCheckFunctionName == '1' or EccGlobalData.gConfig.NamingConventionCheckAll == '1':\r
+            EdkLogger.quiet("Checking naming covention of function name ...")\r
+            Pattern = re.compile(r'^[A-Z]+\S*[a-z]\S*$')\r
+            SqlCommand = """select ID, Name from Function"""\r
+            RecordSet = EccGlobalData.gDb.TblFile.Exec(SqlCommand)\r
+            for Record in RecordSet:\r
+                if not Pattern.match(Record[1]):\r
+                    EccGlobalData.gDb.TblReport.Insert(ERROR_NAMING_CONVENTION_CHECK_FUNCTION_NAME, OtherMsg = "The function name '%s' does not follow the rules" % (Record[1]), BelongsToTable = 'Function', BelongsToItem = Record[0])\r
+\r
+    #\r
+    # Check whether NO use short variable name with single character\r
+    #\r
+    def NamingConventionCheckSingleCharacterVariable(self):\r
+        if EccGlobalData.gConfig.NamingConventionCheckSingleCharacterVariable == '1' or EccGlobalData.gConfig.NamingConventionCheckAll == '1':\r
+            EdkLogger.quiet("Checking naming covention of single character variable name ...")\r
+            for IdentifierTable in EccGlobalData.gIdentifierTableList:\r
+                SqlCommand = """select ID, Name from %s where Model = %s""" %(IdentifierTable, MODEL_IDENTIFIER_VARIABLE)\r
+                RecordSet = EccGlobalData.gDb.TblFile.Exec(SqlCommand)\r
+                for Record in RecordSet:\r
+                    if len(Record[1]) == 1:\r
+                        EccGlobalData.gDb.TblReport.Insert(ERROR_NAMING_CONVENTION_CHECK_SINGLE_CHARACTER_VARIABLE, OtherMsg = "The variable name '%s' does not follow the rules" % (Record[1]), BelongsToTable = IdentifierTable, BelongsToItem = Record[0])\r
+\r
 ##\r
 #\r
 # This acts like the main() function for the script, unless it is 'import'ed into another\r
index 2f25515..7a87d04 100644 (file)
@@ -18,6 +18,7 @@ import os, time, glob
 import Common.EdkLogger as EdkLogger\r
 import Database\r
 import EccGlobalData\r
+from MetaDataParser import *\r
 from optparse import OptionParser\r
 from Configuration import Configuration\r
 from Check import Check\r
@@ -66,7 +67,6 @@ class Ecc(object):
         # Build ECC database\r
         #\r
         self.BuildDatabase()\r
-\r
         \r
         #\r
         # Start to check\r
@@ -104,6 +104,8 @@ class Ecc(object):
             c.CollectSourceCodeDataIntoDB(EccGlobalData.gTarget)\r
             EdkLogger.quiet("Building database for source code done!")\r
             self.BuildMetaDataFileDatabase()\r
+        \r
+        EccGlobalData.gIdentifierTableList = GetTableList((MODEL_FILE_C, MODEL_FILE_H), 'Identifier', EccGlobalData.gDb)\r
     \r
     ## BuildMetaDataFileDatabase\r
     #\r
index b6fa839..2127668 100644 (file)
@@ -19,4 +19,5 @@ import os
 gWorkspace = ''\r
 gTarget = ''\r
 gConfig = None\r
-gDb = None
\ No newline at end of file
+gDb = None\r
+gIdentifierTableList = []
\ No newline at end of file
index c68dc83..521a57b 100644 (file)
@@ -138,7 +138,7 @@ gEccErrorMessage = {
     ERROR_NAMING_CONVENTION_CHECK_TYPEDEF_STATEMENT : "Only capital letters are allowed to be used for typedef declarations",\r
     ERROR_NAMING_CONVENTION_CHECK_IFNDEF_STATEMENT : "The #ifndef at the start of an include file should use both prefix and postfix underscore characters, '_'",\r
     ERROR_NAMING_CONVENTION_CHECK_PATH_NAME : """Path name does not follow the rules: 1. First character should be upper case 2. Must contain lower case characters 3. No white space characters""",\r
-    ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME : """Variable name does not follow the rules: 1. First character should be upper case 2. Must contain lower case characters 3. No white space characters""",\r
+    ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME : """Variable name does not follow the rules: 1. First character should be upper case 2. Must contain lower case characters 3. No white space characters 4. Global variable name must start with a 'g'""",\r
     ERROR_NAMING_CONVENTION_CHECK_FUNCTION_NAME : """Function name does not follow the rules: 1. First character should be upper case 2. Must contain lower case characters 3. No white space characters""",\r
     ERROR_NAMING_CONVENTION_CHECK_SINGLE_CHARACTER_VARIABLE : "There should be no use of short (single character) variable names",\r
     \r
diff --git a/Source/Python/Ecc/MetaDataParser.py b/Source/Python/Ecc/MetaDataParser.py
new file mode 100644 (file)
index 0000000..20f1b15
--- /dev/null
@@ -0,0 +1,60 @@
+## @file\r
+# This file is used to define common parser functions for meta-data\r
+#\r
+# Copyright (c) 2008, Intel Corporation\r
+# All rights reserved. This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+import os\r
+from CommonDataClass.DataClass import *\r
+\r
+\r
+## Get the inlcude path list for a source file\r
+#\r
+# 1. Find the source file belongs to which inf file\r
+# 2. Find the inf's package\r
+# 3. Return the include path list of the package\r
+#\r
+def GetIncludeListOfFile(WorkSpace, Filepath, Db):\r
+    IncludeList = []\r
+    Filepath = os.path.normpath(Filepath)\r
+    SqlCommand = """\r
+                select Value1 from Inf where Model = %s and BelongsToFile in(\r
+                    select distinct B.BelongsToFile from File as A left join Inf as B \r
+                        where A.ID = B.BelongsToFile and B.Model = %s and (A.Path || '%s' || B.Value1) = '%s')""" \\r
+                % (MODEL_META_DATA_PACKAGE, MODEL_EFI_SOURCE_FILE, '\\', Filepath)\r
+    RecordSet = Db.TblFile.Exec(SqlCommand)\r
+    for Record in RecordSet:\r
+        DecFullPath = os.path.normpath(os.path.join(WorkSpace, Record[0]))\r
+        (DecPath, DecName) = os.path.split(DecFullPath)\r
+        SqlCommand = """select Value1 from Dec where BelongsToFile = \r
+                           (select ID from File where FullPath = '%s') and Model = %s""" \\r
+                    % (DecFullPath, MODEL_EFI_INCLUDE)\r
+        NewRecordSet = Db.TblDec.Exec(SqlCommand)\r
+        for NewRecord in NewRecordSet:\r
+            IncludePath = os.path.normpath(os.path.join(DecPath, NewRecord[0]))\r
+            if IncludePath not in IncludeList:\r
+                IncludeList.append(IncludePath)\r
+    \r
+    return IncludeList\r
+\r
+## Get the table list\r
+#\r
+# Search table file and find all small tables\r
+#\r
+def GetTableList(FileModelList, Table, Db):\r
+    TableList = []\r
+    SqlCommand = """select ID from File where Model in %s""" % str(FileModelList)\r
+    RecordSet = Db.TblFile.Exec(SqlCommand)\r
+    for Record in RecordSet:\r
+        TableName = Table + str(Record[0])\r
+        TableList.append(TableName)\r
+    \r
+    return TableList\r
+\r