import { TempNode } from './TempNode.js'; const declarationRegexp = /^([a-z_0-9]+)\s([a-z_0-9]+)\s?\=?\s?(.*?)(\;|$)/i; class ConstNode extends TempNode { constructor( src, useDefine ) { super(); this.parse( src || ConstNode.PI, useDefine ); } getType( builder ) { return builder.getTypeByFormat( this.type ); } parse( src, useDefine ) { this.src = src || ''; let name, type, value = ''; const match = this.src.match( declarationRegexp ); this.useDefine = useDefine || this.src.charAt( 0 ) === '#'; if ( match && match.length > 1 ) { type = match[ 1 ]; name = match[ 2 ]; value = match[ 3 ]; } else { name = this.src; type = 'f'; } this.name = name; this.type = type; this.value = value; } build( builder, output ) { if ( output === 'source' ) { if ( this.value ) { if ( this.useDefine ) { return '#define ' + this.name + ' ' + this.value; } return 'const ' + this.type + ' ' + this.name + ' = ' + this.value + ';'; } else if ( this.useDefine ) { return this.src; } } else { builder.include( this ); return builder.format( this.name, this.getType( builder ), output ); } } generate( builder, output ) { return builder.format( this.name, this.getType( builder ), output ); } copy( source ) { super.copy( source ); this.parse( source.src, source.useDefine ); return this; } toJSON( meta ) { let data = this.getJSONNode( meta ); if ( ! data ) { data = this.createJSONNode( meta ); data.src = this.src; if ( data.useDefine === true ) data.useDefine = true; } return data; } } ConstNode.prototype.nodeType = 'Const'; ConstNode.PI = 'PI'; ConstNode.PI2 = 'PI2'; ConstNode.RECIPROCAL_PI = 'RECIPROCAL_PI'; ConstNode.RECIPROCAL_PI2 = 'RECIPROCAL_PI2'; ConstNode.LOG2 = 'LOG2'; ConstNode.EPSILON = 'EPSILON'; export { ConstNode };