function parseMethod($ast) { assert_ast_type($ast, NodeType::METHOD); $data = ast_node_data($ast); $source = ast_node_source($ast); $name = ast_get($data, NodeKey::NAME); $obj = parseExpression(ast_get($data, NodeKey::VALUE)); $args = parseExpressionList(ast_get($data, NodeKey::ARGS)); $arg_types = extractTypes($args); $obj_type = $obj->type(); try { $mInfo = $obj_type->lookupMethod($name, $arg_types); } catch (Exception $e) { grokit_error('Failed to find method ' . $obj_type . '->' . $name . ' with args (' . implode(', ', $arg_types) . ') called from ' . $source, $e); } //fwrite(STDERR, "Calling apply for method {$obj}->{$name} with args: " . print_r($args, true) . PHP_EOL); $info = $mInfo->apply($obj, $args, $source); if ($info->is_const()) { $info->makeConstant(); } return $info; }
function parseGIWP($ast, $name, $header) { // Push LibraryManager so we can get the waypoint-specific headers ob_start(); LibraryManager::Push(); $res = new GenerationInfo(); /*************** PROCESS AST ***************/ $payload = ast_get($ast, NodeKey::PAYLOAD); $spec = parseGI(ast_get($payload, NodeKey::TYPE)); $outputs = parseAttributeList(ast_get($payload, NodeKey::ARGS)); $constArgs = parseLiteralList(ast_get($payload, NodeKey::CARGS)); $nTuples = ast_get($payload, NodeKey::TUPLES); $queries = ast_get($ast, NodeKey::QUERIES); foreach ($queries as $query) { $res->addJob($query, $name); } // The spec is (possibly) an incomplete GI type, to finish it we need to tell it to // perform a lookup with its outputs known. $type = $spec->apply(extractTypes($outputs)); correlateAttributes($outputs, $type->output()); $attMap = parseAttributeMap(ast_get($ast, NodeKey::ATT_MAP), $res); $res->absorbAttrList($outputs); $res->absorbInfoList($constArgs); $res->absorbInfo($type); /*************** END PROCESS AST ***************/ // Get our headers $myHeaders = $header . PHP_EOL . ob_get_clean(); // Only one file right now $filename = $name . '.cc'; $res->addFile($filename, $name); _startFile($filename); GIGenerate($name, $type, $outputs, $constArgs, $nTuples); _endFile($filename, $myHeaders); LibraryManager::Pop(); return $res; }