Skip to content

Commit a543505

Browse files
kindlichjaredlll08
authored andcommitted
Feat(wip): Allow Expansions with generic parameters in Java
1 parent f7a20a4 commit a543505

5 files changed

Lines changed: 64 additions & 5 deletions

File tree

JavaAnnotations/src/main/java/org/openzen/zencode/java/ZenCodeType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ enum OperatorType {
5656
@interface Expansion {
5757
String value();
5858

59-
//String[] typeParameters() default {};
59+
String typeParameters() default "";
6060
}
6161

6262
@Retention(RetentionPolicy.RUNTIME)

JavaIntegration/src/main/java/org/openzen/zencode/java/JavaRuntimeTypeConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
public interface JavaRuntimeTypeConverter {
88
TypeID getType(TypeVariableContext context, AnnotatedType type);
99

10-
TypeID parseType(String type);
10+
TypeID parseType(ZenCodeType.Expansion type);
1111
}

JavaIntegration/src/main/java/org/openzen/zencode/java/impl/conversion/JavaRuntimeTypeConverterImpl.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.openzen.zenscript.lexer.ParseException;
2828
import org.openzen.zenscript.lexer.ZSTokenParser;
2929
import org.openzen.zenscript.lexer.ZSTokenType;
30+
import org.openzen.zenscript.parser.definitions.ParsedTypeParameter;
3031
import org.openzen.zenscript.parser.type.IParsedType;
3132

3233
import java.io.IOException;
@@ -73,7 +74,9 @@ public TypeID getType(TypeVariableContext context, AnnotatedType type) {
7374
}
7475

7576
@Override
76-
public TypeID parseType(String type) {
77+
public TypeID parseType(ZenCodeType.Expansion expansion) {
78+
String type = expansion.value();
79+
7780
for (TypeID value : this.typeByClass.values()) {
7881
if (value.toString().equals(type))
7982
return value;
@@ -90,7 +93,17 @@ public TypeID parseType(String type) {
9093
IParsedType parsed = IParsedType.parse(tokens);
9194

9295
CompileContext context = new CompileContext(relative ? packageInfo.getPkg() : packageInfo.getRoot(), packageInfo.getPkg(), Collections.emptyList(), Collections.emptyMap(), Collections.emptyList());
93-
return parsed.compile(context);
96+
97+
final ZSTokenParser typeBoundsTokens = ZSTokenParser.create(new LiteralSourceFile("internal", expansion.typeParameters()), null);
98+
TypeParameter[] typeParameters = Optional.ofNullable(ParsedTypeParameter.parseAll(typeBoundsTokens))
99+
.map(parsedTypeParameters -> {
100+
TypeParameter[] compiled = ParsedTypeParameter.getCompiled(parsedTypeParameters);
101+
ParsedTypeParameter.compile(context, compiled, parsedTypeParameters);
102+
return compiled;
103+
})
104+
.orElse(TypeParameter.NONE);
105+
106+
return parsed.compile(context.withGeneric(typeParameters));
94107
} catch (IOException ex) {
95108
throw new AssertionError("Not supposed to happen");
96109
} catch (ParseException ex) {
@@ -384,6 +397,7 @@ private Method getFunctionalInterfaceMethod(Class<?> functionalInterface) {
384397

385398
private void fillClassMaps() {
386399
typeByClass.put(void.class, BasicTypeID.VOID);
400+
typeByClass.put(Void.class, BasicTypeID.VOID);
387401
typeByClass.put(boolean.class, BasicTypeID.BOOL);
388402
typeByClass.put(byte.class, BasicTypeID.SBYTE);
389403
typeByClass.put(char.class, BasicTypeID.CHAR);

JavaIntegration/src/main/java/org/openzen/zencode/java/module/JavaNativeModule.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public JavaRuntimeClass addClass(Class<?> cls) {
103103
TypeID target = null;
104104
if (kind == JavaClass.Kind.EXPANSION) {
105105
ZenCodeType.Expansion expansion = cls.getAnnotation(ZenCodeType.Expansion.class);
106-
target = typeConverter.parseType(expansion.value());
106+
target = typeConverter.parseType(expansion);
107107
}
108108

109109
ParsedName name = getClassName(cls);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.openzen.zenscript.scriptingexample.tests.actual_test.java_native.expansions;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.openzen.zencode.java.ZenCodeType;
5+
import org.openzen.zenscript.scriptingexample.tests.helpers.ScriptBuilder;
6+
import org.openzen.zenscript.scriptingexample.tests.helpers.ZenCodeTest;
7+
8+
import java.util.Collections;
9+
import java.util.List;
10+
11+
class GenericExpansionTests extends ZenCodeTest {
12+
13+
@Override
14+
public List<String> getRequiredStdLibModules() {
15+
return Collections.singletonList("stdlib");
16+
}
17+
18+
@Override
19+
public List<Class<?>> getRequiredClasses() {
20+
List<Class<?>> requiredClasses = super.getRequiredClasses();
21+
requiredClasses.add(ExpandStringList.class);
22+
return requiredClasses;
23+
}
24+
25+
@Test
26+
void works() {
27+
ScriptBuilder.create()
28+
.add("import stdlib.List;")
29+
.add("var list = ['one', 'two', 'three'] as List<string>;")
30+
.add("println(list.join(','));")
31+
.execute(this);
32+
logger.assertPrintOutputSize(1);
33+
logger.assertPrintOutput(0, "one,two,three");
34+
}
35+
36+
@ZenCodeType.Expansion(value = "stdlib.List<T>", typeParameters = "<T : string>")
37+
public static class ExpandStringList {
38+
39+
40+
@ZenCodeType.Method
41+
public static String join(List<String> list) {
42+
return String.join(",", list);
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)