@@ -15,12 +15,13 @@ def __init__ (self, language):
1515 self .generateSources = False
1616 self .generateSummaries = False
1717 self .generateNegativeSummaries = False
18+ self .generateTypeBasedSummaries = False
1819 self .dryRun = False
1920
2021
2122 def printHelp (self ):
2223 print (f"""Usage:
23- python3 GenerateFlowModel.py <library-database> <outputQll> [<friendlyFrameworkName>] [--with-sinks] [--with-sources] [--with-summaries] [--dry-run]
24+ python3 GenerateFlowModel.py <library-database> <outputQll> [<friendlyFrameworkName>] [--with-sinks] [--with-sources] [--with-summaries] [--with-typebased-summaries] [-- dry-run]
2425
2526This generates summary, source and sink models for the code in the database.
2627The files will be placed in `{ self .language } /ql/lib/semmle/code/{ self .language } /frameworks/<outputQll>` where
@@ -33,6 +34,7 @@ def printHelp(self):
3334 --with-sources
3435 --with-summaries
3536 --with-negative-summaries
37+ --with-typebased-summaries (Experimental - only for C#)
3638If none of these flags are specified, all models are generated.
3739
3840 --dry-run: Only run the queries, but don't write to file.
@@ -62,6 +64,7 @@ def setenvironment(self, target, database, friendlyName):
6264 self .codeQlRoot , f"{ self .language } /ql/lib/semmle/code/{ self .language } /frameworks/" )
6365 self .frameworkTarget = os .path .join (self .generatedFrameworks , dirname , filename )
6466 self .negativeFrameworkTarget = os .path .join (self .generatedFrameworks , dirname , "Negative" + filename )
67+ self .typeBasedFrameworkTarget = os .path .join (self .generatedFrameworks , dirname , "TypeBased" + filename )
6568
6669 self .workDir = tempfile .mkdtemp ()
6770 os .makedirs (self .generatedFrameworks , exist_ok = True )
@@ -90,11 +93,15 @@ def make(language):
9093 sys .argv .remove ("--with-negative-summaries" )
9194 generator .generateNegativeSummaries = True
9295
96+ if "--with-typebased-summaries" in sys .argv :
97+ sys .argv .remove ("--with-typebased-summaries" )
98+ generator .generateTypeBasedSummaries = True
99+
93100 if "--dry-run" in sys .argv :
94101 sys .argv .remove ("--dry-run" )
95102 generator .dryRun = True
96103
97- if not generator .generateSinks and not generator .generateSources and not generator .generateSummaries and not generator .generateNegativeSummaries :
104+ if not generator .generateSinks and not generator .generateSources and not generator .generateSummaries and not generator .generateNegativeSummaries and not generator . generateTypeBasedSummaries :
98105 generator .generateSinks = generator .generateSources = generator .generateSummaries = generator .generateNegativeSummaries = True
99106
100107 if len (sys .argv ) < 3 or len (sys .argv ) > 4 :
@@ -207,7 +214,7 @@ def makeNegativeContent(self):
207214 negativeSummaryCsv = ""
208215
209216 return f"""
210- /**
217+ /**
211218 * THIS FILE IS AN AUTO-GENERATED MODELS AS DATA FILE. DO NOT EDIT.
212219 * Definitions of negative summaries in the { self .friendlyname } framework.
213220 */
@@ -219,6 +226,25 @@ def makeNegativeContent(self):
219226
220227 """
221228
229+ def makeTypeBasedContent (self ):
230+ if self .generateTypeBasedSummaries :
231+ typeBasedSummaryRows = self .runQuery ("type based summary models" , "CaptureTypeBasedSummaryModels.ql" )
232+ typeBasedSummaryCsv = self .asCsvModel ("SummaryModelCsv" , "TypeBasedSummary" , typeBasedSummaryRows )
233+ else :
234+ typeBasedSummaryCsv = ""
235+
236+ return f"""
237+ /**
238+ * THIS FILE IS AN AUTO-GENERATED MODELS AS DATA FILE. DO NOT EDIT.
239+ * Definitions of type based summaries in the { self .friendlyname } framework.
240+ */
241+
242+ import { self .language }
243+ private import semmle.code.{ self .language } .dataflow.ExternalFlow
244+
245+ { typeBasedSummaryCsv }
246+
247+ """
222248
223249 def save (self , content , target ):
224250 with open (target , "w" ) as targetQll :
@@ -237,6 +263,7 @@ def save(self, content, target):
237263 def run (self ):
238264 content = self .makeContent ()
239265 negativeContent = self .makeNegativeContent ()
266+ typeBasedContent = self .makeTypeBasedContent ()
240267
241268 if self .dryRun :
242269 print ("CSV Models generated, but not written to file." )
@@ -247,3 +274,6 @@ def run(self):
247274
248275 if self .generateNegativeSummaries :
249276 self .save (negativeContent , self .negativeFrameworkTarget )
277+
278+ if self .generateTypeBasedSummaries :
279+ self .save (typeBasedContent , self .typeBasedFrameworkTarget )
0 commit comments