X-Git-Url: http://nitlanguage.org diff --git a/contrib/objcwrapper/src/objcwrapper.nit b/contrib/objcwrapper/src/objcwrapper.nit index a714a4d..28746d8 100644 --- a/contrib/objcwrapper/src/objcwrapper.nit +++ b/contrib/objcwrapper/src/objcwrapper.nit @@ -1,24 +1,80 @@ +# 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 + +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 - 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 + +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