Skip to content

Commit a0b2ba4

Browse files
committed
Fix external dynamic bindings.
1 parent 1903e82 commit a0b2ba4

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

src/main/java/org/byteskript/skript/lang/syntax/function/ExternalFunctionExpression.java

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@
88

99
import mx.kenzie.foundation.MethodBuilder;
1010
import mx.kenzie.foundation.Type;
11-
import mx.kenzie.foundation.WriteInstruction;
1211
import org.byteskript.skript.api.syntax.SimpleExpression;
1312
import org.byteskript.skript.compiler.*;
13+
import org.byteskript.skript.compiler.structure.Function;
1414
import org.byteskript.skript.lang.element.StandardElements;
1515

1616
import java.util.ArrayList;
17-
import java.util.Arrays;
1817
import java.util.List;
1918
import java.util.regex.Matcher;
2019

@@ -52,13 +51,14 @@ public void compile(Context context, Pattern.Match match) throws Throwable {
5251
assert method != null;
5352
final FunctionDetails details = ((FunctionDetails) match.meta());
5453
assert details != null;
55-
final Type[] parameters = new Type[details.arguments];
56-
Arrays.fill(parameters, CommonTypes.OBJECT);
5754
final Type location = new Type(details.location);
58-
method.writeCode(WriteInstruction.invokeStatic(location, CommonTypes.OBJECT, details.name, parameters));
55+
// method.writeCode(WriteInstruction.invokeStatic(location, CommonTypes.OBJECT, details.name, parameters));
56+
57+
final Function function = new Function(details.name, location, CommonTypes.OBJECT, details.arguments);
58+
method.writeCode(function.invoke(context.getType().internalName()));
5959
}
6060

61-
private record FunctionDetails(String name, int arguments, String location) {
61+
private record FunctionDetails(String name, Type[] arguments, String location) {
6262
}
6363

6464
private Pattern.Match createMatch(String thing, Context context) {
@@ -68,14 +68,15 @@ private Pattern.Match createMatch(String thing, Context context) {
6868
final String params = matcher.group("params");
6969
final String location = matcher.group("location");
7070
if (location.contains("\"")) return null;
71-
final int count = getParams(params);
72-
final Matcher dummy = java.util.regex.Pattern.compile(buildDummyPattern(name, count, location)).matcher(thing);
71+
final Type[] parameters = getParams(params);
72+
final Matcher dummy = java.util.regex.Pattern.compile(buildDummyPattern(name, parameters.length, location))
73+
.matcher(thing);
7374
dummy.find();
7475
final List<Type> types = new ArrayList<>();
75-
for (int i = 0; i < count; i++) {
76+
for (int i = 0; i < parameters.length; i++) {
7677
types.add(CommonTypes.OBJECT);
7778
}
78-
return new Pattern.Match(dummy, new FunctionDetails(name, count, location), types.toArray(new Type[0]));
79+
return new Pattern.Match(dummy, new FunctionDetails(name, parameters, location), types.toArray(new Type[0]));
7980
}
8081

8182
private String buildDummyPattern(String name, int params, String location) {
@@ -90,16 +91,26 @@ private String buildDummyPattern(String name, int params, String location) {
9091
return builder.append("\\) from ").append(location).toString();
9192
}
9293

93-
private int getParams(String params) {
94-
if (params.isBlank()) return 0;
94+
private Type[] getParams(String params) {
95+
if (params.isBlank()) return new Type[0];
9596
int nest = 0;
97+
final List<Type> types = new ArrayList<>();
9698
int count = 1;
99+
boolean atomic = false;
97100
for (char c : params.toCharArray()) {
98101
if (c == '(') nest++;
99102
else if (c == ')') nest--;
100-
else if (c == ',' && nest < 1) count++;
103+
else if (c == '@' && nest < 1) atomic = true;
104+
else if (c == ',' && nest < 1) {
105+
count++;
106+
if (atomic) types.add(CommonTypes.ATOMIC);
107+
else types.add(CommonTypes.OBJECT);
108+
atomic = false;
109+
}
101110
}
102-
return count;
111+
if (atomic) types.add(CommonTypes.ATOMIC);
112+
else types.add(CommonTypes.OBJECT);
113+
return types.toArray(new Type[0]);
103114
}
104115

105116
}

0 commit comments

Comments
 (0)