Skip to content

Commit c981355

Browse files
committed
现在模板创建实例的同时会对域进行实例化以追踪对模板内变量的更改
1 parent a71710f commit c981355

File tree

8 files changed

+68
-23
lines changed

8 files changed

+68
-23
lines changed

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121

2222
public class NBTListConcreteData extends BaseMNIMethodContainer {
2323

24-
public static final NBTListConcreteData INSTANCE = new NBTListConcreteData();
25-
2624
@InsertCommand
2725
@MNIRegister(normalParams = {"E e"}, caller = "list<E>")
2826
public static void add(Var<?> e, NBTListConcrete caller){

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class McfppFuncManager{
3232
val accessModifier : Member.AccessModifier = if(curr is ClassPointer){
3333
//类指针
3434
if(Function.currFunction.ownerType == Function.Companion.OwnerType.CLASS){
35-
Function.currFunction.parentClass()!!.getAccess(curr.clsType)
35+
Function.currFunction.parentClass()!!.getAccess(curr.clazz)
3636
}else{
3737
Member.AccessModifier.PUBLIC
3838
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import top.mcfpp.model.generic.GenericClass
1414
import top.mcfpp.util.LogProcessor
1515
import top.mcfpp.util.StringHelper
1616
import java.util.*
17-
import javax.xml.crypto.Data
1817
import kotlin.collections.ArrayList
1918

2019
class McfppLeftExprVisitor : mcfppParserBaseVisitor<Var<*>?>(){
@@ -136,7 +135,7 @@ class McfppLeftExprVisitor : mcfppParserBaseVisitor<Var<*>?>(){
136135
}else{
137136
val cpd = when(currSelector){
138137
is CompoundDataCompanion -> (currSelector as CompoundDataCompanion).dataType
139-
is ClassPointer -> (currSelector as ClassPointer).clsType
138+
is ClassPointer -> (currSelector as ClassPointer).clazz
140139
is DataTemplateObject -> (currSelector as DataTemplateObject).templateType
141140
else -> TODO(currSelector.toString())
142141
}

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package top.mcfpp.lang
22

3-
import top.mcfpp.Project
43
import top.mcfpp.annotations.InsertCommand
54
import top.mcfpp.command.Command
65
import top.mcfpp.command.Commands
@@ -9,6 +8,7 @@ import top.mcfpp.lang.type.MCFPPClassType
98
import top.mcfpp.lang.type.MCFPPType
109
import top.mcfpp.model.function.Function
1110
import top.mcfpp.model.*
11+
import top.mcfpp.model.field.CompoundDataField
1212
import top.mcfpp.model.field.GlobalField
1313
import top.mcfpp.model.function.ExtensionFunction
1414
import top.mcfpp.model.function.NoStackFunction
@@ -18,7 +18,7 @@ import top.mcfpp.util.StringHelper
1818
import java.util.*
1919

2020
/**
21-
* 一个类的指针。类的地址储存在记分板中,因此一个类的指针实际上包含了两个信息,一个是指针代表的是[哪一个类][clsType],一个是指针指向的这个类的对象
21+
* 一个类的指针。类的地址储存在记分板中,因此一个类的指针实际上包含了两个信息,一个是指针代表的是[哪一个类][clazz],一个是指针指向的这个类的对象
2222
*[在堆中的地址][address],即记分板的值是多少。
2323
*
2424
* 指针继承于类[Var],然而它的[name]并没有额外的用处,因为我们并不需要关注这个指针处于哪一个类或者哪一个函数中。起到标识符作用的更多是[identifier]。
@@ -37,7 +37,7 @@ class ClassPointer : Var<Int>{
3737
/**
3838
* 指针对应的类的类型
3939
*/
40-
val clsType: Class
40+
val clazz: Class
4141
get() = (type as MCFPPClassType).cls
4242

4343
/**
@@ -50,10 +50,12 @@ class ClassPointer : Var<Int>{
5050
* 获取这个类的实例的指针实体在mcfunction中拥有的tag
5151
* @return 返回它的tag
5252
*/
53-
get() = clsType.namespace + "_class_" + clsType.identifier + "_pointer"
53+
get() = clazz.namespace + "_class_" + clazz.identifier + "_pointer"
5454

5555
var isNull : Boolean = true
5656

57+
var instanceField: CompoundDataField
58+
5759
/**
5860
* 创建一个指针
5961
* @param clazz 指针的类型
@@ -62,6 +64,7 @@ class ClassPointer : Var<Int>{
6264
constructor(clazz: Class, identifier: String) {
6365
this.type = clazz.getType()
6466
this.identifier = identifier
67+
instanceField = CompoundDataField(clazz.field)
6568
}
6669

6770
/**
@@ -70,6 +73,7 @@ class ClassPointer : Var<Int>{
7073
*/
7174
constructor(classPointer: ClassPointer) : super(classPointer) {
7275
type = classPointer.type
76+
instanceField = classPointer.instanceField
7377
}
7478

7579
/**
@@ -85,7 +89,7 @@ class ClassPointer : Var<Int>{
8589
//TODO 不支持指针作为类成员的时候
8690
when (b) {
8791
is ClassPointer -> {
88-
if (!b.clsType.canCastTo(clsType)) {
92+
if (!b.clazz.canCastTo(clazz)) {
8993
throw VariableConverseException()
9094
}
9195
if (!isNull) {
@@ -135,7 +139,7 @@ class ClassPointer : Var<Int>{
135139
LogProcessor.error("Undefined class: $type")
136140
return UnknownVar("${type}_ptr" + UUID.randomUUID())
137141
}
138-
if (!this.clsType.canCastTo(c)) {
142+
if (!this.clazz.canCastTo(c)) {
139143
LogProcessor.error("Cannot cast [${this.type}] to [$type]")
140144
throw VariableConverseException()
141145
}
@@ -157,7 +161,7 @@ class ClassPointer : Var<Int>{
157161
*/
158162
@Override
159163
override fun getMemberVar(key: String, accessModifier: Member.AccessModifier): Pair<Var<*>?, Boolean> {
160-
val member = clsType.getVar(key)?.clone(this)
164+
val member = instanceField.getVar(key)
161165
return if(member == null){
162166
Pair(null, true)
163167
}else{
@@ -176,7 +180,7 @@ class ClassPointer : Var<Int>{
176180
@Override
177181
override fun getMemberFunction(key: String, readOnlyParams: List<MCFPPType>, normalParams: List<MCFPPType>, accessModifier: Member.AccessModifier): Pair<Function, Boolean> {
178182
//获取函数
179-
val member = clsType.field.getFunction(key, readOnlyParams, normalParams)
183+
val member = clazz.field.getFunction(key, readOnlyParams, normalParams)
180184
return if(member is UnknownFunction){
181185
Pair(UnknownFunction(key), true)
182186
}else{
@@ -204,9 +208,9 @@ class ClassPointer : Var<Int>{
204208

205209
override fun getAccess(function: Function): Member.AccessModifier {
206210
return if(function !is ExtensionFunction && function.ownerType == Function.Companion.OwnerType.CLASS){
207-
function.parentClass()!!.getAccess(clsType)
211+
function.parentClass()!!.getAccess(clazz)
208212
}else if(function !is ExtensionFunction && function.ownerType == Function.Companion.OwnerType.TEMPLATE){
209-
function.parentTemplate()!!.getAccess(clsType)
213+
function.parentTemplate()!!.getAccess(clazz)
210214
}else if(function is NoStackFunction){
211215
getAccess(function.parent[0])
212216
}

src/main/kotlin/top/mcfpp/lang/DataTemplateObject.kt

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import top.mcfpp.model.Class
1414
import top.mcfpp.model.DataTemplate
1515
import top.mcfpp.model.FieldContainer
1616
import top.mcfpp.model.Member
17+
import top.mcfpp.model.field.CompoundDataField
1718
import top.mcfpp.model.function.Function
1819
import top.mcfpp.model.function.UnknownFunction
1920
import top.mcfpp.util.LogProcessor
@@ -24,14 +25,18 @@ open class DataTemplateObject : Var<CompoundTag> {
2425
val templateType
2526
get() = (type as DataTemplateType).template
2627

28+
var instanceField: CompoundDataField
29+
2730
/**
2831
* 创建一个模板对象
2932
* @param template 模板的类型
3033
* @param identifier 标识符
3134
*/
3235
constructor(template: DataTemplate, identifier: String = UUID.randomUUID().toString()) {
3336
this.type = template.getType()
37+
this.name = identifier
3438
this.identifier = identifier
39+
instanceField = template.field.createInstance(this)
3540
}
3641

3742
/**
@@ -40,6 +45,7 @@ open class DataTemplateObject : Var<CompoundTag> {
4045
*/
4146
constructor(templateObject: DataTemplateObject) : super(templateObject) {
4247
type = templateObject.type
48+
instanceField = templateObject.instanceField
4349
}
4450

4551

@@ -49,20 +55,30 @@ open class DataTemplateObject : Var<CompoundTag> {
4955
if(b.value !is CompoundTag){
5056
throw VariableConverseException()
5157
}
52-
if(templateType.checkCompoundStruct(b.value as CompoundTag))
53-
return DataTemplateObjectConcrete(this, b.value as CompoundTag)
58+
if(templateType.checkCompoundStruct(b.value as CompoundTag)){
59+
this.assignMembers(b.value as CompoundTag)
60+
return this
61+
}else{
62+
throw VariableConverseException()
63+
}
5464
}
5565

5666
is DataTemplateObjectConcrete -> {
57-
if(templateType.checkCompoundStruct(b.value))
58-
return DataTemplateObjectConcrete(this, b.value)
67+
if(templateType.checkCompoundStruct(b.value)){
68+
this.assignMembers(b.value)
69+
return this
70+
}else{
71+
throw VariableConverseException()
72+
}
5973
}
6074

6175
is DataTemplateObject -> {
6276
if (!b.templateType.canCastTo(templateType)) {
6377
throw VariableConverseException()
78+
}else{
79+
assignCommand(b)
80+
return this
6481
}
65-
6682
}
6783

6884
else -> {
@@ -72,6 +88,12 @@ open class DataTemplateObject : Var<CompoundTag> {
7288
return this
7389
}
7490

91+
fun assignMembers(tag: CompoundTag){
92+
instanceField.forEachVar {
93+
it.replacedBy(it.assign(NBTBasedDataConcrete(tag.get(it.identifier))))
94+
}
95+
}
96+
7597
fun assignCommand(obj: DataTemplateObject){
7698
if(parentClass() != null){
7799
//是成员
@@ -130,10 +152,11 @@ open class DataTemplateObject : Var<CompoundTag> {
130152
override fun getFromStack() {}
131153

132154
override fun getMemberVar(key: String, accessModifier: Member.AccessModifier): Pair<Var<*>?, Boolean> {
133-
val member = templateType.getVar(key)?.clone(this)
155+
val member = instanceField.getVar(key)
134156
return if(member == null){
135157
Pair(null, true)
136158
}else{
159+
member.parent = this
137160
Pair(member, accessModifier >= member.accessModifier)
138161
}
139162
}

src/main/kotlin/top/mcfpp/lang/MCInt.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package top.mcfpp.lang
22

3+
import net.querz.nbt.tag.IntTag
34
import top.mcfpp.Project
45
import top.mcfpp.annotations.InsertCommand
56
import top.mcfpp.command.Command
@@ -53,6 +54,13 @@ open class MCInt : MCNumber<Int> {
5354
is MCInt -> {
5455
assignCommand(b)
5556
}
57+
is NBTBasedDataConcrete<*> -> {
58+
if(b.nbtType == NBTBasedData.Companion.NBTTypeWithTag.INT){
59+
assignCommand(MCIntConcrete((b.value as IntTag).asInt()))
60+
}else{
61+
throw VariableConverseException()
62+
}
63+
}
5664
else -> {
5765
throw VariableConverseException()
5866
}

src/main/kotlin/top/mcfpp/lang/Var.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ abstract class Var<T> : Member, Cloneable, CanSelectMember{
127127
*/
128128
override fun parentClass(): Class? {
129129
return when (val parent = parent) {
130-
is ClassPointer -> parent.clsType
130+
is ClassPointer -> parent.clazz
131131
is MCFPPClassType -> parent.cls
132132
else -> null
133133
}
@@ -389,7 +389,7 @@ abstract class Var<T> : Member, Cloneable, CanSelectMember{
389389
//TODO
390390
when (val parent = parent){
391391
is ClassPointer -> {
392-
parent.clsType.field.putVar(v.identifier, v, true)
392+
parent.clazz.field.putVar(v.identifier, v, true)
393393
}
394394
is MCFPPTypeVar -> {
395395
when(val type = parent.type){
@@ -402,6 +402,9 @@ abstract class Var<T> : Member, Cloneable, CanSelectMember{
402402
else -> TODO()
403403
}
404404
}
405+
is DataTemplateObject -> {
406+
parent.instanceField.putVar(v.identifier, v, true)
407+
}
405408
else -> {}
406409
}
407410
}

src/main/kotlin/top/mcfpp/model/field/CompoundDataField.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package top.mcfpp.model.field
22

33
import org.jetbrains.annotations.Nullable
4+
import top.mcfpp.lang.CanSelectMember
45
import top.mcfpp.lang.Var
56
import top.mcfpp.lang.type.MCFPPType
67
import top.mcfpp.model.*
@@ -89,7 +90,10 @@ class CompoundDataField : IFieldWithFunction, IFieldWithVar, IFieldWithType {
8990
val `var`: LazyWrapper<Var<*>>? = field.vars[key]
9091
vars[key] = `var`!!.clone()
9192
}
93+
//函数
9294
functions.addAll(field.functions)
95+
//类型
96+
types.putAll(field.types)
9397
}
9498

9599
//region Var<*>
@@ -193,4 +197,10 @@ class CompoundDataField : IFieldWithFunction, IFieldWithVar, IFieldWithType {
193197
return functions.contains(function)
194198
}
195199
//endregion
200+
201+
fun createInstance(selector: CanSelectMember): CompoundDataField{
202+
val re = CompoundDataField(this)
203+
re.allVars.forEach { it.parent = selector }
204+
return re
205+
}
196206
}

0 commit comments

Comments
 (0)