Skip to content

Commit 79b76cb

Browse files
committed
Fixed extended classes and constructors
1 parent 7d50fd2 commit 79b76cb

6 files changed

Lines changed: 57 additions & 27 deletions

File tree

src/main/kotlin/extensions/JavaParser.kt

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/main/kotlin/generator/LuaEmitter.kt

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,38 @@ class LuaEmitter {
99
val sb = StringBuilder()
1010
sb.appendLine("-- ${parsedClass.packageName}.${parsedClass.name}")
1111
sb.appendLine(
12-
"---@class ${parsedClass.name} ${
13-
if (parsedClass.extendedTypes.isNotEmpty()) parsedClass.extendedTypes.joinToString(
14-
" : "
15-
) else ""
12+
"---@class ${parsedClass.name}${
13+
if (parsedClass.extendedTypes.isNotEmpty() || parsedClass.implementedTypes.isNotEmpty())
14+
": " + (parsedClass.extendedTypes + parsedClass.implementedTypes).joinToString(", ")
15+
else ""
1616
}"
1717
)
18+
19+
// Process fields (variables)
20+
parsedClass.fields.forEach { field ->
21+
sb.appendLine("---@field ${field.name} ${mapJavaTypeToLua(field.type)}")
22+
}
23+
24+
parsedClass.constructors.forEach { constructor ->
25+
val doc = extractJavaDocInfo(constructor.comment)
26+
27+
val params = constructor.parameters.joinToString(", ") { param ->
28+
val paramName = param.name
29+
val luaType = mapJavaTypeToLua(param.type)
30+
"$paramName: $luaType${if (!param.required) "?" else ""}"
31+
}
32+
33+
val returnType = mapJavaTypeToLua(constructor.returnType)
34+
sb.appendLine("---@overload fun($params): $returnType ${doc.returnComment ?: ""}")
35+
}
36+
1837
sb.appendLine("local ${parsedClass.name} = {}\n")
1938

2039
val docInfo = extractJavaDocInfo(parsedClass.classComment)
2140
if (docInfo.mainComment.isNotBlank()) {
2241
sb.insert(0, "--- ${docInfo.mainComment}\n")
2342
}
2443

25-
// Process fields (variables)
26-
parsedClass.fields.forEach { field ->
27-
sb.appendLine("---@field ${field.name} ${mapJavaTypeToLua(field.type)}")
28-
}
2944

3045
// Process methods
3146
parsedClass.methods.forEach { method ->

src/main/kotlin/parser/JavaSourceParser.kt

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package parser
22

33
import com.github.javaparser.JavaParser
44
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration
5+
import com.github.javaparser.ast.body.ConstructorDeclaration
56
import com.github.javaparser.ast.body.EnumDeclaration
67
import com.github.javaparser.ast.body.FieldDeclaration
78
import com.github.javaparser.ast.body.MethodDeclaration
@@ -14,9 +15,7 @@ import java.util.jar.JarEntry
1415
import java.util.jar.JarFile
1516

1617
class JavaSourceParser : ClassParser {
17-
1818
private val parser = JavaParser()
19-
private val combinedTypeSolver = CombinedTypeSolver() // Ensure this is properly initialized
2019

2120
override fun parse(jar: JarFile): List<ParsedClass> {
2221
val parsedClasses = mutableListOf<ParsedClass>()
@@ -60,31 +59,45 @@ class JavaSourceParser : ClassParser {
6059
val methods = cls.methods.map { parseMethod(it, cls.nameAsString) }
6160
val fields = cls.fields.flatMap { parseField(it) }
6261

63-
// Resolve extended types and their methods
64-
val extendedTypes = cls.extendedTypes.mapNotNull { type ->
65-
val resolvedType = type.resolveOrNull()
66-
resolvedType?.qualifiedName
67-
}
68-
69-
/*val extendedMethods = extendedTypes.flatMap { qualifiedName ->
70-
val resolvedClass = combinedTypeSolver.tryToSolveType(qualifiedName).orElse(null)
71-
resolvedClass?.methods?.map { parseMethod(it.declaration, resolvedClass.name) } ?: emptyList()
72-
}*/
62+
// Gather all constructors and parse them
7363

7464
parsedClass = ParsedClass(
7565
name = cls.nameAsString,
7666
packageName = pkgName,
7767
fields = fields,
7868
methods = methods, // Combine methods
7969
classComment = cls.comment.map { extractJavaDocInfo(it.content).mainComment }.orElse(null),
80-
//extendedTypes = extendedTypes, // Broken at the moment
70+
extendedTypes = cls.extendedTypes.map { it.asString() },
71+
implementedTypes = cls.implementedTypes.map { it.asString() },
72+
constructors = cls.constructors.map { parseConstructor(it, cls.nameAsString) },
8173
isEnum = false
8274
)
8375
}
8476

8577
return parsedClass
8678
}
8779

80+
private fun parseConstructor(constructor: ConstructorDeclaration, className: String): ParsedMethod {
81+
return ParsedMethod(
82+
name = constructor.nameAsString,
83+
returnType = className,
84+
parameters = constructor.parameters.map { param ->
85+
// Check for nullability in the parameter type. Not sure why but it seems to include annotations in the type string
86+
val isNullableComment = param.type.toString()?.contains("@Nullable") ?: false
87+
88+
ParsedParameter(
89+
name = param.nameAsString,
90+
type = param.type.toString().replace("@Nullable ", ""),
91+
required = !isNullableComment,
92+
)
93+
},
94+
comment = constructor.comment.map { extractJavaDocInfo(it.content).mainComment }.orElse(null),
95+
isDeprecated = constructor.annotations.any { it.nameAsString == "Deprecated" },
96+
isAsync = false, // Constructors are not async
97+
isConstructor = true
98+
)
99+
}
100+
88101
private fun parseMethod(method: MethodDeclaration, className: String): ParsedMethod {
89102
return ParsedMethod(
90103
name = method.nameAsString,
@@ -101,7 +114,10 @@ class JavaSourceParser : ClassParser {
101114
},
102115
comment = method.comment.map { extractJavaDocInfo(it.content).mainComment }.orElse(null),
103116
isDeprecated = method.annotations.any { it.nameAsString == "Deprecated" },
104-
isAsync = method.nameAsString.contains("Async", ignoreCase = true) // Most Bukkit methods that are async have "Async" in their name
117+
isAsync = method.nameAsString.contains(
118+
"Async",
119+
ignoreCase = true
120+
) // Most Bukkit methods that are async have "Async" in their name
105121
)
106122
}
107123

src/main/kotlin/parser/ParsedClass.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ data class ParsedClass(
77
val fields: List<ParsedField>,
88
val classComment: String?,
99
val extendedTypes : List<String> = emptyList(),
10+
val implementedTypes : List<String> = emptyList(),
11+
val constructors : List<ParsedMethod> = emptyList(),
1012
val isEnum: Boolean = false,
1113
)

src/main/kotlin/parser/ParsedMethod.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ data class ParsedMethod(
66
val parameters: List<ParsedParameter>,
77
val comment: String?,
88
val isDeprecated: Boolean = false,
9-
val isAsync: Boolean = false
9+
val isAsync: Boolean = false,
10+
val isConstructor: Boolean = false,
1011
)
1112

1213
data class ParsedParameter(

src/main/kotlin/util/TypeMapping.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package util
22

33
fun mapJavaTypeToLua(javaType: String): String {
4-
println(javaType)
54
return when {
65
javaType.startsWith("List<") -> {
76
val genericType = javaType.substringAfter("List<").substringBeforeLast(">")

0 commit comments

Comments
 (0)