All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.shiftleft.js2cpg.parser.GeneralizingAstVisitor.scala Maven / Gradle / Ivy

package io.shiftleft.js2cpg.parser

import com.oracle.js.parser.ir._
import com.oracle.js.parser.ir.visitor.TranslatorNodeVisitor

/** This visitor mapped the enterXXX methods to the visit() to provide an interface which is closer to the original
  * pattern. Furthermore, a not overridden visit() implementation calls the visit() method for the next type in the
  * class hierarchy to allow using code to handle certain AST parts in a generalized way on any part of the class
  * hierarchy.
  */
class GeneralizingAstVisitor[T] extends TranslatorNodeVisitor[LexicalContext, T](new LexicalContext()) {

  protected val globalBuiltins: Set[String] =
    Set(
      "Buffer.from",
      "decodeURI",
      "decodeURIComponent",
      "encodeURI",
      "encodeURIComponent",
      "eval",
      "fetch",
      "isFinite",
      "isNaN",
      "JSON.parse",
      "JSON.stringify",
      "Number.isFinite",
      "Number.isInteger",
      "Number.isNaN",
      "Number.isSafeInteger",
      "Number.parseFloat",
      "Number.parseInt",
      "Number.prototype.toExponential",
      "Number.prototype.toFixed",
      "Number.prototype.toLocaleString",
      "Number.prototype.toPrecision",
      "Number.prototype.toSource",
      "Number.prototype.toString",
      "Number.prototype.valueOf",
      "parseFloat",
      "parseInt",
      "uneval",
      "Object.assign",
      "Object.create",
      "Object.defineProperties",
      "Object.defineProperty",
      "Object.entries",
      "Object.freeze",
      "Object.fromEntries",
      "Object.getOwnPropertyDescriptor",
      "Object.getOwnPropertyDescriptors",
      "Object.getOwnPropertyNames",
      "Object.getOwnPropertySymbols",
      "Object.getPrototypeOf",
      "Object.is",
      "Object.isExtensible",
      "Object.isFrozen",
      "Object.isSealed",
      "Object.keys",
      "Object.preventExtensions",
      "Object.prototype.__defineGetter__",
      "Object.prototype.__defineSetter__",
      "Object.prototype.__lookupGetter__",
      "Object.prototype.__lookupSetter__",
      "Object.prototype.hasOwnProperty",
      "Object.prototype.isPrototypeOf",
      "Object.prototype.propertyIsEnumerable",
      "Object.prototype.toLocaleString",
      "Object.prototype.toSource",
      "Object.prototype.toString",
      "Object.prototype.valueOf",
      "Object.seal",
      "Object.setPrototypeOf",
      "Object.values",
      "Promise.all",
      "Promise.allSettled",
      "Promise.any",
      "Promise.race",
      "Promise.reject",
      "Promise.resolve",
      "localStorage.setItem"
    )

  def visit(node: Node): T = {
    throw new AssertionError(String.format("should not reach here. %s(%s)", node.getClass.getSimpleName, node))
  }

  def visit(node: AccessNode): T = {
    visit(node.asInstanceOf[BaseNode])
  }

  def visit(node: BaseNode): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: Block): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: BinaryNode): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: BreakNode): T = {
    visit(node.asInstanceOf[JumpStatement])
  }

  def visit(node: CallNode): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: CaseNode): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: CatchNode): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: ContinueNode): T = {
    visit(node.asInstanceOf[JumpStatement])
  }

  def visit(node: DebuggerNode): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: EmptyNode): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: ErrorNode): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: NamedExportsNode): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: ExportNode): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: ExportSpecifierNode): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: Expression): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: ExpressionStatement): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: BlockStatement): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: ForNode): T = {
    visit(node.asInstanceOf[LoopNode])
  }

  def visit(node: FromNode): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: FunctionNode): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: IdentNode): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: IfNode): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: ImportClauseNode): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: ImportNode): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: ImportSpecifierNode): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: IndexNode): T = {
    visit(node.asInstanceOf[BaseNode])
  }

  def visit(node: JumpStatement): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: LabelNode): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: LiteralNode[?]): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: LoopNode): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: NameSpaceImportNode): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: NamedImportsNode): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: ObjectNode): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: PropertyNode): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: ReturnNode): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: TemplateLiteralNode): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: Statement): T = {
    visit(node.asInstanceOf[Node])
  }

  def visit(node: SwitchNode): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: TernaryNode): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: ThrowNode): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: TryNode): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: UnaryNode): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: JoinPredecessorExpression): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: VarNode): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: WhileNode): T = {
    visit(node.asInstanceOf[LoopNode])
  }

  def visit(node: WithNode): T = {
    visit(node.asInstanceOf[Statement])
  }

  def visit(node: ClassNode): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: BlockExpression): T = {
    visit(node.asInstanceOf[Expression])
  }

  def visit(node: ParameterNode): T = {
    visit(node.asInstanceOf[Expression])
  }

  override def enterDefault(node: Node): T = {
    visit(node)
  }

  override def enterAccessNode(node: AccessNode): T = {
    visit(node)
  }

  override def enterBlock(node: Block): T = {
    visit(node)
  }

  override def enterBinaryNode(node: BinaryNode): T = {
    visit(node)
  }

  override def enterBreakNode(node: BreakNode): T = {
    visit(node)
  }

  override def enterCallNode(node: CallNode): T = {
    visit(node)
  }

  override def enterCaseNode(node: CaseNode): T = {
    visit(node)
  }

  override def enterCatchNode(node: CatchNode): T = {
    visit(node)
  }

  override def enterContinueNode(node: ContinueNode): T = {
    visit(node)
  }

  override def enterDebuggerNode(node: DebuggerNode): T = {
    visit(node)
  }

  override def enterEmptyNode(node: EmptyNode): T = {
    visit(node)
  }

  override def enterErrorNode(node: ErrorNode): T = {
    visit(node)
  }

  override def enterExportNode(node: ExportNode): T = {
    visit(node)
  }

  override def enterExportSpecifierNode(node: ExportSpecifierNode): T = {
    visit(node)
  }

  override def enterExpressionStatement(node: ExpressionStatement): T = {
    visit(node)
  }

  override def enterBlockStatement(node: BlockStatement): T = {
    visit(node)
  }

  override def enterForNode(node: ForNode): T = {
    visit(node)
  }

  override def enterFromNode(node: FromNode): T = {
    visit(node)
  }

  override def enterFunctionNode(node: FunctionNode): T = {
    visit(node)
  }

  override def enterIdentNode(node: IdentNode): T = {
    visit(node)
  }

  override def enterIfNode(node: IfNode): T = {
    visit(node)
  }

  override def enterImportClauseNode(node: ImportClauseNode): T = {
    visit(node)
  }

  override def enterImportNode(node: ImportNode): T = {
    visit(node)
  }

  override def enterImportSpecifierNode(node: ImportSpecifierNode): T = {
    visit(node)
  }

  override def enterIndexNode(node: IndexNode): T = {
    visit(node)
  }

  override def enterLabelNode(node: LabelNode): T = {
    visit(node)
  }

  override def enterLiteralNode(node: LiteralNode[?]): T = {
    visit(node)
  }

  override def enterNameSpaceImportNode(node: NameSpaceImportNode): T = {
    visit(node)
  }

  override def enterNamedImportsNode(node: NamedImportsNode): T = {
    visit(node)
  }

  override def enterObjectNode(node: ObjectNode): T = {
    visit(node)
  }

  override def enterPropertyNode(node: PropertyNode): T = {
    visit(node)
  }

  override def enterReturnNode(node: ReturnNode): T = {
    visit(node)
  }

  override def enterTemplateLiteralNode(node: TemplateLiteralNode): T = {
    visit(node)
  }

  override def enterSwitchNode(node: SwitchNode): T = {
    visit(node)
  }

  override def enterTernaryNode(node: TernaryNode): T = {
    visit(node)
  }

  override def enterThrowNode(node: ThrowNode): T = {
    visit(node)
  }

  override def enterTryNode(node: TryNode): T = {
    visit(node)
  }

  override def enterUnaryNode(node: UnaryNode): T = {
    visit(node)
  }

  override def enterJoinPredecessorExpression(node: JoinPredecessorExpression): T = {
    visit(node)
  }

  override def enterVarNode(node: VarNode): T = {
    visit(node)
  }

  override def enterWhileNode(node: WhileNode): T = {
    visit(node)
  }

  override def enterWithNode(node: WithNode): T = {
    visit(node)
  }

  override def enterClassNode(node: ClassNode): T = {
    visit(node)
  }

  override def enterBlockExpression(node: BlockExpression): T = {
    visit(node)
  }

  override def enterParameterNode(node: ParameterNode): T = {
    visit(node)
  }

  override def enterNamedExportsNode(node: NamedExportsNode): T = {
    visit(node)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy