Home | History | Annotate | Download | only in Library
      1 ## @file

      2 # This file is used to define comment generating interface

      3 #

      4 # Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>

      5 #

      6 # This program and the accompanying materials are licensed and made available 

      7 # under the terms and conditions of the BSD License which accompanies this 

      8 # distribution. The full text of the license may be found at 

      9 # http://opensource.org/licenses/bsd-license.php

     10 #

     11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

     12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

     13 #

     14 
     15 '''
     16 CommentGenerating
     17 '''
     18 
     19 ##

     20 # Import Modules

     21 #

     22 from Library.String import GetSplitValueList
     23 from Library.DataType import TAB_SPACE_SPLIT
     24 from Library.DataType import TAB_INF_GUIDTYPE_VAR
     25 from Library.DataType import USAGE_ITEM_NOTIFY
     26 from Library.DataType import ITEM_UNDEFINED
     27 from Library.DataType import TAB_HEADER_COMMENT
     28 from Library.DataType import TAB_BINARY_HEADER_COMMENT
     29 from Library.DataType import TAB_COMMENT_SPLIT
     30 from Library.DataType import TAB_SPECIAL_COMMENT
     31 from Library.DataType import END_OF_LINE
     32 from Library.DataType import TAB_COMMENT_EDK1_SPLIT
     33 from Library.DataType import TAB_COMMENT_EDK1_START
     34 from Library.DataType import TAB_COMMENT_EDK1_END
     35 from Library.DataType import TAB_STAR
     36 from Library.DataType import TAB_PCD_PROMPT
     37 from Library.UniClassObject import ConvertSpecialUnicodes
     38 from Library.Misc import GetLocalValue
     39 ## GenTailCommentLines

     40 #

     41 # @param TailCommentLines:  the tail comment lines that need to be generated

     42 # @param LeadingSpaceNum:   the number of leading space needed for non-first 

     43 #                            line tail comment

     44 # 

     45 def GenTailCommentLines (TailCommentLines, LeadingSpaceNum = 0):
     46     TailCommentLines = TailCommentLines.rstrip(END_OF_LINE)
     47     CommentStr = TAB_SPACE_SPLIT*2 + TAB_SPECIAL_COMMENT + TAB_SPACE_SPLIT + \
     48     (END_OF_LINE + LeadingSpaceNum * TAB_SPACE_SPLIT + TAB_SPACE_SPLIT*2 + TAB_SPECIAL_COMMENT + \
     49      TAB_SPACE_SPLIT).join(GetSplitValueList(TailCommentLines, END_OF_LINE))
     50      
     51     return CommentStr
     52 
     53 ## GenGenericComment

     54 #

     55 # @param CommentLines:   Generic comment Text, maybe Multiple Lines

     56 # 

     57 def GenGenericComment (CommentLines):
     58     if not CommentLines:
     59         return ''
     60     CommentLines = CommentLines.rstrip(END_OF_LINE)
     61     CommentStr = TAB_SPECIAL_COMMENT + TAB_SPACE_SPLIT + (END_OF_LINE + TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT).join\
     62     (GetSplitValueList(CommentLines, END_OF_LINE)) + END_OF_LINE
     63     return CommentStr
     64 
     65 ## GenGenericCommentF

     66 #

     67 #  similar to GenGenericComment but will remove <EOL> at end of comment once,

     68 #  and for line with only <EOL>, '#\n' will be generated instead of '# \n'

     69 #

     70 # @param CommentLines:   Generic comment Text, maybe Multiple Lines

     71 # @return CommentStr:    Generated comment line 

     72 # 

     73 def GenGenericCommentF (CommentLines, NumOfPound=1, IsPrompt=False, IsInfLibraryClass=False):
     74     if not CommentLines:
     75         return ''
     76     #

     77     # if comment end with '\n', then remove it to prevent one extra line

     78     # generate later on

     79     #

     80     if CommentLines.endswith(END_OF_LINE):
     81         CommentLines = CommentLines[:-1]
     82     CommentStr = ''
     83     if IsPrompt:
     84         CommentStr += TAB_COMMENT_SPLIT * NumOfPound + TAB_SPACE_SPLIT + TAB_PCD_PROMPT + TAB_SPACE_SPLIT + \
     85         CommentLines.replace(END_OF_LINE, '') + END_OF_LINE
     86     else:
     87         CommentLineList = GetSplitValueList(CommentLines, END_OF_LINE)
     88         FindLibraryClass = False
     89         for Line in CommentLineList:
     90             # If this comment is for @libraryclass and it has multiple lines

     91             # make sure the second lines align to the first line after @libraryclass as below

     92             #

     93             # ## @libraryclass XYZ FIRST_LINE

     94             # ##               ABC SECOND_LINE

     95             #

     96             if IsInfLibraryClass and Line.find(u'@libraryclass ') > -1:
     97                 FindLibraryClass = True
     98             if Line == '':
     99                 CommentStr += TAB_COMMENT_SPLIT * NumOfPound + END_OF_LINE
    100             else:
    101                 if FindLibraryClass and Line.find(u'@libraryclass ') > -1:
    102                     CommentStr += TAB_COMMENT_SPLIT * NumOfPound + TAB_SPACE_SPLIT + Line + END_OF_LINE
    103                 elif FindLibraryClass:
    104                     CommentStr += TAB_COMMENT_SPLIT * NumOfPound + TAB_SPACE_SPLIT * 16 + Line + END_OF_LINE
    105                 else:
    106                     CommentStr += TAB_COMMENT_SPLIT * NumOfPound + TAB_SPACE_SPLIT + Line + END_OF_LINE
    107      
    108     return CommentStr
    109 
    110 
    111 ## GenHeaderCommentSection

    112 #

    113 # Generate Header comment sections

    114 #

    115 # @param Abstract      One line of abstract 

    116 # @param Description   multiple lines of Description

    117 # @param Copyright     possible multiple copyright lines

    118 # @param License       possible multiple license lines

    119 #

    120 def GenHeaderCommentSection(Abstract, Description, Copyright, License, IsBinaryHeader=False, \
    121                             CommChar=TAB_COMMENT_SPLIT):
    122     Content = ''
    123 
    124     #

    125     # Convert special character to (c), (r) and (tm).

    126     #

    127     if isinstance(Abstract, unicode):
    128         Abstract = ConvertSpecialUnicodes(Abstract)
    129     if isinstance(Description, unicode):
    130         Description = ConvertSpecialUnicodes(Description)
    131     if IsBinaryHeader:
    132         Content += CommChar * 2 + TAB_SPACE_SPLIT + TAB_BINARY_HEADER_COMMENT + '\r\n'
    133     elif CommChar == TAB_COMMENT_EDK1_SPLIT:
    134         Content += CommChar + TAB_SPACE_SPLIT + TAB_COMMENT_EDK1_START + TAB_STAR + TAB_SPACE_SPLIT +\
    135          TAB_HEADER_COMMENT + '\r\n'
    136     else:
    137         Content += CommChar * 2 + TAB_SPACE_SPLIT + TAB_HEADER_COMMENT + '\r\n'
    138     if Abstract:
    139         Abstract = Abstract.rstrip('\r\n')
    140         Content += CommChar + TAB_SPACE_SPLIT + ('\r\n' + CommChar + TAB_SPACE_SPLIT).join(GetSplitValueList\
    141                                                                                                 (Abstract, '\n'))
    142         Content += '\r\n' + CommChar + '\r\n'
    143     else:
    144         Content += CommChar + '\r\n'
    145 
    146     if Description:
    147         Description = Description.rstrip('\r\n')
    148         Content += CommChar + TAB_SPACE_SPLIT + ('\r\n' + CommChar + TAB_SPACE_SPLIT).join(GetSplitValueList\
    149                                                   (Description, '\n'))
    150         Content += '\r\n' + CommChar + '\r\n'
    151   
    152     #

    153     # There is no '#\n' line to separate multiple copyright lines in code base 

    154     #

    155     if Copyright:
    156         Copyright = Copyright.rstrip('\r\n')
    157         Content += CommChar + TAB_SPACE_SPLIT + ('\r\n' + CommChar + TAB_SPACE_SPLIT).join\
    158         (GetSplitValueList(Copyright, '\n'))
    159         Content += '\r\n' + CommChar + '\r\n'
    160 
    161     if License:
    162         License = License.rstrip('\r\n')
    163         Content += CommChar + TAB_SPACE_SPLIT + ('\r\n' + CommChar + TAB_SPACE_SPLIT).join(GetSplitValueList\
    164                                                   (License, '\n'))
    165         Content += '\r\n' + CommChar + '\r\n'
    166     
    167     if CommChar == TAB_COMMENT_EDK1_SPLIT:
    168         Content += CommChar + TAB_SPACE_SPLIT + TAB_STAR + TAB_COMMENT_EDK1_END + '\r\n'
    169     else:
    170         Content += CommChar * 2 + '\r\n'
    171     
    172     return Content
    173 
    174 
    175 ## GenInfPcdTailComment

    176 #  Generate Pcd tail comment for Inf, this would be one line comment

    177 #

    178 # @param Usage:            Usage type

    179 # @param TailCommentText:  Comment text for tail comment

    180 # 

    181 def GenInfPcdTailComment (Usage, TailCommentText):
    182     if (Usage == ITEM_UNDEFINED) and (not TailCommentText):
    183         return ''
    184     
    185     CommentLine = TAB_SPACE_SPLIT.join([Usage, TailCommentText])
    186     return GenTailCommentLines(CommentLine)
    187 
    188 ## GenInfProtocolPPITailComment

    189 #  Generate Protocol/PPI tail comment for Inf

    190 #

    191 # @param Usage:            Usage type

    192 # @param TailCommentText:  Comment text for tail comment

    193 # 

    194 def GenInfProtocolPPITailComment (Usage, Notify, TailCommentText):
    195     if (not Notify) and (Usage == ITEM_UNDEFINED) and (not TailCommentText):
    196         return ''
    197     
    198     if Notify:
    199         CommentLine = USAGE_ITEM_NOTIFY + " ## "
    200     else:
    201         CommentLine = ''
    202     
    203     CommentLine += TAB_SPACE_SPLIT.join([Usage, TailCommentText])
    204     return GenTailCommentLines(CommentLine)
    205 
    206 ## GenInfGuidTailComment

    207 #  Generate Guid tail comment for Inf

    208 #

    209 # @param Usage:            Usage type

    210 # @param TailCommentText:  Comment text for tail comment

    211 # 

    212 def GenInfGuidTailComment (Usage, GuidTypeList, VariableName, TailCommentText):
    213     GuidType = GuidTypeList[0]
    214     if (Usage == ITEM_UNDEFINED) and (GuidType == ITEM_UNDEFINED) and \
    215         (not TailCommentText):
    216         return ''
    217     
    218     FirstLine = Usage + " ## " + GuidType    
    219     if GuidType == TAB_INF_GUIDTYPE_VAR:
    220         FirstLine += ":" + VariableName
    221       
    222     CommentLine = TAB_SPACE_SPLIT.join([FirstLine, TailCommentText])
    223     return GenTailCommentLines(CommentLine)
    224 
    225 ## GenDecGuidTailComment

    226 #

    227 # @param SupModuleList:  Supported module type list

    228 # 

    229 def GenDecTailComment (SupModuleList):   
    230     CommentLine = TAB_SPACE_SPLIT.join(SupModuleList)
    231     return GenTailCommentLines(CommentLine)
    232 
    233 
    234 ## _GetHelpStr

    235 #  get HelpString from a list of HelpTextObject, the priority refer to 

    236 #  related HLD

    237 #

    238 #  @param HelpTextObjList: List of HelpTextObject

    239 # 

    240 #  @return HelpStr: the help text string found, '' means no help text found

    241 #

    242 def _GetHelpStr(HelpTextObjList):
    243     ValueList = []        
    244     for HelpObj in HelpTextObjList:
    245         ValueList.append((HelpObj.GetLang(), HelpObj.GetString()))
    246     return GetLocalValue(ValueList, True)
    247