|
|
@@ -25,6 +25,16 @@ import { nodeObject, nodeArray } from '../tsl/TSLBase.js';
|
|
|
* ```js
|
|
|
* Loop( { start: 10 }, () => {} );
|
|
|
* ```
|
|
|
+ * It is possible to execute with boolean values, similar to the `while` syntax.
|
|
|
+ * ```js
|
|
|
+ * const value = float( 0 ).toVar();
|
|
|
+ *
|
|
|
+ * Loop( value.lessThan( 10 ), () => {
|
|
|
+ *
|
|
|
+ * value.addAssign( 1 );
|
|
|
+ *
|
|
|
+ * } );
|
|
|
+ * ```
|
|
|
* The module also provides `Break()` and `Continue()` TSL expression for loop control.
|
|
|
* @augments Node
|
|
|
*/
|
|
|
@@ -133,15 +143,25 @@ class LoopNode extends Node {
|
|
|
|
|
|
const param = params[ i ];
|
|
|
|
|
|
- let start = null, end = null, name = null, type = null, condition = null, update = null;
|
|
|
+ let isWhile = false, start = null, end = null, name = null, type = null, condition = null, update = null;
|
|
|
|
|
|
if ( param.isNode ) {
|
|
|
|
|
|
- type = 'int';
|
|
|
- name = this.getVarName( i );
|
|
|
- start = '0';
|
|
|
- end = param.build( builder, type );
|
|
|
- condition = '<';
|
|
|
+ if ( param.getNodeType( builder ) === 'bool' ) {
|
|
|
+
|
|
|
+ isWhile = true;
|
|
|
+ type = 'bool';
|
|
|
+ end = param.build( builder, type );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ type = 'int';
|
|
|
+ name = this.getVarName( i );
|
|
|
+ start = '0';
|
|
|
+ end = param.build( builder, type );
|
|
|
+ condition = '<';
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else {
|
|
|
|
|
|
@@ -187,41 +207,51 @@ class LoopNode extends Node {
|
|
|
|
|
|
}
|
|
|
|
|
|
- const internalParam = { start, end, condition };
|
|
|
+ let loopSnippet;
|
|
|
|
|
|
- //
|
|
|
+ if ( isWhile ) {
|
|
|
|
|
|
- const startSnippet = internalParam.start;
|
|
|
- const endSnippet = internalParam.end;
|
|
|
+ loopSnippet = `while ( ${ end } )`;
|
|
|
|
|
|
- let declarationSnippet = '';
|
|
|
- let conditionalSnippet = '';
|
|
|
- let updateSnippet = '';
|
|
|
+ } else {
|
|
|
|
|
|
- if ( ! update ) {
|
|
|
+ const internalParam = { start, end, condition };
|
|
|
|
|
|
- if ( type === 'int' || type === 'uint' ) {
|
|
|
+ //
|
|
|
|
|
|
- if ( condition.includes( '<' ) ) update = '++';
|
|
|
- else update = '--';
|
|
|
+ const startSnippet = internalParam.start;
|
|
|
+ const endSnippet = internalParam.end;
|
|
|
|
|
|
- } else {
|
|
|
+ let declarationSnippet = '';
|
|
|
+ let conditionalSnippet = '';
|
|
|
+ let updateSnippet = '';
|
|
|
+
|
|
|
+ if ( ! update ) {
|
|
|
+
|
|
|
+ if ( type === 'int' || type === 'uint' ) {
|
|
|
+
|
|
|
+ if ( condition.includes( '<' ) ) update = '++';
|
|
|
+ else update = '--';
|
|
|
|
|
|
- if ( condition.includes( '<' ) ) update = '+= 1.';
|
|
|
- else update = '-= 1.';
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if ( condition.includes( '<' ) ) update = '+= 1.';
|
|
|
+ else update = '-= 1.';
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
+ declarationSnippet += builder.getVar( type, name ) + ' = ' + startSnippet;
|
|
|
|
|
|
- declarationSnippet += builder.getVar( type, name ) + ' = ' + startSnippet;
|
|
|
+ conditionalSnippet += name + ' ' + condition + ' ' + endSnippet;
|
|
|
+ updateSnippet += name + ' ' + update;
|
|
|
|
|
|
- conditionalSnippet += name + ' ' + condition + ' ' + endSnippet;
|
|
|
- updateSnippet += name + ' ' + update;
|
|
|
+ loopSnippet = `for ( ${ declarationSnippet }; ${ conditionalSnippet }; ${ updateSnippet } )`;
|
|
|
|
|
|
- const forSnippet = `for ( ${ declarationSnippet }; ${ conditionalSnippet }; ${ updateSnippet } )`;
|
|
|
+ }
|
|
|
|
|
|
- builder.addFlowCode( ( i === 0 ? '\n' : '' ) + builder.tab + forSnippet + ' {\n\n' ).addFlowTab();
|
|
|
+ builder.addFlowCode( ( i === 0 ? '\n' : '' ) + builder.tab + loopSnippet + ' {\n\n' ).addFlowTab();
|
|
|
|
|
|
}
|
|
|
|