Skip to content

Commit

Permalink
Enum値の出力
Browse files Browse the repository at this point in the history
refs #19
  • Loading branch information
love2hina-net committed Feb 20, 2022
1 parent 2706b10 commit d07ce7c
Show file tree
Hide file tree
Showing 18 changed files with 482 additions and 226 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ plugins {
}

group = "net.love2hina"
version = "0.2.0-alpha1"
version = "0.3.0-SNAPSHOT"

val versions: Map<String, Any> by extra

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ internal class SmartXMLStreamWriter(file: File): XMLStreamWriter, Closeable {

private fun outputIndent() {
xmlWriter.writeCharacters(lineSeparator)
if (level > 0)
xmlWriter.writeCharacters(" ".repeat(indentSize * level))
if (level > 0) { xmlWriter.writeCharacters(" ".repeat(indentSize * level)) }
}

private fun outputElementBody() {
Expand Down Expand Up @@ -139,15 +138,15 @@ internal class SmartXMLStreamWriter(file: File): XMLStreamWriter, Closeable {
}

override fun writeAttribute(localName: String, value: String?) {
if (value != null) xmlWriter.writeAttribute(localName, value)
if (value != null) { xmlWriter.writeAttribute(localName, value) }
}

override fun writeAttribute(namespaceURI: String?, localName: String, value: String?) {
if (value != null) xmlWriter.writeAttribute(namespaceURI, localName, value)
if (value != null) { xmlWriter.writeAttribute(namespaceURI, localName, value) }
}

override fun writeAttribute(prefix: String?, namespaceURI: String?, localName: String, value: String?) {
if (value != null) xmlWriter.writeAttribute(prefix, namespaceURI, localName, value)
if (value != null) { xmlWriter.writeAttribute(prefix, namespaceURI, localName, value) }
}

override fun writeComment(data: String?) {
Expand Down Expand Up @@ -179,7 +178,7 @@ internal class SmartXMLStreamWriter(file: File): XMLStreamWriter, Closeable {
else -> {
// 複数行出力
lines.stream()
.forEach{
.forEach {
outputElementBody()
xmlWriter.writeCharacters(it.trim())
}
Expand Down
34 changes: 0 additions & 34 deletions src/main/kotlin/net/love2hina/kotlin/sharon/Utility.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ package net.love2hina.kotlin.sharon

import com.github.javaparser.ast.Modifier
import com.github.javaparser.ast.NodeList
import com.github.javaparser.ast.comments.Comment
import net.love2hina.kotlin.sharon.data.*

import kotlin.reflect.KClass
import kotlin.reflect.KMutableProperty
Expand Down Expand Up @@ -51,35 +49,3 @@ internal fun getModifier(modifiers: NodeList<Modifier>): String =
.reduce(StringBuilder(),
{ a: StringBuilder, i: String -> a.appendSeparator(COMMA, i) },
{ a: StringBuilder, b: StringBuilder -> a.appendSeparator(COMMA, b) }).toString()

internal fun getCommentContents(comment: Comment): String =
comment.content.split(REGEXP_NEWLINE)
.stream().map { l ->
val m = REGEXP_BLOCK_COMMENT.find(l)
if (m != null)
(m.groups as MatchNamedGroupCollection)["content"]?.value ?: ""
else l
}
.reduce(StringBuilder(),
{ b, l -> b.appendNewLine(l) },
{ b1, b2 -> b1.appendNewLine(b2) })
.toString()

internal fun pushJavadocComment(content: String, name: String?, start: Int, range: IntRange, info: JavadocInfo ): Int {

if (start < range.start) {
val value = content.substring(start, range.start).trim()

when {
info.parseTag(name, value) -> {}
name == null -> {
info.description.appendNewLine(value)
}
else -> {
info.description.appendNewLine("@$name $value")
}
}
}

return range.endInclusive + 1
}
8 changes: 2 additions & 6 deletions src/main/kotlin/net/love2hina/kotlin/sharon/data/ClassInfo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,12 @@ internal data class ClassInfo(

/*
* @see
* {@link}
* {@linkplain}
* {@docRoot}
*/

): JavadocInfo {

override fun parseTag(name: String?, value: String): Boolean {
return when (name) {
override fun parseTag(name: String?, value: String): Boolean
= when (name) {
"param" -> {
val r = Regex("^<(?<type>\\w+)>(?:\\s+(?<desc>.*))?$")
val m = r.find(value)
Expand Down Expand Up @@ -65,6 +62,5 @@ internal data class ClassInfo(
}
else -> false
}
}

}
35 changes: 35 additions & 0 deletions src/main/kotlin/net/love2hina/kotlin/sharon/data/EnumEntryInfo.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package net.love2hina.kotlin.sharon.data

import net.love2hina.kotlin.sharon.setProperty

internal data class EnumEntryInfo(

/** 説明 */
override val description: StringBuilder = StringBuilder(),

/** since */
var since: String? = null,

/** deprecated */
var deprecated: String? = null,

/** serial */
var serial: String? = null,

/*
* @see
* @serialField
*/

): JavadocInfo {

override fun parseTag(name: String?, value: String): Boolean
= when (name) {
"since", "deprecated", "serial" -> {
this.setProperty(name, value)
true
}
else -> false
}

}
44 changes: 44 additions & 0 deletions src/main/kotlin/net/love2hina/kotlin/sharon/data/EnumInfo.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package net.love2hina.kotlin.sharon.data

import net.love2hina.kotlin.sharon.setProperty

internal data class EnumInfo(

/** 説明 */
override val description: StringBuilder = StringBuilder(),

/** since */
var since: String? = null,

/** deprecated */
var deprecated: String? = null,

/** serial */
var serial: String? = null,

/** author */
val author: MutableList<String> = mutableListOf(),

/** version */
var version: String? = null,

/*
* @see
*/

): JavadocInfo {

override fun parseTag(name: String?, value: String): Boolean
= when (name) {
"author" -> {
author.addAll(value.split(", "))
true
}
"since", "deprecated", "serial", "version" -> {
this.setProperty(name, value)
true
}
else -> false
}

}
60 changes: 60 additions & 0 deletions src/main/kotlin/net/love2hina/kotlin/sharon/data/JavadocInfo.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,69 @@
package net.love2hina.kotlin.sharon.data

import com.github.javaparser.ast.comments.Comment
import net.love2hina.kotlin.sharon.appendNewLine
import java.util.Optional

internal interface JavadocInfo {

val description: StringBuilder

fun parseTag(name: String?, value: String): Boolean

}

internal fun Optional<Comment>.parseJavadoc(info: JavadocInfo) {
this.ifPresent {
if (it.isJavadocComment) {
val content = getCommentContents(it)
var index = 0
var name: String? = null

// Javadocをパースする
for (match in REGEXP_ANNOTATION.findAll(content)) {
index = pushJavadocComment(content, name, index, match.range, info)
name = (match.groups as MatchNamedGroupCollection)["name"]!!.value
}
pushJavadocComment(content, name, index, IntRange(content.length, content.length), info)
}
else if (it.isBlockComment) {
val content = getCommentContents(it)
info.description.appendNewLine(content)
}
else {
info.description.appendNewLine(it.content)
}
}
}

private fun getCommentContents(comment: Comment): String =
comment.content.split(REGEXP_NEWLINE)
.stream().map { l ->
val m = REGEXP_BLOCK_COMMENT.find(l)
if (m != null)
(m.groups as MatchNamedGroupCollection)["content"]?.value ?: ""
else l
}
.reduce(StringBuilder(),
{ b, l -> b.appendNewLine(l) },
{ b1, b2 -> b1.appendNewLine(b2) })
.toString()

private fun pushJavadocComment(content: String, name: String?, start: Int, range: IntRange, info: JavadocInfo ): Int {

if (start < range.start) {
val value = content.substring(start, range.start).trim()

when {
info.parseTag(name, value) -> {}
name == null -> {
info.description.appendNewLine(value)
}
else -> {
info.description.appendNewLine("@$name $value")
}
}
}

return range.endInclusive + 1
}
19 changes: 7 additions & 12 deletions src/main/kotlin/net/love2hina/kotlin/sharon/data/MethodInfo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,16 @@ internal data class MethodInfo(
val throws: HashMap<String, ThrowsInfo> = LinkedHashMap(),

/*
* see
@since
@deprecated
@serialData
{@link}
{@linkplain}
{@inheritDoc}
{@docRoot}
* */
* see
* @since
* @deprecated
* @serialData
*/

): JavadocInfo {

override fun parseTag(name: String?, value: String): Boolean {
return when (name) {
override fun parseTag(name: String?, value: String): Boolean
= when (name) {
"param" -> {
val r = Regex("^(?:(?<name>\\w+)|<(?<type>\\w+)>)(?:\\s+(?<desc>.*))?$")
val m = r.find(value)
Expand Down Expand Up @@ -86,6 +82,5 @@ internal data class MethodInfo(
}
else -> false
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,27 +23,7 @@ internal fun Parser.Visitor.visitInClass(n: ClassOrInterfaceDeclaration, arg: Vo
}

// コメントの解析
n.comment.ifPresent {
if (it.isJavadocComment) {
val content = getCommentContents(it)
var index = 0
var name: String? = null

// Javadocをパースする
for (match in REGEXP_ANNOTATION.findAll(content)) {
index = pushJavadocComment(content, name, index, match.range, classInfo)
name = (match.groups as MatchNamedGroupCollection)["name"]!!.value
}
pushJavadocComment(content, name, index, IntRange(content.length, content.length), classInfo)
}
else if (it.isBlockComment) {
val content = getCommentContents(it)
classInfo.description.appendNewLine(content)
}
else {
classInfo.description.appendNewLine(it.content)
}
}
n.comment.parseJavadoc(classInfo)

// 出力開始
writer.writeStartElement("class")
Expand Down Expand Up @@ -90,7 +70,6 @@ internal fun Parser.Visitor.visitInClass(n: ClassOrInterfaceDeclaration, arg: Vo

// アノテーション
n.annotations.forEach { it.accept(this, arg) }

// メンバー
n.members.forEach { it.accept(this, arg) }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,7 @@ internal fun Parser.Visitor.visitInSwitch(n: SwitchStmt, arg: Void?) {

// 条件エントリ
for (i in n.entries) {
if (!caseContinue)
writer.writeStartElement("case")
if (!caseContinue) { writer.writeStartElement("case") }

// コメント
i.comment.ifPresent { it.accept(this, arg) }
Expand All @@ -110,8 +109,7 @@ internal fun Parser.Visitor.visitInSwitch(n: SwitchStmt, arg: Void?) {
writer.writeEndElement()

caseContinue = i.statements.isEmpty()
if (!caseContinue)
writer.writeEndElement()
if (!caseContinue) { writer.writeEndElement() }
}

writer.writeEndElement()
Expand Down
Loading

0 comments on commit d07ce7c

Please sign in to comment.