Extract function definitions from an array of GLSL tokens from glsl-tokenizer.
You can use this to grab all of the functions in a shader, along with their arguments, return value and name.
Given an array of tokens
produced by glsl-tokenizer, return an array of function data in the following format:
{
name: 'functionName',
type: 'vec4'
body: [100, 110],
args: [98, 99],
outer: [80, 111]
}
The function name. For example, the following function would be main
:
void main();
The function return type. For example, the following function would be vec2
:
vec2 getModel(vec3 p);
Note that this supports structs too! The following function's type
would be Ray
:
struct Ray {
vec3 ro;
vec3 rd;
}
Ray getCamera(vec3 origin);
The start and end index in the original tokens array of the function body, i.e. the part between the curly braces. If the function doesn't have a body, this will be false
.
For example:
const tokenFunctions = require('glsl-token-functions')
const toString = require('glsl-token-string')
const tokenize = require('glsl-tokenizer')
const src = `
void main();
void main() { gl_FragColor = vec4(1); }
`
const tokens = tokenize(src)
const functions = tokenFunctions(tokens)
console.log(getBody(functions[0])) // false
console.log(getBody(functions[1])) // " gl_FragColor = vec4(1); "
function getBody () {
return toString(tokens.slice(fn.body[0], fn.body[1]))
}
The start and end index in the original tokens array of the function arguments, i.e. the part including the parenthesis in the function definition.
For example:
const tokenFunctions = require('glsl-token-functions')
const toString = require('glsl-token-string')
const tokenize = require('glsl-tokenizer')
const src = `
void main();
void drawImage(vec3 ro, vec3 rd);
`
const tokens = tokenize(src)
const functions = tokenFunctions(tokens)
console.log(getArgs(functions[0])) // "()"
console.log(getArgs(functions[1])) // "(vec3 ro, vec3 rd)"
function getArgs () {
return toString(tokens.slice(fn.args[0], fn.args[1]))
}
The start and end index in the original tokens array of the entire function.
For example:
const tokenFunctions = require('glsl-token-functions')
const toString = require('glsl-token-string')
const tokenize = require('glsl-tokenizer')
const src = `
void main();
void main() { gl_FragColor = vec4(1); }
`
const tokens = tokenize(src)
const functions = tokenFunctions(tokens)
console.log(getOuter(functions[0])) // "void main();"
console.log(getOuter(functions[1])) // "void main() { gl_FragColor = vec4(1); }"
function getOuter () {
return toString(tokens.slice(fn.outer[0], fn.outer[1]))
}
See stackgl/contributing for details.
MIT. See LICENSE.md for details.