/* * Copyright (C) 2017 The Android Open Source Project * * 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. */ package parser.elements import lexer.Token import lexer.TokenGrammar import parser.config import writer.warn import java.text.ParseException /** * Collection of doc entryParsers in a token stream. * Typically, like entries are grouped together in a file (eg. Interface def), * But could be useful for declarations with fields (enums, structs). */ class EntryCollectionParser(iter: ListIterator<Token>, var shouldResetIterator: Boolean = false) : AbstractParser(iter) { var entryParsers = mutableListOf<EntryParser>() constructor(tokens: List<Token>) : this(tokens.listIterator()) init { parseTokens(scanTokens(iter)) if (shouldResetIterator) this.resetIterator(iter) } //use all the tokens override fun scanTokens(iter: ListIterator<Token>): List<Token> { val tokens = mutableListOf<Token>() while (iter.hasNext()) { tokens.add(iter.next()) } return tokens } override fun parseTokens(tokens: List<Token>) { val iter = tokens.listIterator() var token: Token //find entry parsers - must start with doc_start while(iter.hasNext()) { token = iter.next() if (token.identifier == TokenGrammar.DOC_START) { try { entryParsers.add(EntryParser(iter)) //advances iterator past declaration } catch (ex: IllegalEntryException) { if (config.warnOnly) { //bail on current entry but continue warn("${ex.message}, skipping entry") } else { throw ParseException(ex.message, this.indexStart) } } } } } }