summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/mozilla/tests/webgpu/common/util/preprocessor.js.map
blob: b58f288efe45ef26ae7e7ebf07317ac7944116d8 (plain)
1
{"version":3,"file":"preprocessor.js","names":["assert","State","Directive","constructor","depth","checkDepth","stack","length","If","predicate","applyTo","parentState","state","push","allowsFollowingElse","Passing","Skipping","Seeking","ElseIf","siblingState","pop","Else","EndIf","pp","strings","values","result","stateStack","i","passing","value","_if","_elif","_else","_endif","__if","__elif","__else","__endif","___if","___elif","___else","___endif"],"sources":["../../../src/common/util/preprocessor.ts"],"sourcesContent":["import { assert } from './util.js';\n\n// The state of the preprocessor is a stack of States.\ntype StateStack = { allowsFollowingElse: boolean; state: State }[];\nconst enum State {\n  Seeking, // Still looking for a passing condition\n  Passing, // Currently inside a passing condition (the root is always in this state)\n  Skipping, // Have already seen a passing condition; now skipping the rest\n}\n\n// The transitions in the state space are the following preprocessor directives:\n// - Sibling elif\n// - Sibling else\n// - Sibling endif\n// - Child if\nabstract class Directive {\n  private readonly depth: number;\n\n  constructor(depth: number) {\n    this.depth = depth;\n  }\n\n  protected checkDepth(stack: StateStack): void {\n    assert(\n      stack.length === this.depth,\n      `Number of \"$\"s must match nesting depth, currently ${stack.length} (e.g. $if $$if $$endif $endif)`\n    );\n  }\n\n  abstract applyTo(stack: StateStack): void;\n}\n\nclass If extends Directive {\n  private readonly predicate: boolean;\n\n  constructor(depth: number, predicate: boolean) {\n    super(depth);\n    this.predicate = predicate;\n  }\n\n  applyTo(stack: StateStack) {\n    this.checkDepth(stack);\n    const parentState = stack[stack.length - 1].state;\n    stack.push({\n      allowsFollowingElse: true,\n      state:\n        parentState !== State.Passing\n          ? State.Skipping\n          : this.predicate\n          ? State.Passing\n          : State.Seeking,\n    });\n  }\n}\n\nclass ElseIf extends If {\n  applyTo(stack: StateStack) {\n    assert(stack.length >= 1);\n    const { allowsFollowingElse, state: siblingState } = stack.pop()!;\n    this.checkDepth(stack);\n    assert(allowsFollowingElse, 'pp.elif after pp.else');\n    if (siblingState !== State.Seeking) {\n      stack.push({ allowsFollowingElse: true, state: State.Skipping });\n    } else {\n      super.applyTo(stack);\n    }\n  }\n}\n\nclass Else extends Directive {\n  applyTo(stack: StateStack) {\n    assert(stack.length >= 1);\n    const { allowsFollowingElse, state: siblingState } = stack.pop()!;\n    this.checkDepth(stack);\n    assert(allowsFollowingElse, 'pp.else after pp.else');\n    stack.push({\n      allowsFollowingElse: false,\n      state: siblingState === State.Seeking ? State.Passing : State.Skipping,\n    });\n  }\n}\n\nclass EndIf extends Directive {\n  applyTo(stack: StateStack) {\n    stack.pop();\n    this.checkDepth(stack);\n  }\n}\n\n/**\n * A simple template-based, non-line-based preprocessor implementing if/elif/else/endif.\n *\n * @example\n * ```\n *     const shader = pp`\n * ${pp._if(expr)}\n *   const x: ${type} = ${value};\n * ${pp._elif(expr)}\n * ${pp.__if(expr)}\n * ...\n * ${pp.__else}\n * ...\n * ${pp.__endif}\n * ${pp._endif}`;\n * ```\n *\n * @param strings - The array of constant string chunks of the template string.\n * @param ...values - The array of interpolated `${}` values within the template string.\n */\nexport function pp(\n  strings: TemplateStringsArray,\n  ...values: ReadonlyArray<Directive | string | number>\n): string {\n  let result = '';\n  const stateStack: StateStack = [{ allowsFollowingElse: false, state: State.Passing }];\n\n  for (let i = 0; i < values.length; ++i) {\n    const passing = stateStack[stateStack.length - 1].state === State.Passing;\n    if (passing) {\n      result += strings[i];\n    }\n\n    const value = values[i];\n    if (value instanceof Directive) {\n      value.applyTo(stateStack);\n    } else {\n      if (passing) {\n        result += value;\n      }\n    }\n  }\n  assert(stateStack.length === 1, 'Unterminated preprocessor condition at end of file');\n  result += strings[values.length];\n\n  return result;\n}\npp._if = (predicate: boolean) => new If(1, predicate);\npp._elif = (predicate: boolean) => new ElseIf(1, predicate);\npp._else = new Else(1);\npp._endif = new EndIf(1);\npp.__if = (predicate: boolean) => new If(2, predicate);\npp.__elif = (predicate: boolean) => new ElseIf(2, predicate);\npp.__else = new Else(2);\npp.__endif = new EndIf(2);\npp.___if = (predicate: boolean) => new If(3, predicate);\npp.___elif = (predicate: boolean) => new ElseIf(3, predicate);\npp.___else = new Else(3);\npp.___endif = new EndIf(3);\n// Add more if needed.\n"],"mappings":"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"}