three 基础库
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.

107 lines
1.4 KiB

2 years ago
import { TempNode } from './TempNode.js';
const declarationRegexp = /^struct\s*([a-z_0-9]+)\s*{\s*((.|\n)*?)}/img,
propertiesRegexp = /\s*(\w*?)\s*(\w*?)(\=|\;)/img;
class StructNode extends TempNode {
constructor( src ) {
super();
this.parse( src );
}
getType( builder ) {
return builder.getTypeByFormat( this.name );
}
getInputByName( name ) {
let i = this.inputs.length;
while ( i -- ) {
if ( this.inputs[ i ].name === name ) {
return this.inputs[ i ];
}
}
}
generate( builder, output ) {
if ( output === 'source' ) {
return this.src + ';';
} else {
return builder.format( '( ' + this.src + ' )', this.getType( builder ), output );
}
}
parse( src = '' ) {
this.src = src;
this.inputs = [];
const declaration = declarationRegexp.exec( this.src );
if ( declaration ) {
const properties = declaration[ 2 ];
let match;
while ( match = propertiesRegexp.exec( properties ) ) {
this.inputs.push( {
type: match[ 1 ],
name: match[ 2 ]
} );
}
this.name = declaration[ 1 ];
} else {
this.name = '';
}
this.type = this.name;
}
toJSON( meta ) {
let data = this.getJSONNode( meta );
if ( ! data ) {
data = this.createJSONNode( meta );
data.src = this.src;
}
return data;
}
}
StructNode.prototype.nodeType = 'Struct';
export { StructNode };