--- /dev/null
+package org.simantics.scl.compiler.elaboration.java;
+
+import org.cojen.classfile.TypeDesc;
+import org.osgi.service.component.annotations.Component;
+import org.simantics.scl.compiler.common.names.Name;
+import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
+import org.simantics.scl.compiler.elaboration.expressions.EApply;
+import org.simantics.scl.compiler.elaboration.expressions.EExternalConstant;
+import org.simantics.scl.compiler.elaboration.expressions.Expression;
+import org.simantics.scl.compiler.elaboration.macros.MacroRule;
+import org.simantics.scl.compiler.elaboration.modules.SCLValue;
+import org.simantics.scl.compiler.internal.codegen.types.StandardTypeConstructor;
+import org.simantics.scl.compiler.module.ConcreteModule;
+import org.simantics.scl.compiler.module.repository.ModuleRepository;
+import org.simantics.scl.compiler.types.TCon;
+import org.simantics.scl.compiler.types.Type;
+import org.simantics.scl.compiler.types.Types;
+import org.simantics.scl.compiler.types.kinds.Kinds;
+
+@Component
+public class ReflectionJavaModule extends ConcreteModule {
+
+ public static ReflectionJavaModule INSTANCE = new ReflectionJavaModule();
+
+ public ReflectionJavaModule() {
+ super("SCL/ReflectionJava");
+
+ // ModuleRepository type
+ TCon ModuleRepository = Types.con(getName(), "ModuleRepository");
+ StandardTypeConstructor markerConstructor = new StandardTypeConstructor(ModuleRepository,
+ Kinds.STAR, TypeDesc.forClass(ModuleRepository.class));
+ markerConstructor.external = true;
+ addTypeDescriptor("ModuleRepository", markerConstructor);
+
+ // MODULE_REPOSITORY value
+ SCLValue value = new SCLValue(Name.create(getName(), "MODULE_REPOSITORY"));
+ value.setType(Types.functionE(Types.PUNIT, Types.NO_EFFECTS, ModuleRepository));
+ value.setMacroRule(new MacroRule() {
+ @Override
+ public Expression apply(SimplificationContext context, Type[] typeParameters, EApply apply) {
+ if(apply.parameters.length != 1)
+ return null;
+ return new EExternalConstant(context.getCompilationContext().moduleRepository, ModuleRepository);
+ }
+ });
+ addValue(value);
+
+ setParentClassLoader(getClass().getClassLoader());
+ }
+
+}