示例#1
0
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;
}
示例#2
0
 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;
 }