static SugarSyntaxVar *kNameSpace_guessSyntaxFromTokenList(KonohaContext *kctx, kNameSpace *ns, kArray *tokenList) { int beginIdx = 0, endIdx = kArray_size(tokenList); if(beginIdx < endIdx) { ksymbol_t keyword = tokenList->TokenItems[beginIdx]->resolvedSyntaxInfo->keyword; if(keyword == KW_TextPattern) { ksymbol_t kw; if(isSubKeyword(kctx, tokenList, beginIdx, endIdx)) { char buf[256]; PLATAPI snprintf_i(buf, sizeof(buf), "%s_%s", S_text(tokenList->TokenItems[beginIdx]->text), S_text(tokenList->TokenItems[beginIdx+1]->text)); kw = ksymbolA((const char *)buf, strlen(buf), SYM_NEWID); } else { kw = ksymbolA(S_text(tokenList->TokenItems[beginIdx]->text), S_size(tokenList->TokenItems[beginIdx]->text), SYM_NEWID); } return (SugarSyntaxVar *)NEWSYN_(ns, kw); } else if(keyword == KW_DOLLAR) { // $TokenPattern char buf[256]; PLATAPI snprintf_i(buf, sizeof(buf), "$%s", S_text(tokenList->TokenItems[beginIdx+1]->text)); ksymbol_t kw = ksymbolA((const char *)buf, strlen(buf), SYM_NEWID); return (SugarSyntaxVar *)NEWSYN_(ns, kw); } } return NULL; }
// boolean NameSpace.hate(String symbol); static KMETHOD NameSpace_hate(KonohaContext *kctx, KonohaStack *sfp) { kString *key = sfp[2].asString; ksymbol_t keyword = ksymbolA(S_text(key), S_size(key), _NEWID); KMakeTrace(trace, sfp); kNameSpace_RemoveSyntax(kctx, sfp[0].asNameSpace, keyword, trace); }
// boolean NameSpace.import(String pkgname, String symbol); static KMETHOD NameSpace_ImportPackageSymbol(KonohaContext *kctx, KonohaStack *sfp) { kString *key = sfp[2].asString; ksymbol_t keyword = ksymbolA(S_text(key), S_size(key), _NEWID); KMakeTrace(trace, sfp); kNameSpace_ImportPackageSymbol(kctx, sfp[0].asNameSpace, S_text(sfp[1].asString), keyword, trace); }
static kbool_t kStmt_AddClassField(KonohaContext *kctx, kStmt *stmt, kGamma *gma, KonohaClassVar *definedClass, kshortflag_t flag, ktype_t ty, kExpr *expr) { if(Expr_isTerm(expr)) { // String name kString *name = expr->termToken->text; ksymbol_t symbol = ksymbolA(S_text(name), S_size(name), SYM_NEWID); KLIB KonohaClass_AddField(kctx, definedClass, flag, ty, symbol); return true; } else if(expr->syn->keyword == KW_LET) { // String name = "naruto"; kExpr *lexpr = kExpr_at(expr, 1); if(Expr_isTerm(lexpr)) { kString *name = lexpr->termToken->text; ksymbol_t symbol = ksymbolA(S_text(name), S_size(name), SYM_NEWID); kExpr *vexpr = SUGAR kStmt_TypeCheckExprAt(kctx, stmt, expr, 2, gma, ty, 0); if(vexpr == K_NULLEXPR) return false; if(vexpr->build == TEXPR_CONST) { KLIB KonohaClass_AddField(kctx, definedClass, flag, ty, symbol); KonohaClass_setClassFieldObjectValue(kctx, definedClass, symbol, vexpr->objectConstValue); } else if(vexpr->build == TEXPR_NCONST) { KLIB KonohaClass_AddField(kctx, definedClass, flag, ty, symbol); KonohaClass_setClassFieldUnboxValue(kctx, definedClass, symbol, vexpr->unboxConstValue); } else if(vexpr->build == TEXPR_NULL) { KLIB KonohaClass_AddField(kctx, definedClass, flag, ty, symbol); } else { SUGAR kStmt_Message2(kctx, stmt, lexpr->termToken, ErrTag, "field initial value must be const: %s", S_text(name)); return false; } return true; } } else if(expr->syn->keyword == KW_COMMA) { // String (firstName = naruto, lastName) size_t i; for(i = 1; i < kArray_size(expr->cons); i++) { if(!kStmt_AddClassField(kctx, stmt, gma, definedClass, flag, ty, kExpr_at(expr, i))) return false; } return true; } SUGAR kStmt_Message2(kctx, stmt, NULL, ErrTag, "field name is expected"); return false; }
static ksymbol_t StringToKsymbol(KonohaContext *kctx, kString *key) { return ksymbolA(S_text(key), S_size(key), _NEWID); }