| /* |
| * 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 lexer |
| |
| import java.util.* |
| |
| object DocLexer : ILexer { |
| |
| /** |
| * @param str The string should already be padded from the file lexer. |
| */ |
| override fun tokenize(str: String): List<Token> { |
| val tokens = mutableListOf<Token>() |
| var token: String |
| |
| //remove docblock comment indention - must go before others |
| val formattedStr = str.lines() |
| //remove docblock comment indent prefix (must go before others) ... |
| .map { it.replace(Regex("^\\s*\\*[^/]"), "") } //indented prefix except doc_end |
| .map { it.replace(Regex("^\\s*\\*$"), "") } //prefix empty lines remain |
| //replace empty lines with something the scanner can pick out ... |
| .map { it.replace(Regex("$\\s*^"), TokenGrammar.EMPTY_LINE.value) } |
| .joinToString("\n") |
| |
| Scanner(formattedStr).use { scanner -> |
| while (scanner.hasNext()) { |
| token = scanner.next() |
| |
| when (token) { |
| TokenGrammar.EMPTY_LINE.value -> tokens.add(TokenGrammar.newToken("", TokenGrammar.EMPTY_LINE)) |
| |
| //if part of annotation, add following tag as well |
| TokenGrammar.AT.value -> { |
| tokens.add(TokenGrammar.newToken(token)) //'@' |
| //determine if part of annotation |
| for (annotation in TokenGrammar.docAnnotations()) { |
| if (scanner.hasNext(annotation.value)) { |
| tokens.add(TokenGrammar.newToken(scanner.next())) |
| } |
| } |
| } |
| |
| //default to DocWord |
| else -> { |
| val id = TokenGrammar.getFromValueOrDefault(token) |
| val category = if (id == TokenGrammar.WORD) TokenCategory.DocWord else id.category |
| tokens.add(TokenGrammar.newToken(token, category)) |
| //TODO: Perhaps make all docblock words a DocWord |
| //tokens.add(TokenGrammar.newToken(token, TokenCategory.DocWord)) |
| } |
| } |
| } |
| } |
| return tokens.toList() |
| } |
| } |