static kbool_t kBlock_declClassField(KonohaContext *kctx, kBlock *bk, kGamma *gma, KonohaClassVar *ct) { size_t i; kbool_t failedOnce = false; for(i = 0; i < kArray_size(bk->StmtList); i++) { kStmt *stmt = bk->StmtList->StmtItems[i]; if(stmt->syn->keyword == KW_TypeDeclPattern) { kshortflag_t flag = kField_Getter | kField_Setter; kToken *tk = SUGAR kStmt_GetToken(kctx, stmt, KW_TypePattern, NULL); kExpr *expr = SUGAR kStmt_GetExpr(kctx, stmt, KW_ExprPattern, NULL); if(!kStmt_AddClassField(kctx, stmt, gma, ct, flag, Token_typeLiteral(tk), expr)) { failedOnce = true; } } } return !(failedOnce); }
static size_t kBlock_countFieldSize(KonohaContext *kctx, kBlock *bk) { size_t i, c = 0; if(bk != NULL) { for(i = 0; i < kArray_size(bk->StmtList); i++) { kStmt *stmt = bk->StmtList->StmtItems[i]; DBG_P("stmt->keyword=%s%s", PSYM_t(stmt->syn->keyword)); if(stmt->syn->keyword == KW_TypeDeclPattern) { kExpr *expr = SUGAR kStmt_GetExpr(kctx, stmt, KW_ExprPattern, NULL); if(expr->syn->keyword == KW_COMMA) { c += (kArray_size(expr->cons) - 1); } else if(expr->syn->keyword == KW_LET || Expr_isTerm(expr)) { c++; } } } } return c; }
static KMETHOD Statement_ConstDecl(KonohaContext *kctx, KonohaStack *sfp) { VAR_Statement(stmt, gma); kNameSpace *ns = Stmt_ns(stmt); kToken *SymbolToken = SUGAR kStmt_GetToken(kctx, stmt, KW_SymbolPattern, NULL); ksymbol_t unboxKey = SymbolToken->resolvedSymbol; kbool_t result = SUGAR kStmt_TypeCheckByName(kctx, stmt, KW_ExprPattern, gma, TY_var, TypeCheckPolicy_CONST); if(result) { kExpr *ConstExpr = SUGAR kStmt_GetExpr(kctx, stmt, KW_ExprPattern, NULL); ktype_t type = ConstExpr->ty; uintptr_t unboxValue; result = false; if(ConstExpr->build == TEXPR_NULL) { // const C = String type = VirtualType_KonohaClass; unboxValue = (uintptr_t)(CT_(ConstExpr->ty)); result = true; } else if(ConstExpr->build == TEXPR_CONST) { // const C = "1" unboxValue = (uintptr_t)ConstExpr->objectConstValue; result = true; } else if(ConstExpr->build == TEXPR_NCONST) { // const c = 1 unboxValue = ConstExpr->unboxConstValue; result = true; } if(result) { KMakeTraceUL(trace, sfp, stmt->uline); result = KLIB kNameSpace_SetConstData(kctx, ns, unboxKey, type, unboxValue, trace); } else { kStmt_Message(kctx, stmt, ErrTag, "constant value is expected: %s%s", PSYM_t(unboxKey)); } } kStmt_done(kctx, stmt); KReturnUnboxValue(result); }
static kExpr* Stmt_getFirstExpr(KonohaContext *kctx, kStmt *stmt) { return SUGAR kStmt_GetExpr(kctx, stmt, KW_ExprPattern, NULL); }