# 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 v = new Interpretor
-var g = new CodeGenerator
+var opt_help = new OptionBool("Show this help message", "-h", "--help")
-for arg in args do
- var file = new FileReader.open(arg)
- var lexer = new Lexer_objc(file.read_all)
+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")
+
+ print_error """
+Usage: objcwrapper [options] input_file [other_input_file [...]]
+Options:"""
+ opts.usage
+
+ 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 = src.preprocess_content
+
+ # Parse
+ var lexer = new Lexer_objc(content)
var parser = new Parser_objc
var tokens = lexer.lex
parser.tokens.add_all(tokens)
- v.enter_visit(parser.parse)
- file.close
+ var root = parser.parse
+
+ # Check for errors
+ if root isa NError then
+ var pos = root.position
+ print_error "Syntax Error: {root.message}, at {pos or else ""}"
+ print_error "in {src}"
+ if pos != null then print_error pos.underline(content)
+ failed_parsing.add src
+ continue
+ end
+
+ # Run analysis
+ 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