Skip to content

Commit 824040b

Browse files
committed
jvm访问符号
1 parent 37066a4 commit 824040b

File tree

11 files changed

+64
-37
lines changed

11 files changed

+64
-37
lines changed

src/main/antlr/mcfppLexer.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ MOD_ASSIGNMENT: '%=' ;
3333
ARROW: '->' ;
3434
DOUBLE_ARROW: '=>' ;
3535
RANGE: '..' ;
36-
//COLONCOLON: '::' ;
36+
COLONCOLON: '::' ;
3737
//DOUBLE_SEMICOLON: ';;' ;
3838
HASH: '#' ;
3939
AT: '@' ;

src/main/antlr/mcfppParser.g4

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,9 +377,14 @@ castExpression
377377
;
378378

379379
basicExpression
380-
: primary
380+
: jvmAccessExpression
381381
| varWithSelector
382382
;
383+
384+
jvmAccessExpression
385+
: primary (COLONCOLON Identifier)?
386+
;
387+
383388
//初级表达式
384389
primary
385390
: range
@@ -391,7 +396,7 @@ primary
391396
;
392397

393398
varWithSelector
394-
: primary selector+
399+
: jvmAccessExpression selector+
395400
| type selector+
396401
;
397402

@@ -416,6 +421,7 @@ functionCall
416421
identifierSuffix
417422
: '[' conditionalExpression ']'
418423
| '[' objectInitializer (',' objectInitializer)* ']'
424+
| '[' ']' //empty bucket
419425
;
420426

421427
objectInitializer

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public static void print(@NotNull MCInt var) {
6767
@MNIFunction(normalParams = {"nbt n"})
6868
public static void print(@NotNull NBTBasedData var){
6969
if(var instanceof NBTBasedDataConcrete varC){
70-
Function.Companion.addCommand("tellraw @a " + NBTUtil.INSTANCE.toJava(varC.getValue()));
70+
Function.Companion.addCommand("tellraw @a \"" + NBTUtil.INSTANCE.toJava(varC.getValue()) + "\"");
7171
}else {
7272
//TODO
7373
}

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

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -260,8 +260,8 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
260260
@Override
261261
override fun visitBasicExpression(ctx: mcfppParser.BasicExpressionContext): Var<*> {
262262
Project.ctx = ctx
263-
return if (ctx.primary() != null) {
264-
visit(ctx.primary())
263+
return if (ctx.jvmAccessExpression() != null) {
264+
visitJvmAccessExpression(ctx.jvmAccessExpression())
265265
} else {
266266
visit(ctx.varWithSelector())
267267
}
@@ -276,11 +276,11 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
276276
@Override
277277
override fun visitVarWithSelector(ctx: mcfppParser.VarWithSelectorContext): Var<*> {
278278
Project.ctx = ctx
279-
if(ctx.primary() != null){
280-
currSelector = visit(ctx.primary())
279+
if(ctx.jvmAccessExpression() != null){
280+
currSelector = visitJvmAccessExpression(ctx.jvmAccessExpression())
281281
}
282282
if(currSelector is UnknownVar){
283-
val typeStr = ctx.primary()?.text?:ctx.type().text
283+
val typeStr = ctx.jvmAccessExpression()?.text?:ctx.type().text
284284
val type = MCFPPType.parseFromIdentifier(typeStr, Function.currFunction.field)
285285
if(type == null){
286286
if(ctx.selector().size == 0){
@@ -299,6 +299,15 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
299299
return currSelector!!
300300
}
301301

302+
override fun visitJvmAccessExpression(ctx: mcfppParser.JvmAccessExpressionContext): Var<*> {
303+
val re = visitPrimary(ctx.primary())
304+
if(ctx.Identifier() != null){
305+
return re.getJVM(ctx.Identifier().text)
306+
}else{
307+
return re
308+
}
309+
}
310+
302311
@Override
303312
override fun visitSelector(ctx: mcfppParser.SelectorContext?): Var<*> {
304313
//进入visitVar,currSelector作为成员选择的上下文

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,20 @@ open class McfppLeftExprVisitor : mcfppParserBaseVisitor<Var<*>>(){
2222

2323
override fun visitBasicExpression(ctx: mcfppParser.BasicExpressionContext): Var<*> {
2424
Project.ctx = ctx
25-
return if (ctx.primary() != null) {
26-
visit(ctx.primary())
25+
return if (ctx.jvmAccessExpression() != null) {
26+
visit(ctx.jvmAccessExpression())
2727
} else {
2828
visit(ctx.varWithSelector())
2929
}
3030
}
3131

3232
override fun visitVarWithSelector(ctx: mcfppParser.VarWithSelectorContext): Var<*> {
3333
Project.ctx = ctx
34-
if(ctx.primary() != null){
35-
currSelector = visit(ctx.primary())
34+
if(ctx.jvmAccessExpression() != null){
35+
currSelector = visit(ctx.jvmAccessExpression())
3636
}
3737
if(currSelector is UnknownVar){
38-
val typeStr = ctx.primary()?.text?:ctx.type().text
38+
val typeStr = ctx.jvmAccessExpression()?.text?:ctx.type().text
3939
val type = MCFPPType.parseFromIdentifier(typeStr, Function.currFunction.field)
4040
if(type == null){
4141
LogProcessor.error(TextTranslator.INVALID_TYPE_ERROR.translate(typeStr))
@@ -50,6 +50,16 @@ open class McfppLeftExprVisitor : mcfppParserBaseVisitor<Var<*>>(){
5050
return currSelector as Var<*>
5151
}
5252

53+
override fun visitJvmAccessExpression(ctx: mcfppParser.JvmAccessExpressionContext): Var<*> {
54+
Project.ctx = ctx
55+
val re = visit(ctx.primary())
56+
if(ctx.Identifier() != null){
57+
return re.getJVM(ctx.Identifier().text)
58+
}else{
59+
return re
60+
}
61+
}
62+
5363
override fun visitSelector(ctx: mcfppParser.SelectorContext?): Var<*> {
5464
//进入visitVar,currSelector作为成员选择的上下文
5565
currSelector = visit(ctx!!.`var`())

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

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,6 @@ class JavaVar : Var<JavaVar>, MCFPPValue<Any?> {
3434

3535
override var type: MCFPPType = MCFPPConcreteType.JavaVar
3636

37-
/**
38-
* 创建一个固定的JavaVar
39-
*
40-
* @param identifier 标识符
41-
* @param curr 域容器
42-
* @param value 值
43-
*/
44-
constructor(
45-
curr: FieldContainer,
46-
value: Any?,
47-
identifier: String = UUID.randomUUID().toString()
48-
) : super(curr.prefix + identifier) {
49-
this.value = value
50-
}
51-
5237
/**
5338
* 创建一个固定的JavaVar。它的标识符和mc名一致
5439
* @param identifier 标识符。如不指定,则为随机uuid
@@ -111,7 +96,7 @@ class JavaVar : Var<JavaVar>, MCFPPValue<Any?> {
11196
//获取value中的一个成员变量
11297
if(value == null) {
11398
LogProcessor.error("Cannot access properties in $identifier because its value is null")
114-
throw NullPointerException()
99+
UnknownVar("error_null")
115100
}
116101
val member = value!!::class.memberProperties.find { it.name == key } as KProperty1<Any, *>?
117102
if(member != null){
@@ -140,7 +125,7 @@ class JavaVar : Var<JavaVar>, MCFPPValue<Any?> {
140125
}
141126
try{
142127
val member = value!!::class.java.getDeclaredMethod(key, *getTypeArray(normalArgs.map { it.type }))
143-
return Pair(JavaFunction(member, this), member.canAccess(Any()))
128+
return Pair(JavaFunction(member, this), true)
144129
}catch (e: NoSuchMethodException){
145130
LogProcessor.error("No method '$key' in $identifier}")
146131
throw e

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,21 @@ abstract class Var<Self: Var<Self>> : Member, Cloneable, CanSelectMember, Serial
514514
}
515515
}
516516

517+
fun getJVM(key: String): Var<*>{
518+
return when(key){
519+
"jvm" -> {
520+
JavaVar(this,identifier + "_jvm")
521+
}
522+
else -> {
523+
LogProcessor.error("Unknown jvm key: $key")
524+
UnknownVar("error_jvm_" + UUID.randomUUID().toString())
525+
}
526+
}.apply {
527+
isConst = true
528+
hasAssigned = true
529+
}
530+
}
531+
517532
companion object {
518533

519534
fun buildCastErrorVar(type: MCFPPType): Var<*>{

src/main/kotlin/top/mcfpp/model/function/NativeFunction.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ class NativeFunction : Function, Native {
4949
*
5050
* @param name mcfpp方法的名字
5151
* @param javaMethod java方法
52-
* @param returnType 返回值的类型
5352
* @param namespace 命名空间
5453
*/
5554
constructor(name: String, namespace: String = Project.currNamespace, javaMethod: Method = Companion::defaultNativeFunction.javaMethod!!) : super(name, namespace, context = null) {
@@ -219,7 +218,7 @@ class NativeFunction : Function, Native {
219218
primitiveTypes["void"] = Void::class.java
220219
}
221220

222-
fun defaultNativeFunction(vararg args: Any?){
221+
private fun defaultNativeFunction(vararg args: Any?){
223222
throw Exception("A nativeFunction hadn't linked to a java method.")
224223
}
225224

src/main/kotlin/top/mcfpp/type/MCFPPConcreteType.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ open class MCFPPConcreteType(objectData: CompoundData = CompoundData("unknown",
5252
get() = "JavaVar"
5353

5454
override fun build(identifier: String, container: FieldContainer): Var<*> =
55-
JavaVar(container, null, identifier)
55+
JavaVar(null, identifier)
5656
override fun build(identifier: String): Var<*> = JavaVar(null, identifier)
57-
override fun build(identifier: String, clazz: Class): Var<*> = JavaVar(clazz, null, identifier)
57+
override fun build(identifier: String, clazz: Class): Var<*> = JavaVar(null, identifier)
5858
}
5959

6060
}

src/test/kotlin/top/mcfpp/test/MNITest.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ class MNITest {
99
fun baseMNITest(){
1010
val test =
1111
"""
12-
func base(){
12+
func main(){
13+
int qwq = 1;
14+
print(qwq::jvm.identifier);
15+
print(qwq::jvm.sbObject.toString());
1316
}
1417
""".trimIndent()
1518
MCFPPStringTest.readFromString(test)

0 commit comments

Comments
 (0)