contrib/objcwrapper: move file preprocessing to Nit
[nit.git] / contrib / objcwrapper / src / objcwrapper.nit
index a714a4d..0b8bb72 100644 (file)
@@ -1,24 +1,68 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# 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
 
-var v = new Interpretor
-var g = new CodeGenerator
+if opts.errors.not_empty or opts.rest.is_empty or opt_help.value then
+       print """
+Usage: objcwrapper [options] input_file [other_input_file [...]]
+Options:"""
+       opts.usage
 
-for arg in args do
-       var file = new FileReader.open(arg)
-       var lexer = new Lexer_objc(file.read_all)
+       if opt_help.value then exit 0
+       exit 1
+end
+
+var v = new ObjcVisitor
+
+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
+               print_error "Syntax Error: {root.message}: {root.position or else ""}"
+               continue
+       end
+
+       # Run analysis
+       v.enter_visit root
 end
 
-g.generator v.model.classes
+var g = new CodeGenerator(v.model)
+g.generate