You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
1.9 KiB
126 lines
1.9 KiB
2 years ago
|
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 };
|