Skip to content

Commit c475fb6

Browse files
committed
更多类的支持
1 parent 57333b6 commit c475fb6

38 files changed

+339
-235
lines changed

src/main/antlr/mcfppParser.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ functionDeclaration
230230
;
231231

232232
extensionFunctionDeclaration
233-
: STATIC? FUNCTION (type '.')? Identifier functionParams (ARROW functionReturnType)? '{' functionBody '}'
233+
: FUNCTION (type '.')? Identifier functionParams (ARROW functionReturnType)? '{' functionBody '}'
234234
;
235235

236236
//枚举

src/main/java/top/mcfpp/mni/System.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public static void print(@NotNull MCInt var) {
7171
@InsertCommand
7272
@MNIFunction(normalParams = {"nbt n"})
7373
public static void print(@NotNull NBTBasedData var){
74+
var = var.getTempVar();
7475
if(var instanceof NBTBasedDataConcrete varC){
7576
Function.Companion.addCommand("tellraw @a \"" + NBTUtil.INSTANCE.toJava(varC.getValue()) + "\"");
7677
}else {
@@ -81,6 +82,7 @@ public static void print(@NotNull NBTBasedData var){
8182
@InsertCommand
8283
@MNIFunction(normalParams = {"string s"})
8384
public static void print(@NotNull MCString var) {
85+
var = var.getTempVar();
8486
if(var instanceof MCStringConcrete varC){
8587
Function.Companion.addCommand("tellraw @a \"" + varC.getValue().getValue() + "\"");
8688
}else{

src/main/kotlin/top/mcfpp/Project.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ object Project {
120120
commands.addAll(
121121
arrayOf(
122122
//指针清理
123-
Command("execute as @e[type=marker,tag=mcfpp_ptr] if score @s ${SbObject.MCFPP_POINTER_COUNTER} matches ..0 run kill @s"),
123+
Command("execute as @e[type=marker,tag=mcfpp_gc] if score @s ${SbObject.MCFPP_POINTER_COUNTER} matches ..0 run kill @s"),
124124
//内存泄露检查
125125
Command("execute if data storage mcfpp:system stack_frame[0] run tellraw @a {\"text\":\"[MCFPP]Stack Leak\"}"),
126126
Command("execute if data storage mcfpp:system stack_frame[0] run data modify storage mcfpp:system stack_frame set value []"),
@@ -463,7 +463,7 @@ object Project {
463463
n.field.forEachObject { c->
464464
run {
465465
if(c is ObjectClass){
466-
//浮点数临时marker实体
466+
//单例实体
467467
Function.addCommand("summon marker 0 0 0 {" +
468468
"Tags:[${c.tag}]," +
469469
"UUID:${c.mcuuid.uuidSNBT}}"

src/main/kotlin/top/mcfpp/ProjectConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ open class ProjectConfig(
99
/**
1010
* 工程对应的mc版本
1111
*/
12-
var version: String = "1.21",
12+
var version: String = "1.21.4",
1313

1414
/**
1515
* 工程的默认命名空间

src/main/kotlin/top/mcfpp/antlr/MCFPPExprVisitor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
642642

643643
override fun visitNbtValue(ctx: mcfppParser.NbtValueContext): Var<*> {
644644
if(ctx.LineString() != null) {
645-
return NBTBasedDataConcrete(StringTag(ctx.LineString().text))
645+
return MCStringConcrete(StringTag(ctx.LineString().text))
646646
}else if(ctx.nbtBool() != null){
647647
return NBTBasedDataConcrete(BoolTag(ctx.nbtBool().text == "true"))
648648
}else if(ctx.nbtByte() != null){

src/main/kotlin/top/mcfpp/antlr/MCFPPFieldVisitor.kt

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -234,14 +234,18 @@ open class MCFPPFieldVisitor : mcfppParserBaseVisitor<Any?>() {
234234
//解析类中的成员
235235
//先解析函数和构造函数
236236
for (c in ctx.classBody().classMemberDeclaration()) {
237-
c!!
238-
if (c.classMember() != null && (c.classMember().classFunctionDeclaration() != null || c.classMember().abstractClassFunctionDeclaration() != null)) {
237+
if (c.classMember() != null
238+
&& (c.classMember().classFunctionDeclaration() != null
239+
|| c.classMember().abstractClassFunctionDeclaration() != null
240+
|| c.classMember().nativeClassFunctionDeclaration() != null
241+
|| c.classMember().classConstructorDeclaration() != null)
242+
) {
239243
visit(c)
240244
}
241245
}
242246
//再解析变量
243247
for (c in ctx.classBody().classMemberDeclaration()) {
244-
if (c!!.classMember() != null && c.classMember().classFieldDeclaration() != null) {
248+
if (c.classMember() != null && c.classMember().classFieldDeclaration() != null) {
245249
visit(c)
246250
}
247251
}
@@ -261,7 +265,7 @@ open class MCFPPFieldVisitor : mcfppParserBaseVisitor<Any?>() {
261265
}
262266
}
263267
if(il != null){
264-
LogProcessor.error("Class ${Class.currClass} must either be declared abstract or implement abstract method ${il!!.nameWithNamespace}")
268+
LogProcessor.error("Class ${Class.currClass} must either be declared abstract or implement abstract method ${il!!}")
265269
}
266270
}
267271
Class.currClass = null
@@ -298,14 +302,18 @@ open class MCFPPFieldVisitor : mcfppParserBaseVisitor<Any?>() {
298302
//解析类中的成员
299303
//先解析函数和构造函数
300304
for (c in ctx.classBody().classMemberDeclaration()) {
301-
c!!
302-
if (c.classMember() != null && (c.classMember().classFunctionDeclaration() != null || c.classMember().abstractClassFunctionDeclaration() != null)) {
305+
if (c.classMember() != null
306+
&& (c.classMember().classFunctionDeclaration() != null
307+
|| c.classMember().abstractClassFunctionDeclaration() != null
308+
|| c.classMember().nativeClassFunctionDeclaration() != null
309+
|| c.classMember().classConstructorDeclaration() != null)
310+
) {
303311
visit(c)
304312
}
305313
}
306314
//再解析变量
307315
for (c in ctx.classBody().classMemberDeclaration()) {
308-
if (c!!.classMember() != null && c.classMember().classFieldDeclaration() != null) {
316+
if (c.classMember() != null && c.classMember().classFieldDeclaration() != null) {
309317
visit(c)
310318
}
311319
}
@@ -334,8 +342,10 @@ open class MCFPPFieldVisitor : mcfppParserBaseVisitor<Any?>() {
334342
m.accessModifier = AccessModifier.valueOf((ctx.accessModifier()?.text?:"public").uppercase(Locale.getDefault()))
335343
if (m !is ClassConstructor) {
336344
Class.currClass!!.addMember(m)
345+
}else{
346+
Class.currClass!!.addConstructor(m)
337347
}
338-
}else if(m is Pair<*,*>){//Pair<Var, Property>
348+
}else if(m is Pair<*,*>){//Pair<out Var<*>?, out Property?>
339349
val v = m.first as Var<*>?
340350
val p = m.second as Property?
341351
if(v == null || p == null) return null
@@ -351,13 +361,13 @@ open class MCFPPFieldVisitor : mcfppParserBaseVisitor<Any?>() {
351361
override fun visitClassMember(ctx: mcfppParser.ClassMemberContext): Any? {
352362
Project.ctx = ctx
353363
return if (ctx.nativeClassFunctionDeclaration() != null) {
354-
visit(ctx.nativeClassFunctionDeclaration())
364+
visitNativeClassFunctionDeclaration(ctx.nativeClassFunctionDeclaration())
355365
} else if (ctx.classFunctionDeclaration() != null) {
356-
visit(ctx.classFunctionDeclaration())
366+
visitClassFunctionDeclaration(ctx.classFunctionDeclaration())
357367
} else if (ctx.classFieldDeclaration() != null) {
358-
visit(ctx.classFieldDeclaration())
368+
visitClassFieldDeclaration(ctx.classFieldDeclaration())
359369
} else if (ctx.classConstructorDeclaration() != null) {
360-
visit(ctx.classConstructorDeclaration())
370+
visitClassConstructorDeclaration(ctx.classConstructorDeclaration())
361371
}else{
362372
return null
363373
}
@@ -383,7 +393,6 @@ open class MCFPPFieldVisitor : mcfppParserBaseVisitor<Any?>() {
383393
Function(
384394
ctx.Identifier().text,
385395
Class.currClass!!,
386-
Class.currClass!! is ObjectClass,
387396
ctx.functionBody()
388397
)
389398
}
@@ -425,7 +434,6 @@ open class MCFPPFieldVisitor : mcfppParserBaseVisitor<Any?>() {
425434
val f = Function(
426435
ctx.Identifier().text,
427436
Class.currClass!!,
428-
false,
429437
null
430438
)
431439
f.returnType = if(ctx.functionReturnType()?.type() != null){
@@ -509,7 +517,7 @@ open class MCFPPFieldVisitor : mcfppParserBaseVisitor<Any?>() {
509517
//创建构造函数对象,注册函数
510518
val f = ClassConstructor(Class.currClass!!)
511519
f.addParamsFromContext(ctx.normalParams())
512-
if(!Class.currClass!!.addConstructor(f)){
520+
if(Class.currClass!!.hasConstructor(f)){
513521
LogProcessor.error("Already defined constructor: constructor(" + ctx.normalParams().text + ") in class " + Class.currClass)
514522
}
515523
return f
@@ -618,7 +626,7 @@ open class MCFPPFieldVisitor : mcfppParserBaseVisitor<Any?>() {
618626
override fun visitFunctionDeclaration(ctx: mcfppParser.FunctionDeclarationContext): Any? {
619627
Project.ctx = ctx
620628
//创建函数对象
621-
val identifier : String = ctx.Identifier().text
629+
val identifier = ctx.Identifier().text
622630
val f = if(ctx.functionParams()?.readOnlyParams() != null && ctx.functionParams().readOnlyParams().parameterList().parameter().size != 0){
623631
GenericFunction(identifier, Project.currNamespace, ctx.functionBody())
624632
}else {
@@ -776,7 +784,6 @@ open class MCFPPFieldVisitor : mcfppParserBaseVisitor<Any?>() {
776784
MCFPPBaseType.Void
777785
}
778786
f.ownerType = ownerType
779-
f.isStatic = ctx.STATIC() != null
780787
f.addParamsFromContext(ctx.functionParams())
781788
val field = data.field
782789
//注册函数
@@ -1043,7 +1050,6 @@ open class MCFPPFieldVisitor : mcfppParserBaseVisitor<Any?>() {
10431050
Function(
10441051
ctx.Identifier().text,
10451052
DataTemplate.currTemplate!!,
1046-
DataTemplate.currTemplate is ObjectDataTemplate,
10471053
ctx.functionBody()
10481054
)
10491055
}

src/main/kotlin/top/mcfpp/antlr/MCFPPGenericClassFieldVisitor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class MCFPPGenericClassFieldVisitor(val clazz: Class) : MCFPPFieldVisitor() {
4444
}
4545
}
4646
if(il != null){
47-
LogProcessor.error("Class ${Class.currClass} must either be declared abstract or implement abstract method ${il!!.nameWithNamespace}")
47+
LogProcessor.error("Class ${Class.currClass} must either be declared abstract or implement abstract method ${il!!}")
4848
}
4949
}
5050
Class.currClass = null

src/main/kotlin/top/mcfpp/antlr/MCFPPGenericObjectClassFieldVisitor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class MCFPPGenericObjectClassFieldVisitor(val clazz: CompiledGenericObjectClass)
3939
}
4040
}
4141
if(il != null){
42-
LogProcessor.error("Class $clazz must either be declared abstract or implement abstract method ${il!!.nameWithNamespace}")
42+
LogProcessor.error("Class $clazz must either be declared abstract or implement abstract method ${il!!}")
4343
}
4444
Class.currClass = null
4545
typeScope = MCFPPFile.currFile!!.field.namespaceField

src/main/kotlin/top/mcfpp/command/Commands.kt

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ object Commands {
3030
* @return 生成的命令
3131
*/
3232
fun function(function: Function): Command {
33-
return Command.build("function").build(function.namespaceID,function.namespaceID)
33+
return Command.build("function").build(function.namespaceID.toString(),function.namespaceID.toString())
3434
}
3535

3636
/**
@@ -255,19 +255,12 @@ object Commands {
255255
val final = when(a){
256256
is ClassPointer -> {
257257
if(a.identifier == "this"){
258-
if(a.clazz.baseEntity != Class.ENTITY_MARKER && a.clazz.baseEntity != Class.ENTITY_ITEM_DISPLAY){
259-
val qwq = arrayOf(Command.build("execute on passengers as entity @n[tag=${a.tag}_data]"))
260-
if(hasExecuteRun){
261-
qwq.last().build("run", "run")
262-
}
263-
return qwq
264-
}
265258
return arrayOf(Command())
266259
}
267260
val qwq = if(a.clazz.baseEntity != Class.ENTITY_MARKER && a.clazz.baseEntity != Class.ENTITY_ITEM_DISPLAY){
268261
arrayOf(
269262
Command.build("data modify entity ${ClassPointer.tempItemEntityUUID} Thrower set from storage mcfpp:system stack_frame[${a.stackIndex}].${a.identifier}"),
270-
Command.build("execute as ${ClassPointer.tempItemEntityUUID} on origin on passengers as entity @n[tag=${a.tag}_data]")
263+
Command.build("execute as ${ClassPointer.tempItemEntityUUID} on origin on passengers as @n[tag=${a.tag}_data]")
271264
)
272265
}else{
273266
arrayOf(

src/main/kotlin/top/mcfpp/core/lang/ClassPointer.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ open class ClassPointer : Var<ClassPointer>{
6060
* @param identifier 标识符
6161
*/
6262
@Suppress("LeakingThis")
63-
constructor(clazz: Class, identifier: String) {
63+
constructor(clazz: Class, identifier: String): super(identifier) {
6464
this.type = clazz.getType()
6565
this.identifier = identifier
6666
instanceField = clazz.field
@@ -185,7 +185,9 @@ open class ClassPointer : Var<ClassPointer>{
185185
return if(member == null){
186186
Pair(null, true)
187187
}else{
188-
Pair(PropertyVar(member, v!!, this), accessModifier >= member.accessModifier)
188+
v!!.parent = this
189+
v.nbtPath = clazz.getFieldPath(v.identifier)
190+
Pair(PropertyVar(member, v, this), accessModifier >= member.accessModifier)
189191
}
190192
}
191193

src/main/kotlin/top/mcfpp/core/lang/nbt/MCString.kt

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,19 @@ import net.querz.nbt.tag.StringTag
44
import top.mcfpp.annotations.InsertCommand
55
import top.mcfpp.command.Commands
66
import top.mcfpp.core.lang.JsonTextConcrete
7-
import top.mcfpp.core.lang.MCAnyConcrete
87
import top.mcfpp.core.lang.MCFPPValue
98
import top.mcfpp.core.lang.Var
10-
import top.mcfpp.exception.VariableConverseException
119
import top.mcfpp.lib.NBTChatComponent
1210
import top.mcfpp.lib.PlainChatComponent
1311
import top.mcfpp.model.CompoundData
1412
import top.mcfpp.model.Member
1513
import top.mcfpp.model.function.Function
1614
import top.mcfpp.type.MCFPPBaseType
17-
import top.mcfpp.type.MCFPPNBTType
1815
import top.mcfpp.type.MCFPPType
1916
import top.mcfpp.util.LogProcessor
2017
import top.mcfpp.util.TempPool
2118
import top.mcfpp.util.TextTranslator
2219
import top.mcfpp.util.TextTranslator.translate
23-
import java.util.*
2420

2521
/**
2622
* string表示一个字符串。要声明一个字符串,应该使用string类型,例如string abc = "abc"。
@@ -65,8 +61,6 @@ open class MCString : NBTBasedData {
6561
TODO("Not yet implemented")
6662
}
6763

68-
@Override
69-
@Throws(VariableConverseException::class)
7064
override fun doAssignedBy(b: Var<*>): MCString {
7165
when (b) {
7266
is MCString -> return assignCommand(b)
@@ -90,7 +84,11 @@ open class MCString : NBTBasedData {
9084
if(this is MCStringConcrete){
9185
JsonTextConcrete(PlainChatComponent(this.value.value))
9286
}else{
93-
JsonTextConcrete(NBTChatComponent(this, false))
87+
if(parentClass() != null && (parent as Var<*>).identifier != "this") {
88+
JsonTextConcrete(NBTChatComponent(getTempVar(), false))
89+
}else{
90+
JsonTextConcrete(NBTChatComponent(this, false))
91+
}
9492
}
9593
}
9694
else -> re
@@ -172,6 +170,11 @@ open class MCString : NBTBasedData {
172170
}) as MCString
173171
}
174172

173+
override fun getTempVar(): MCString {
174+
val temp = MCString()
175+
temp.isTemp = true
176+
return temp.assignCommand(this)
177+
}
175178

176179
companion object {
177180
val data = CompoundData("string","mcfpp")
@@ -209,13 +212,9 @@ class MCStringConcrete: MCString, MCFPPValue<StringTag> {
209212
return MCString(this)
210213
}
211214

212-
@Override
213-
override fun explicitCast(type: MCFPPType): Var<*> {
214-
return when(type){
215-
MCFPPBaseType.String -> this
216-
MCFPPNBTType.NBT -> NBTBasedDataConcrete(value)
217-
MCFPPBaseType.Any -> MCAnyConcrete(this)
218-
else -> throw VariableConverseException()
215+
override fun getTempVar(): MCString {
216+
return MCStringConcrete(value).apply {
217+
isTemp = true
219218
}
220219
}
221220
}

src/main/kotlin/top/mcfpp/core/lang/nbt/NBTBasedData.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@ open class NBTBasedData : Var<NBTBasedData>, Indexable {
3636
* 创建一个nbt值。它的标识符和mc名相同。
3737
* @param identifier identifier
3838
*/
39-
constructor(identifier: String = TempPool.getVarIdentify()) : super(identifier){
40-
isTemp = true
41-
}
39+
constructor(identifier: String = TempPool.getVarIdentify()) : super(identifier)
4240

4341
/**
4442
* 复制一个int
@@ -157,6 +155,7 @@ open class NBTBasedData : Var<NBTBasedData>, Indexable {
157155
*/
158156
override fun getTempVar(): NBTBasedData {
159157
val temp = NBTBasedData()
158+
temp.isTemp = true
160159
return temp.assignCommand(this)
161160
}
162161

0 commit comments

Comments
 (0)