Option and method generation for events

master
Theunis J. Botha 2021-06-29 10:57:24 +02:00
parent 1fbed0ecd0
commit fabb7b79ac
8 changed files with 289 additions and 136 deletions

View File

@ -3,10 +3,4 @@ r3 create R3Object extends Event
r3 create Utils normal
r3 create Component extends R3Object
r3 create Project extends R3Object
r3 create A normal
r3 create B extends A
r3 create C normal ./r3-system/
r3 create D system C
r3 create E static ./
r3 create T extends B
r3 create System normal ./r3-system/

View File

@ -6,9 +6,15 @@ const Utils = require('./r3-utils');
CUSTOM_OPTIONS_END
CUSTOM_METHODS_START
async(eventId, data, clientCallback, clientErrorCallback) - Simply calls 'Async()' passing it the arguments
emit(eventId, data, clientCallback, clientErrorCallback) - Simply calls 'Emit()' passing it the arguments
subscribe(eventId, callback) - Simply calls 'Subscribe()' passing it the arguments
CUSTOM_METHODS_END
CUSTOM_STATIC_METHODS_START
Async(eventId, data, clientCallback, clientErrorCallback) - Calls all subscription functions registered to eventId with data, clientCallback and clientErrorCallback as arguments. If an error occurs during clientCallback it additionally will execute clientErrorCallback with the error as argument.
Emit(eventId, data, clientCallback, clientErrorCallback) - Calls all subscription functions registered to eventId with data as arg. Calls clientCallback directly after the event result is obtained, passing it the result. If an exception occurs during execution, the clientErrorCallback is called with the error as argument.
Subscribe(eventId, callback) - Subscribes to 'eventName', ex. Event.BEFORE_RENDER and executes 'callback()' when eventName is raised @return {Object} - A handle to the subscription which can be removed by calling handle.remove()
CUSTOM_STATIC_METHODS_END
**/
@ -38,12 +44,6 @@ class Event {
}
//GENERATE_CONSTRUCTOR_END
//GENERATE_METHODS_START
//GENERATE_METHODS_END
//GENERATE_STATIC_METHODS_START
//GENERATE_STATIC_METHODS_END
//CUSTOM_IMPLEMENTATION_START
/**
@ -52,76 +52,132 @@ class Event {
*/
static Subscriptions = {};
static Subscribe(
eventName,
fn
) {
/**
* Todo - maybe eventually store a boolean which indicates if the function has been executed
*/
let subscriptionId = Utils.RandomId(10);
//CUSTOM_IMPLEMENTATION_END
if (Event.Subscriptions.hasOwnProperty(eventName)) {
if (Event.Subscriptions[eventName][subscriptionId]) {
throw new Error('A component can only subscribe to a particular event ID once');
}
Event.Subscriptions[eventName][subscriptionId] = fn;
} else {
Event.Subscriptions[eventName] = {};
Event.Subscriptions[eventName][subscriptionId] = fn;
}
//GENERATE_METHODS_START
/**
* Return a handle to the caller to allow us to unsubscribe to this event
*/
return {
fn: fn,
remove: function (eventId, subscriptionId) {
return function () {
/**
* Stop listening for this event from this component
*/
delete Event.Subscriptions[eventId][subscriptionId];
/**
* If the length of listeners is 0, stop referencing this event
* @type {string[]}
*/
let listeners = Object.keys(Event.Subscriptions[eventId]);
if (listeners.length === 0) {
delete Event.Subscriptions[eventId];
}
}
}(eventName, subscriptionId),
subscriptionId : subscriptionId
};
};
/**
* Subscribe to some events
* @param eventName
* @param callback
*/
subscribe(
eventName,
callback
) {
return Event.Subscribe(eventName, callback.bind(this));
};
/**
* Static Synchronous Event - Calls clientCallback directly after the event result is obtained
* async() - Simply calls 'Async()' passing it the arguments
* @param eventId
* @param data
* @param clientCallback is executed ideally when the event completed
* @param clientCallback
* @param clientErrorCallback
* @returns {number} of callbacks executed
* @constructor
*
*/
async(
eventId,
data,
clientCallback,
clientErrorCallback
) {
//CUSTOM_ASYNC_METHOD_START
return Event.Async(
eventId,
data,
clientCallback,
clientErrorCallback
);
//CUSTOM_ASYNC_METHOD_END
}
/**
* emit() - Simply calls 'Emit()' passing it the arguments
* @param eventId
* @param data
* @param clientCallback
* @param clientErrorCallback
*
*/
emit(
eventId,
data,
clientCallback,
clientErrorCallback
) {
//CUSTOM_EMIT_METHOD_START
return Event.Emit(
eventId,
data,
clientCallback,
clientErrorCallback
);
//CUSTOM_EMIT_METHOD_END
}
/**
* subscribe() - Simply calls 'Subscribe()' passing it the arguments
* @param eventId
* @param callback
*
*/
subscribe(
eventId,
callback
) {
//CUSTOM_SUBSCRIBE_METHOD_START
return Event.Subscribe(eventId, callback.bind(this));
//CUSTOM_SUBSCRIBE_METHOD_END
}
//GENERATE_METHODS_END
//GENERATE_STATIC_METHODS_START
/**
* Async() - Calls all subscription functions registered to eventId with data, clientCallback and
* clientErrorCallback as arguments. If an error occurs during clientCallback it additionally will
* execute clientErrorCallback with the error as argument.
* @param eventId
* @param data
* @param clientCallback
* @param clientErrorCallback
*
*/
static Async(
eventId,
data,
clientCallback,
clientErrorCallback
) {
//CUSTOM_STATIC_ASYNC_METHOD_START
if (Event.Subscriptions.hasOwnProperty(eventId)) {
let subscriptionIds = Object.keys(Event.Subscriptions[eventId]);
subscriptionIds.map(
function(subscriptionId) {
try {
Event.Subscriptions[eventId][subscriptionId](data, clientCallback, clientErrorCallback);
} catch (error) {
if (clientErrorCallback) {
clientErrorCallback(error);
} else {
console.error(error);
throw error;
}
}
}
)
}
//CUSTOM_STATIC_ASYNC_METHOD_END
}
/**
* Emit() - Calls all subscription functions registered to eventId with data as arg. Calls clientCallback
* directly after the event result is obtained, passing it the result. If an exception occurs during
* execution, the clientErrorCallback is called with the error as argument.
* @param eventId
* @param data
* @param clientCallback
* @param clientErrorCallback
*
*/
static Emit(
eventId,
@ -129,6 +185,8 @@ class Event {
clientCallback,
clientErrorCallback
) {
//CUSTOM_STATIC_EMIT_METHOD_START
if (Event.Subscriptions.hasOwnProperty(eventId)) {
let subscriptionIds = Object.keys(Event.Subscriptions[eventId]);
@ -152,59 +210,68 @@ class Event {
}
)
}
}
//CUSTOM_STATIC_EMIT_METHOD_END
emit(
eventName,
data,
clientCallback,
clientErrorCallback
) {
return Event.Emit(
eventName,
data,
clientCallback,
clientErrorCallback
);
}
/**
* Execute the functions which subscribe to this event, but don't process the client callback - the subscription function
* should execute the client callback
* Subscribe() - Subscribes to 'eventName', ex. Event.BEFORE_RENDER and executes 'callback()' when eventName is
* raised
* @param eventId
* @param data
* @param clientCallback
* @param clientErrorCallback
* @returns {number}
* @constructor
* @param callback
* @returns {Object} - A handle to the subscription which can be removed by calling handle.remove()
*/
static Async(
static Subscribe(
eventId,
data,
clientCallback,
clientErrorCallback
callback
) {
//CUSTOM_STATIC_SUBSCRIBE_METHOD_START
let subscriptionId = Utils.RandomId(10);
if (Event.Subscriptions.hasOwnProperty(eventId)) {
let subscriptionIds = Object.keys(Event.Subscriptions[eventId]);
if (Event.Subscriptions[eventId][subscriptionId]) {
throw new Error('A component can only subscribe to a particular event ID once');
}
subscriptionIds.map(
function(subscriptionId) {
try {
Event.Subscriptions[eventId][subscriptionId](data, clientCallback, clientErrorCallback);
} catch (error) {
if (clientErrorCallback) {
clientErrorCallback(error);
Event.Subscriptions[eventId][subscriptionId] = callback;
} else {
console.error(error);
throw error;
Event.Subscriptions[eventId] = {};
Event.Subscriptions[eventId][subscriptionId] = callback;
}
/**
* Return a handle to the caller to allow us to unsubscribe to this event
*/
return {
fn: callback,
remove: function (eventId, subscriptionId) {
return function () {
/**
* Stop listening for this event from this component
*/
delete Event.Subscriptions[eventId][subscriptionId];
/**
* If the length of listeners is 0, stop referencing this event
* @type {string[]}
*/
let listeners = Object.keys(Event.Subscriptions[eventId]);
if (listeners.length === 0) {
delete Event.Subscriptions[eventId];
}
}
}
)
}
}(eventId, subscriptionId),
subscriptionId : subscriptionId
};
//CUSTOM_IMPLEMENTATION_END
//CUSTOM_STATIC_SUBSCRIBE_METHOD_END
}
//GENERATE_STATIC_METHODS_END
}
@ -257,7 +324,6 @@ Event.GetEventName = function(eventId) {
};
//EVENT_GENERATED_END
//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_END
module.exports = Event;

View File

@ -51,7 +51,12 @@ class System {
//GENERATE_CONSTRUCTOR_END
//GENERATE_METHODS_START
start(options, anotherOption) {
/**
* start
*/
start(options) {
//CUSTOM_START_METHOD_START
System.Start(options);
@ -62,25 +67,56 @@ class System {
console.log('something else');
//CUSTOM_START_METHOD_END
}
/**
* stop
*/
stop(options) {
//CUSTOM_STOP_METHOD_START
System.Stop(options);
//CUSTOM_STOP_METHOD_END
}
//GENERATE_METHODS_END
//GENERATE_STATIC_METHODS_START
/**
* Start
*/
static Start(options) {
//CUSTOM_STATIC_START_METHOD_START
console.log('Starting system X');
//CUSTOM_STATIC_START_METHOD_END
}
/**
* Stop
*/
static Stop(options) {
//CUSTOM_STATIC_STOP_METHOD_START
console.log('Stopping system X');
//CUSTOM_STATIC_STOP_METHOD_END
}
//GENERATE_STATIC_METHODS_END

View File

@ -1,4 +1,12 @@
/**
* METHOD_NAME() - COMMENT
* PARAMS
* RETURNS
*/
METHOD_NAME(METHOD_ARGS) {
//CUSTOM_METHOD_NAME_UPPERCASE_METHOD_START
//CUSTOM_METHOD_NAME_UPPERCASE_METHOD_END
}

View File

@ -1,4 +1,12 @@
/**
* METHOD_NAME() - COMMENT
* PARAMS
* RETURNS
*/
static METHOD_NAME(METHOD_ARGS) {
//CUSTOM_STATIC_METHOD_NAME_UPPERCASE_METHOD_START
//CUSTOM_STATIC_METHOD_NAME_UPPERCASE_METHOD_END
}

View File

@ -19,15 +19,15 @@ class CLASS_NAME {
//GENERATE_CONSTRUCTOR_START
//GENERATE_CONSTRUCTOR_END
//CUSTOM_IMPLEMENTATION_START
//CUSTOM_IMPLEMENTATION_END
//GENERATE_METHODS_START
//GENERATE_METHODS_END
//GENERATE_STATIC_METHODS_START
//GENERATE_STATIC_METHODS_END
//CUSTOM_IMPLEMENTATION_START
//CUSTOM_IMPLEMENTATION_END
}
//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_START

View File

@ -24,10 +24,12 @@ GENERATE_UPDATE_INSTANCE_AFTER
GENERATE_UPDATE_INSTANCE_BEFORE
GENERATE_UPDATE_INSTANCE_OPTIONS
CUSTOM_AFTER_INIT
CUSTOM_ASYNC_METHOD
CUSTOM_BEFORE_INIT
CUSTOM_CREATE_INSTANCE
CUSTOM_DISPOSE
CUSTOM_DISPOSE_INSTANCE
CUSTOM_EMIT_METHOD
CUSTOM_EVENT_LISTENERS
CUSTOM_EXCLUDED_FROM_INSTANCE_OPTIONS
CUSTOM_IMPLEMENTATION
@ -39,12 +41,14 @@ CUSTOM_OPTIONS
CUSTOM_OPTIONS_INIT
CUSTOM_OUT_OF_CLASS_IMPLEMENTATION
CUSTOM_START_METHOD
CUSTOM_STATIC_ASYNC_METHOD
CUSTOM_STATIC_EMIT_METHOD
CUSTOM_STATIC_METHOD_NAME_UPPERCASE_METHOD
CUSTOM_STATIC_METHODS
CUSTOM_STATIC_START_METHOD
CUSTOM_STATIC_STOP_METHOD
CUSTOM_STATIC_TEST_RENAMED_METHOD
CUSTOM_STATIC_SUBSCRIBE_METHOD
CUSTOM_STOP_METHOD
CUSTOM_TEST_RENAMED_METHOD
CUSTOM_SUBSCRIBE_METHOD
CUSTOM_UPDATE_FROM_INSTANCE
CUSTOM_UPDATE_INSTANCE

View File

@ -159,14 +159,14 @@ function getWhitespace($contents, $token)
{
$matches = [];
if (preg_match('/^(\s*)\b' . $token . '\b/m', $contents, $matches)) {
if (preg_match('/^\n*(\s*)\b' . $token . '\b/m', $contents, $matches)) {
return [
'white-space' => $matches[1],
'inline-comment' => false
];
} else {
if (preg_match('/^(\s*)\/\/\b' . $token . '\b/m', $contents, $matches)) {
if (preg_match('/^\n*(\s*)\/\/\b' . $token . '\b/m', $contents, $matches)) {
return [
'white-space' => $matches[1],
'inline-comment' => true
@ -414,6 +414,7 @@ function doMethodUpdate($template, $tokens, $token)
$updates = '';
foreach ($store as $item) {
$item = trim($item);
@ -428,20 +429,56 @@ function doMethodUpdate($template, $tokens, $token)
}
$args = '';
$result = preg_match('/\((.*)\)/', $item, $matches);
$result = preg_match('/\((.*?)\)/', $item, $matches);
if ($result !== false && sizeof($matches) >= 2) {
$args = $matches[1];
}
$params = $args;
$argsArray = preg_split('/,(\s*)/', $args);
if (sizeof($argsArray) > 1) {
$args = implode(",\n\t\t", $argsArray);
$args = "\n\t\t" . $args . "\n\t";
$params = implode("\n\t * @param ", $argsArray);
$params = "@param " . $params;
}
$comment = preg_match('/.*?\).*?(\w.*$)/', $item, $matches);
if ($result !== false && sizeof($matches) >= 2) {
$comment = $matches[1];
}
$returns = preg_split('/@return[s]*\s*/', $comment);
if (sizeof($returns) > 1) {
$comment = $returns[0];
$returns = '@returns ' . $returns[1];
} else {
$returns = '';
}
$methodTokenName = strtoupper(from_camel_case($methodName));
$spaces = '';
$length = strlen($methodName . '() - ');
for ($i = 0; $i < $length; $i++) {
$spaces = ' ' . $spaces;
}
$comment = wordwrap($comment, 100, "\n * " . $spaces);
$updated = str_replace('METHOD_ARGS', $args, $template);
$updated = str_replace('METHOD_NAME_UPPERCASE', $methodTokenName, $updated);
$updated = str_replace('METHOD_NAME', $methodName, $updated);
$updated = str_replace('COMMENT', $comment, $updated);
$updated = str_replace('PARAMS', $params, $updated);
$updated = str_replace('RETURNS', $returns, $updated);
$updates .= $updated;
}
return $updates;
}