Изменена структура модулей

This commit is contained in:
Victor 2016-09-16 16:25:12 +03:00
parent ba60a498d7
commit 29d40a554f
81 changed files with 110 additions and 130 deletions

View File

@ -34,7 +34,7 @@
native <methods>;
}
-keep public class * implements com.annimon.ownlang.lib.modules.Module
-keep public class * implements com.annimon.ownlang.modules.Module
# Soft obfuscation
-keep public class * {

View File

@ -1,13 +0,0 @@
package com.annimon.ownlang.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PACKAGE)
public @interface Modules {
Class[] modules();
}

View File

@ -1,17 +0,0 @@
@Modules(modules = {
canvas.class,
canvasfx.class,
date.class,
files.class,
functional.class,
http.class,
json.class,
math.class,
ounit.class,
robot.class,
std.class,
types.class
})
package com.annimon.ownlang.lib.modules;
import com.annimon.ownlang.annotations.Modules;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules;
/**
*

View File

@ -1,6 +1,7 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.canvas;
import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.modules.Module;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

View File

@ -1,7 +1,8 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.canvasfx;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.modules.Module;
import static com.annimon.ownlang.lib.Converters.*;
import java.awt.Dimension;
import java.lang.reflect.Modifier;

View File

@ -1,7 +1,8 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.date;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.modules.Module;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

View File

@ -1,7 +1,8 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.files;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.modules.Module;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions.forms;
package com.annimon.ownlang.modules.forms;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions.forms;
package com.annimon.ownlang.modules.forms;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Value;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions.forms;
package com.annimon.ownlang.modules.forms;
import com.annimon.ownlang.lib.Arguments;
import static com.annimon.ownlang.lib.Converters.*;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions.forms;
package com.annimon.ownlang.modules.forms;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions.forms;
package com.annimon.ownlang.modules.forms;
import static com.annimon.ownlang.lib.Converters.*;
import javax.swing.JComponent;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions.forms;
package com.annimon.ownlang.modules.forms;
import static com.annimon.ownlang.lib.Converters.*;
import javax.swing.JFrame;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions.forms;
package com.annimon.ownlang.modules.forms;
import static com.annimon.ownlang.lib.Converters.*;
import javax.swing.JLabel;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions.forms;
package com.annimon.ownlang.modules.forms;
import javax.swing.JPanel;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions.forms;
package com.annimon.ownlang.modules.forms;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions.forms;
package com.annimon.ownlang.modules.forms;
import com.annimon.ownlang.lib.MapValue;
import java.awt.LayoutManager;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions.forms;
package com.annimon.ownlang.modules.forms;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Value;

View File

@ -1,8 +1,7 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.forms;
import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.lib.modules.functions.forms.Components;
import com.annimon.ownlang.lib.modules.functions.forms.LayoutManagers;
import com.annimon.ownlang.modules.Module;
import java.awt.BorderLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;

View File

@ -1,9 +1,9 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.functional;
import com.annimon.ownlang.lib.FunctionValue;
import com.annimon.ownlang.lib.Functions;
import com.annimon.ownlang.lib.Variables;
import com.annimon.ownlang.lib.modules.functions.*;
import com.annimon.ownlang.modules.Module;
/**
*

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.functional;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.functional;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.functional;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.functional;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.functional;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.functional;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.functional;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.functional;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.functional;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.functional;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*;

View File

@ -1,9 +1,7 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.http;
import com.annimon.ownlang.lib.Functions;
import com.annimon.ownlang.lib.modules.functions.http_download;
import com.annimon.ownlang.lib.modules.functions.http_http;
import com.annimon.ownlang.lib.modules.functions.http_urlencode;
import com.annimon.ownlang.modules.Module;
/**
*

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.http;
import com.annimon.ownlang.lib.*;
import java.io.IOException;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.http;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.http;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,6 +1,7 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.java;
import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.modules.Module;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.jdbc;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.Arguments;
@ -11,6 +11,7 @@ import com.annimon.ownlang.lib.StringValue;
import com.annimon.ownlang.lib.Types;
import com.annimon.ownlang.lib.Value;
import com.annimon.ownlang.lib.Variables;
import com.annimon.ownlang.modules.Module;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URL;

View File

@ -1,8 +1,7 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.json;
import com.annimon.ownlang.lib.Functions;
import com.annimon.ownlang.lib.modules.functions.json_decode;
import com.annimon.ownlang.lib.modules.functions.json_encode;
import com.annimon.ownlang.modules.Module;
/**
*

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.json;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.json;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,6 +1,7 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.math;
import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.modules.Module;
import java.util.function.DoubleBinaryOperator;
import java.util.function.DoubleFunction;
import java.util.function.DoubleUnaryOperator;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.ounit;
import com.annimon.ownlang.Console;
import com.annimon.ownlang.lib.Arguments;
@ -8,6 +8,7 @@ import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.StringValue;
import com.annimon.ownlang.lib.Types;
import com.annimon.ownlang.lib.Value;
import com.annimon.ownlang.modules.Module;
import java.text.DecimalFormat;
import java.util.List;
import java.util.stream.Collectors;

View File

@ -1,9 +1,7 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.robot;
import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.lib.modules.functions.robot_exec;
import com.annimon.ownlang.lib.modules.functions.robot_fromclipboard;
import com.annimon.ownlang.lib.modules.functions.robot_toclipboard;
import com.annimon.ownlang.modules.Module;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.InputEvent;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.robot;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.ArrayValue;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.robot;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.StringValue;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.robot;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,7 +1,8 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.socket;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.modules.Module;
import io.socket.client.IO;
import io.socket.client.Socket;
import java.net.URISyntaxException;

View File

@ -1,8 +1,8 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.Main;
import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.lib.modules.functions.*;
import com.annimon.ownlang.modules.Module;
/**
*

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.Console;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.*;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.ArrayValue;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.*;
import java.util.Iterator;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.StringValue;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.ArrayValue;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.Console;
import com.annimon.ownlang.lib.Arguments;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.NumberValue;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.Function;

View File

@ -1,4 +1,4 @@
package com.annimon.ownlang.lib.modules.functions;
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.*;

View File

@ -1,6 +1,7 @@
package com.annimon.ownlang.lib.modules;
package com.annimon.ownlang.modules.types;
import com.annimon.ownlang.lib.*;
import com.annimon.ownlang.modules.Module;
/**
*

View File

@ -1,6 +1,6 @@
package com.annimon.ownlang.parser.ast;
import com.annimon.ownlang.lib.modules.Module;
import com.annimon.ownlang.modules.Module;
import java.lang.reflect.Method;
/**
@ -9,7 +9,7 @@ import java.lang.reflect.Method;
*/
public final class UseStatement extends InterruptableNode implements Statement {
private static final String PACKAGE = "com.annimon.ownlang.lib.modules.";
private static final String PACKAGE = "com.annimon.ownlang.modules.%s.%s";
private static final String INIT_CONSTANTS_METHOD = "initConstants";
public final Expression expression;
@ -23,7 +23,7 @@ public final class UseStatement extends InterruptableNode implements Statement {
super.interruptionCheck();
try {
final String moduleName = expression.eval().asString();
final Module module = (Module) Class.forName(PACKAGE + moduleName).newInstance();
final Module module = (Module) Class.forName(String.format(PACKAGE, moduleName, moduleName)).newInstance();
module.init();
} catch (Exception ex) {
throw new RuntimeException(ex);
@ -33,7 +33,7 @@ public final class UseStatement extends InterruptableNode implements Statement {
public void loadConstants() {
try {
final String moduleName = expression.eval().asString();
final Class<?> moduleClass = Class.forName(PACKAGE + moduleName);
final Class<?> moduleClass = Class.forName(String.format(PACKAGE, moduleName, moduleName));
final Method method = moduleClass.getMethod(INIT_CONSTANTS_METHOD);
if (method != null) {
method.invoke(this);

View File

@ -1,12 +1,12 @@
package com.annimon.ownlang.utils;
import com.annimon.ownlang.annotations.Modules;
import com.annimon.ownlang.lib.Functions;
import com.annimon.ownlang.lib.MapValue;
import com.annimon.ownlang.lib.Types;
import com.annimon.ownlang.lib.Value;
import com.annimon.ownlang.lib.Variables;
import com.annimon.ownlang.lib.modules.Module;
import com.annimon.ownlang.modules.Module;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@ -22,20 +22,26 @@ import org.json.JSONObject;
public final class ModulesInfoCreator {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
private static final String MODULES_PATH = "src/main/java/com/annimon/ownlang/modules";
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
final Class<Module> clazz = Module.class; // get classloader for package
final List<ModuleInfo> moduleInfos = new ArrayList<>();
final Package modulesPackage = Package.getPackage("com.annimon.ownlang.lib.modules");
final Modules annotation = modulesPackage.getAnnotation(Modules.class);
for (Class moduleClass : annotation.modules()) {
String[] moduleNames = Arrays.stream(new File(MODULES_PATH).listFiles())
.filter(p -> p.isDirectory())
.map(p -> p.getName())
.toArray(String[]::new);
for (String moduleName : moduleNames) {
final String moduleClassPath = String.format("com.annimon.ownlang.modules.%s.%s", moduleName, moduleName);
Class<?> moduleClass = Class.forName(moduleClassPath);
Functions.getFunctions().clear();
Variables.variables().clear();
final Module module = (Module) moduleClass.newInstance();
module.init();
final ModuleInfo moduleInfo = new ModuleInfo(moduleClass.getSimpleName());
final ModuleInfo moduleInfo = new ModuleInfo(moduleName);
moduleInfo.functions.addAll(Functions.getFunctions().keySet());
moduleInfo.constants.putAll(Variables.variables());
moduleInfo.types.addAll(listValues(moduleClass));