11d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta/*
21d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta * Copyright (C) 2017 The Android Open Source Project
31d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta *
41d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta * Licensed under the Apache License, Version 2.0 (the "License");
51d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta * you may not use this file except in compliance with the License.
61d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta * You may obtain a copy of the License at
71d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta *
81d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta *      http://www.apache.org/licenses/LICENSE-2.0
91d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta *
101d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta * Unless required by applicable law or agreed to in writing, software
111d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta * distributed under the License is distributed on an "AS IS" BASIS,
121d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta * See the License for the specific language governing permissions and
141d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta * limitations under the License.
151d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta */
161d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta
171d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaimport lexer.HidlLexer
181d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaimport lexer.Token
191d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaimport parser.LOG_NAME
201d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaimport parser.config
211d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaimport parser.files.AbstractFileParser
221d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaimport parser.files.InterfaceFileParser
231d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaimport parser.files.TypesFileParser
241d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaimport writer.files.*
251d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaimport java.nio.file.Paths
261d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaimport java.text.ParseException
271d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta
281d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertafun main(args: Array<String>) {
291d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    config.parseArgs(args)
301d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    if (config.verbose) println("$LOG_NAME args: ${config}")
311d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta
321d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    val indexWriter = IndexFileWriter() //collects parser entries
331d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta
341d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    /*
351d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta     * parse and write HAL files
361d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta     */
371d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    for (fp in config.files) {
381d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta        println("$LOG_NAME Parsing input: $fp")
391d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta
401d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta        val tokens = HidlLexer.tokenize(fp)
411d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta        val (parser, writer) = parseAndGetWriter(tokens)
421d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta
431d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta        indexWriter.addEntry(parser)
441d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta
451d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta        try {
461d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta            //since lazily evaluated, check here for parse errors
471d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta            if (writer.writeToFile()) println("$LOG_NAME Wrote file: ${writer.path}")
481d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta
491d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta        } catch (ex: ParseException) {
501d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta            if (config.skipError) {
511d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta                System.err.println("$LOG_NAME Error parsing file, skipping: $fp")
521d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta                continue
531d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta            } else {
541d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta                System.err.println("$LOG_NAME Error parsing file: $fp")
551d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta                throw ex
561d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta            }
571d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta        } finally {
581d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta            if (config.verbose) writer.printInfo()
591d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta        }
601d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    }
611d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta
621d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    /*
631d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta     * non-HAL file
641d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta     */
651d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    if (indexWriter.writeToFile()) println("$LOG_NAME Wrote index: ${indexWriter.path}")
661d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta
671d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    val cssPath = Paths.get("${config.outDir}/assets/style.css")
68b34c067e0c2cb9448b7d1a9242301f028d0d9f44Steven Moreland    if (resources.copyToFile("/resources/assets/style.css", cssPath)) {
691d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta        println("$LOG_NAME Copied resource file: $cssPath")
701d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    }
711d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta}
721d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta
731d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertafun parseAndGetWriter(tokens: List<Token>): Pair<AbstractFileParser, AbstractParserFileWriter> {
741d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    val parser: AbstractFileParser
751d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    val writer: AbstractParserFileWriter
761d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    if (InterfaceFileParser.isInterface(tokens)) {
771d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta        parser = InterfaceFileParser(tokens)
781d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta        writer = InterfaceFileWriter(parser)
791d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    } else {
801d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta        parser = TypesFileParser(tokens)
811d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta        writer = TypesFileWriter(parser)
821d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    }
831d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta    return Pair(parser, writer)
841d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta}