fun parseTags()

in src/main/kotlin/com/jetbrains/plugin/jtreg/util/JTRegTagParser.kt [39:98]


    fun parseTags(header: PsiComment): Result {
        var text = header.text
        if (text.length <= 2) return Result(emptyMap())
        text = text.dropLast(2)

        val tags: MutableList<Tag> = ArrayList()
        var start = -1
        var end = -1
        var tagStart = -1
        var tagEnd = -1

        var tagName: String? = null
        val tagText = StringBuilder()
        val prefix = if (header.tokenType is IJavaElementType) 2 else 3
        val lines = text.substring(prefix).split("\n".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
        var pos = header.textOffset + prefix

        for (line in lines) {
            if (line.replace("[*\\s]+".toRegex(), "").isEmpty()) {
                pos += line.length + 1
                continue
            }
            val m = TAG_PATTERN.matcher(line)
            if (m.find()) {
                if (tagName != null) {
                    tags.add(Tag(start, pos, tagStart, tagEnd, tagName, tagText.toString()))
                    tagText.delete(0, tagText.length)
                }

                tagName = m.group(1)

                start = pos
                tagStart = pos + m.start()
                tagEnd = pos + m.end(1)
                tagText.append(line.substring(m.end()))
            } else if (tagName != null) {
                val asterisk = line.indexOf('*')
                tagText.append(line.substring(asterisk + 1))
            }

            pos += line.length + 1

            if (tagName != null) {
                end = pos
            }
        }

        if (tagName != null) {
            tags.add(Tag(start, end, tagStart, tagEnd, tagName, tagText.toString()))
        }

        val result: MutableMap<String, List<Tag>> = HashMap()

        for (tag in tags) {
            val innerTags = result.getOrDefault(tag.name, emptyList())
            result[tag.name] = innerTags + tag
        }

        return JTRegTagParser.Result(result)
    }