Advertisement
Guest User

Function Implementation Swift (Swizzle)

a guest
Jan 14th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 3.00 KB | None | 0 0
  1. let function = Function(name: funcName, args: args) { [unowned self] (i, a) in
  2.             guard argCount == a.count && !(args == Interpreter._variableLengthParameters) else {
  3.                 if self.stackTrace {
  4.                     self.logMsg("Incorrect number of arguments. Expected \(argCount), given: \(a.count).", ui: "Input arguments: \(a), required arguments: \(args).")
  5.                     self.logMsg("Arguments are not variable length.", ui: "Only varible length functions can have variable amounts of input arguments.")
  6.                 }
  7.                 self.reportError("Expected \(argCount) argument\(argCount == 1 ? "" : "s") in function call to '\(funcName)(_:)'")
  8.                 return
  9.             }
  10.             for statement in body {
  11.                 if let call = statement as? CallStatement {
  12.                     var i = 0
  13.                     var ua = 0
  14.                     var newArgs = [Expression]()
  15.                     call.args.forEach { (expr) in
  16.                         if let n = expr.rep.anyToken?.lexme {
  17.                             if ua < a.endIndex,  n == args[ua] {
  18.                                 let result = Token(type: TokenType.literal, lexme: a[ua], literal: nil, line: nil)
  19.                                 let newExpr = Expression(rep: .anyToken(result))
  20.                                 self.visit(newExpr)
  21.                                 newArgs.append(newExpr)
  22.                                 ua += 1
  23.                             } else {
  24.                                 newArgs.append(expr)
  25.                             }
  26.                            
  27.                         } else if let access = expr.rep.access {
  28.                             access
  29.                             guard let index = args.index(where: { $0 == access.object.lexme }) else {
  30.                                 self.reportError("Unresolved identifier '\(access.key.lexme)'")
  31.                                 return
  32.                                
  33.                             }
  34.                            
  35.                             let objcName = self.nowhite(a[index])
  36.                            
  37.                             guard let val = self.objects[objcName]?.values[access.key.lexme] else {
  38.                                 self.reportError("Unknown property '\(access.key.lexme)'")
  39.                                 return
  40.                             }
  41.                             let result = Token(type: .literal, lexme: val, literal: val, line: nil)
  42.                             let newExpr = Expression(rep: .anyToken(result))
  43.                             self.visit(newExpr)
  44.                             newArgs.append(newExpr)
  45.                             ua += 1
  46.                         }
  47.                         i += 1
  48.                     }
  49.                     let newCall = CallStatement(name: call.name, args: newArgs)
  50.                     self.visit(newCall)
  51.                 } else if let cond = statement as? IfStatement {
  52.                    
  53.                 }
  54.             }
  55.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement