Update python script per review comments
authorStephen Kelly <steveire@gmail.com>
Sun, 14 Mar 2021 15:08:15 +0000 (15:08 +0000)
committerStephen Kelly <steveire@gmail.com>
Sun, 14 Mar 2021 15:37:30 +0000 (15:37 +0000)
Wrap to 80 cols, introduce main() function and use argparse instead of
optparse.

clang/lib/Tooling/DumpTool/generate_cxx_src_locs.py

index aafae2c15b29532992e5a9db2222420b668052d6..0740db0c76290c35150cb28761a60c00cb8a4e8f 100755 (executable)
@@ -5,40 +5,7 @@ import os
 import sys
 import json
 
-from optparse import OptionParser
-
-parser = OptionParser()
-parser.add_option('--json-input-path',
-                  help='Read API description from FILE', metavar='FILE')
-parser.add_option('--output-file', help='Generate output in FILEPATH',
-                  metavar='FILEPATH')
-parser.add_option('--empty-implementation', help='Generate empty implementation',
-                  action="store", type="int", metavar='FILEPATH')
-
-(options, args) = parser.parse_args()
-
-if options.empty_implementation:
-    with open(os.path.join(os.getcwd(),
-              options.output_file), 'w') as f:
-        f.write("""
-namespace clang {
-namespace tooling {
-
-NodeLocationAccessors NodeIntrospection::GetLocations(clang::Stmt const *) {
-  return {};
-}
-NodeLocationAccessors
-NodeIntrospection::GetLocations(clang::DynTypedNode const &) {
-  return {};
-}
-} // namespace tooling
-} // namespace clang
-""")
-    sys.exit(0)
-
-with open(options.json_input_path) as f:
-    jsonData = json.load(f)
-
+import argparse
 
 class Generator(object):
 
@@ -66,7 +33,8 @@ using RangeAndString = SourceRangeMap::value_type;
     def GenerateBaseGetLocationsDeclaration(self, CladeName):
         self.implementationContent += \
             """
-void GetLocationsImpl(std::shared_ptr<LocationCall> const& Prefix, clang::{0} const *Object, SourceLocationMap &Locs,
+void GetLocationsImpl(std::shared_ptr<LocationCall> const& Prefix,
+    clang::{0} const *Object, SourceLocationMap &Locs,
     SourceRangeMap &Rngs);
 """.format(CladeName)
 
@@ -84,7 +52,8 @@ static void GetLocations{0}(std::shared_ptr<LocationCall> const& Prefix,
             for locName in ClassData['sourceLocations']:
                 self.implementationContent += \
                     """
-  Locs.insert(LocationAndString(Object.{0}(), std::make_shared<LocationCall>(Prefix, "{0}")));
+  Locs.insert(LocationAndString(Object.{0}(),
+    std::make_shared<LocationCall>(Prefix, "{0}")));
 """.format(locName)
 
             self.implementationContent += '\n'
@@ -93,7 +62,8 @@ static void GetLocations{0}(std::shared_ptr<LocationCall> const& Prefix,
             for rngName in ClassData['sourceRanges']:
                 self.implementationContent += \
                     """
-  Rngs.insert(RangeAndString(Object.{0}(), std::make_shared<LocationCall>(Prefix, "{0}")));
+  Rngs.insert(RangeAndString(Object.{0}(),
+    std::make_shared<LocationCall>(Prefix, "{0}")));
 """.format(rngName)
 
             self.implementationContent += '\n'
@@ -105,16 +75,6 @@ static void GetLocations{0}(std::shared_ptr<LocationCall> const& Prefix,
                   OutputFile), 'w') as f:
             f.write(self.implementationContent)
 
-    def GenerateTrivialBaseGetLocationsFunction(self, CladeName):
-        MethodReturnType = 'NodeLocationAccessors'
-
-        Signature = \
-            'GetLocations(clang::{0} const *Object)'.format(CladeName)
-
-        self.implementationContent += \
-            '{0} NodeIntrospection::{1} {{ return {{}}; }}'.format(MethodReturnType,
-                Signature)
-
     def GenerateBaseGetLocationsFunction(self, ASTClassNames, CladeName):
 
         MethodReturnType = 'NodeLocationAccessors'
@@ -129,7 +89,8 @@ GetLocationsImpl(std::shared_ptr<LocationCall> const& Prefix,
 """.format(CladeName)
 
         self.implementationContent += \
-            'void {0} {{ GetLocations{1}(Prefix, *Object, Locs, Rngs);'.format(ImplSignature,
+            'void {0} {{ GetLocations{1}(Prefix, *Object, Locs, Rngs);'.format(
+                ImplSignature,
                 CladeName)
 
         for ASTClassName in ASTClassNames:
@@ -180,29 +141,61 @@ if (auto Derived = llvm::dyn_cast<clang::{0}>(Object)) {{
 }
 '''
 
+def main():
+
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--json-input-path',
+                      help='Read API description from FILE', metavar='FILE')
+    parser.add_argument('--output-file', help='Generate output in FILEPATH',
+                      metavar='FILEPATH')
+    parser.add_argument('--empty-implementation',
+                      help='Generate empty implementation',
+                      action="store", type=int)
+
+    options = parser.parse_args()
+
+    if options.empty_implementation:
+        with open(os.path.join(os.getcwd(),
+                  options.output_file), 'w') as f:
+            f.write("""
+namespace clang {
+namespace tooling {
+
+NodeLocationAccessors NodeIntrospection::GetLocations(clang::Stmt const *) {
+  return {};
+}
+NodeLocationAccessors
+NodeIntrospection::GetLocations(clang::DynTypedNode const &) {
+  return {};
+}
+} // namespace tooling
+} // namespace clang
+    """)
+        sys.exit(0)
+
+    with open(options.json_input_path) as f:
+        jsonData = json.load(f)
 
-g = Generator()
+    g = Generator()
 
-g.GeneratePrologue()
+    g.GeneratePrologue()
 
-if 'classesInClade' in jsonData:
-    for (CladeName, ClassNameData) in jsonData['classesInClade'].items():
-        g.GenerateBaseGetLocationsDeclaration(CladeName)
+    if 'classesInClade' in jsonData:
+        for (CladeName, ClassNameData) in jsonData['classesInClade'].items():
+            g.GenerateBaseGetLocationsDeclaration(CladeName)
 
-    for (ClassName, ClassAccessors) in jsonData['classEntries'].items():
-        if ClassAccessors:
-            g.GenerateSrcLocMethod(ClassName, ClassAccessors)
+        for (ClassName, ClassAccessors) in jsonData['classEntries'].items():
+            if ClassAccessors:
+                g.GenerateSrcLocMethod(ClassName, ClassAccessors)
 
-    for (CladeName, ClassNameData) in jsonData['classesInClade'].items():
-        g.GenerateBaseGetLocationsFunction(ClassNameData, CladeName)
+        for (CladeName, ClassNameData) in jsonData['classesInClade'].items():
+            g.GenerateBaseGetLocationsFunction(ClassNameData, CladeName)
 
-    g.GenerateDynNodeVisitor(jsonData['classesInClade'].keys())
-else:
-    for CladeName in ['Stmt']:
-        g.GenerateTrivialBaseGetLocationsFunction(CladeName)
+        g.GenerateDynNodeVisitor(jsonData['classesInClade'].keys())
 
-    g.GenerateDynNodeVisitor([])
+    g.GenerateEpilogue()
 
-g.GenerateEpilogue()
+    g.GenerateFiles(options.output_file)
 
-g.GenerateFiles(options.output_file)
+if __name__ == '__main__':
+    main()