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 Lambertapackage parser.elements.declarations 181d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta 191d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaimport lexer.Token 201d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaimport lexer.TokenCategory 211d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaimport lexer.TokenGrammar 221d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta 231d28d62a5d776a9925423bb212beb12f2e747e13Billy Lambertaclass InterfaceDeclarationParser(iter: ListIterator<Token>, var shouldResetIterator: Boolean = false) : AbstractDeclarationParser(iter) { 241d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta 251d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta lateinit override var name: String 261d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta var extendsName: String? = null 271d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta var extendsVersion: Float? = null 281d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta 291d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta init { 301d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta parseTokens(scanTokens(iter)) 311d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta if (shouldResetIterator) resetIterator(iter) 321d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta } 331d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta 341d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta // example format: interface ITunerCallback extends @1.0::ITunerCallback 351d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta override fun parseTokens(tokens: List<Token>) { 361d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta assert(tokens.isNotEmpty()) 371d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta assert(tokens.first().identifier == TokenGrammar.INTERFACE) 381d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta assert(tokens.last().identifier == TokenGrammar.SEMICOLON) 391d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta 401d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta //grab first line of declarationParser 411d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta val sigToks = tokens.takeWhile { it.identifier != TokenGrammar.BRACE_OPEN } 421d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta assert(sigToks[1].category == TokenCategory.Word) 431d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta assert(sigToks.last().category == TokenCategory.Word) //either interface name or extends name 441d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta 451d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta this.name = sigToks[1].value 461d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta 471d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta //parse extends info (if exists) 481d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta if (sigToks.any { it.identifier == TokenGrammar.EXTENDS }) { 491d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta this.extendsName = sigToks.last().value 501d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta this.extendsVersion = sigToks.find { it.category == TokenCategory.Number }?.value?.toFloat() 511d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta } 521d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta } 531d28d62a5d776a9925423bb212beb12f2e747e13Billy Lamberta}