flowNodeFromShaderStage( shaderStage, node, output = null, propertyName = null ) {

		const previousTab = this.tab;
		const previousCache = this.cache;
		const previousShaderStage = this.shaderStage;
		const previousContext = this.context;

		this.setShaderStage( shaderStage );

		const context = { ...this.context };
		delete context.nodeBlock;

		this.cache = this.globalCache;
		this.tab = '\t';
		this.context = context;

		let result = null;

		if ( this.buildStage === 'generate' ) {

			const flowData = this.flowChildNode( node, output );

			if ( propertyName !== null ) {

				flowData.code += `${ this.tab + propertyName } = ${ flowData.result };\n`;

			}

			this.flowCode[ shaderStage ] = this.flowCode[ shaderStage ] + flowData.code;

			result = flowData;

		} else {

			result = node.build( this );

		}

		this.setShaderStage( previousShaderStage );

		this.cache = previousCache;
		this.tab = previousTab;
		this.context = previousContext;

		return result;

	}
Executes a flow of code in a different stage.

Some nodes like `varying()` have the ability to compute code in vertex-stage and
return the value in fragment-stage even if it is being executed in an input fragment.

@param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage.
@param {Node} node - The node to execute.
@param {?string} output - Expected output type. For example 'vec3'.
@param {?string} propertyName - The property name to assign the result.
@return {Object|Node|null} The code flow or node.build() result.