greact's People
Forkers
melniknowgreact's Issues
SafeSql: unit tests
refactor: GReact: rename 'mount' to 'render', metadata system (17K)
PR1: rename 'mount' -> 'render'
- Component[0, 1, 2, 3].mount -> render
- jstack.greact.dom.GReact.mmount -> mount, mmountAwaitView -> renderAwaitView
- переименовать в omsu_tutor_payload и uikit
PR2: refactor metaprogramming system
регистрация AST процессора:
/src/main/resources/META-INF/service/jstack.greact.AstProcessor
jstack.greact.AstProcessor {
void init(Context context);
void apply(JCCompilationUnit cu);
}
load processors: https://www.baeldung.com/java-spi
Переносим функциональность:
- CodeView
- MemberRef переносим функционал
- Reflexive удаляется полностью
new Grid API
@DoNotTranspile public Grid(@Reflexive T[] data) {
this.data = data;
}
public Grid(T[] data, Column<T, ?>[] columns) {
this.data = data;
this.columns = columns;
}
Usage:
// basic constructor
new Grid<>(data) {{
}};
// delegates to
new Grid<>(data, Array.of(
new Column<>("the x", XY::x),
new Column<>("the y", XY::y)
)) {{
this.title = "x and y";
}};
// MemberRef delegates to
new Grid<>(data, Array.of(
new Column<>("the x", JSExpression.of("...")),
new Column<>("the y", JSExpression.of("..."))
)) {{
this.title = "x and y";
}};
Используем TreeTranslator для подмены MemberRef на JSExpression
new TreeTranslator() {
@Override public void visitReference(JCTree.JCMemberReference tree) {
if (isMemberRefSymbol(ref.type.tsym)) {
this.result = ...
} else
this.result = tree;
}
};
NB: использование TreeMaker можно посмотреть в RPCPlugin и NewClassPatcher
NB: алгоритм именования колонок: Column.java:[44-75] полностью переносится в compile-time (GridProcessor)
JSExpression.of: varargs of used variables (12K)
JSExpression.of(String jsCode, Object... args)
usage:
// Supported patterns
// 1. identifiers
JSExpression.of(":1 + :2", a, b) // a + b
JSExpression.of(":1", this) // this
// 2. select expression (recursive) with identifier at tail
JSExpression.of(":1 + 1", a.b) // a.b + 1
JSExpression.of(":1 + 1", a.b.c) // a.b.c + 1
JSExpression.of(":1 + 1", this.a) // this.a + 1
// 3. method reference for this and other class static method
JSExpression.of(":1()", this::aMethod) // this._aMethod()
JSExpression.of(":1()", ThisClass::aStaticMethod) // this.constructor._aStaticMethod()
JSExpression.of(":1()", Class::aStaticMethod) // pkg_Class.constructor._aStaticMethod()
// 4. support cast
JSExpression.of(":1 + 1", (Object) this.a) // this.a + 1
escaping:
JSExpression.of("\\:1", a) // :1
NB: strict check for allowed patterns needed
NB: reuse compiler infrastructure for expression generation
RPC whitelist
RPC: simplify configuration (15K)
RPC server creation
// goal:
public static class Server extends RPC<Context> { }
// converts to:
public static class Server extends RPC<Context> { }
Server() { super("omsu.tpayload.Main.Server", "omsu.tpayload.js"); }
}
resource management (css, js, etc)
class Bundle {
private final Map<String, Supplier<String>> resources = new HashMap<>();
void handleResource(
String resourceName,
Consumer<Integer> setStatusCode,
Consumer<String> setContentType,
OutputStream output
) {
var found = resources.get(resourceName);
if (found != null) {
if (resourceName.endsWith(".css"))
setContentType.accept("text/css");
if (resourceName.endsWith(".js"))
setContentType.accept("text/javascript");
setStatusCode.accept(200);
setData.accept(found.get());
} else {
setStatusCode.accept(404);
setData.accept("not found");
}
}
}
// usage:
var bundle = Loader.bundle("""
<title>Нагрузка преподавателя</title>
<link rel="icon" href="images/favicon.ico" type="image/x-icon">
""", ApplicationsService.class
);
Spark.get("/*", (req, res) -> {
bundle.handleResource(
req.pathInfo(), res::status,
res::type, res.raw().getOutputStream()
);
return null;
});
RPC invocation
server.handle(
new Context(db, reportRunner, req.session()),
res::status, res::type, req.raw().getInputStream()
);
greactэ
SafeSql: compile-time data extraction
TODO
Rename `className` to `_class`
e2e tests for greact-ui-kit
TODO
Project fails to build
Following error generated in Jenkins:
22:17:55 > Task :compileTestJava FAILED
22:17:55 /var/lib/jenkins/workspace/iias-greact/plugin/src/test/java/util/TestServer.java:8: error: appBasePackage has private access in RPC
22:17:55 public TestServer() {super(appBasePackage);}
22:17:55 ^
22:17:55 Note: Some input files use preview language features.
22:17:55 Note: Recompile with -Xlint:preview for details.
22:17:55 1 error
22:17:55
22:17:55 FAILURE: Build failed with an exception.
22:17:55
22:17:55 * What went wrong:
22:17:55 Execution failed for task ':compileTestJava'.
22:17:55 > Compilation failed; see the compiler error output for details.22:17:55 > Task :compileTestJava FAILED
22:17:55 /var/lib/jenkins/workspace/iias-greact/plugin/src/test/java/util/TestServer.java:8: error: appBasePackage has private access in RPC
22:17:55 public TestServer() {super(appBasePackage);}
22:17:55 ^
22:17:55 Note: Some input files use preview language features.
22:17:55 Note: Recompile with -Xlint:preview for details.
22:17:55 1 error
22:17:55
22:17:55 FAILURE: Build failed with an exception.
22:17:55
22:17:55 * What went wrong:
22:17:55 Execution failed for task ':compileTestJava'.
22:17:55 > Compilation failed; see the compiler error output for details.22:17:55 > Task :compileTestJava FAILED
22:17:55 /var/lib/jenkins/workspace/iias-greact/plugin/src/test/java/util/TestServer.java:8: error: appBasePackage has private access in RPC
22:17:55 public TestServer() {super(appBasePackage);}
22:17:55 ^
22:17:55 Note: Some input files use preview language features.
22:17:55 Note: Recompile with -Xlint:preview for details.
22:17:55 1 error
22:17:55
22:17:55 FAILURE: Build failed with an exception.
22:17:55
22:17:55 * What went wrong:
22:17:55 Execution failed for task ':compileTestJava'.
22:17:55 > Compilation failed; see the compiler error output for details.
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.