contrib/objcwrapper: collect files that failed parsing
[nit.git] / contrib / objcwrapper / src / objcwrapper.nit
index 3a941ed..418d639 100644 (file)
 # Generator of Nit modules to wrap Objective-C services
 module objcwrapper
 
+import nitcc_runtime
+import opts
+
 import objc_visitor
 import objc_model
 import objc_generator
-
-import nitcc_runtime
 import objc_lexer
 import objc_parser
+import preprocessing
+
+var opt_help = new OptionBool("Show this help message", "-h", "--help")
+
+var opts = new OptionContext
+opts.add_option(opt_help, opt_output, opt_init_as_methods, opt_gcc_options)
+opts.parse args
+
+if opts.errors.not_empty or opts.rest.is_empty or opt_help.value then
+       if opts.errors.not_empty then print_error opts.errors.join("\n")
 
-var v = new Interpretor
-var g = new CodeGenerator
+       print_error """
+Usage: objcwrapper [options] input_file [other_input_file [...]]
+Options:"""
+       opts.usage
 
-for arg in args do
+       if opt_help.value then exit 0
+       exit 1
+end
+
+var v = new ObjcVisitor
+
+var failed_parsing = new Array[String]
+for src in opts.rest do
        # Read input
-       var content = arg.to_path.read_all
+       var content = src.preprocess_content
 
        # Parse
        var lexer = new Lexer_objc(content)
@@ -39,7 +59,19 @@ for arg in args do
 
        # Check for errors
        if root isa NError then
-               print_error "Syntax Error: {root.message}: {root.position or else ""}"
+               var pos = root.position
+               print_error "Syntax Error: {root.message}, at {pos or else ""}"
+               print_error "in {src}"
+               if pos != null then
+                       var lines = content.split("\n")
+                       for line in [pos.line_start..pos.line_end] do
+                               print_error lines[line-1]
+                       end
+
+                       var ptr = " "*(pos.col_start-1).max(0) + "^"*(pos.col_end-pos.col_start)
+                       print_error ptr
+               end
+               failed_parsing.add src
                continue
        end
 
@@ -47,4 +79,10 @@ for arg in args do
        v.enter_visit root
 end
 
-g.generator v.model.classes
+var g = new CodeGenerator(v.model)
+g.generate
+
+if failed_parsing.not_empty then
+       print_error "Failed to parse {failed_parsing.length}/{opts.rest.length} files:"
+       print_error failed_parsing.join(" ")
+end