private Expr lookupMethod(CTX ctx, Expr expr, KClass this_cid, Gamma gma, KClass reqty) {
		// method name
		Token tk = (Token)expr.cons.get(0);
		if(tk.tt == TK.SYMBOL || tk.tt == TK.USYMBOL) {
			tk.mn = tk.text;
		}
		String mn = checkMN(tk.mn);
		KClass k = this_cid;
		
		// tycheck arguments
		List<KClass> argTypes = new ArrayList<KClass>();
		int size = expr.cons.size();
		for(int i=2; i<size; i++) {
			Expr e = expr.tyCheckAt(ctx, i, gma, KClass.varClass, 0);
			argTypes.add(e.ty);
		}
		Expr e1 = expr.at(1);
		if(hasThis(ctx, e1, gma)) {
			argTypes.add(0, k);
		}
		
		// create expr
		if(mn.equals("new")) {
			KMethod mtd = k.getConstructor(argTypes);
			expr.build = TEXPR.NEW;
			expr.ty = k;
			expr.cons.set(0, mtd);
		} else {
			KMethod mtd = k.getMethod(mn, argTypes);
			if(mtd == null) {
				throw new RuntimeException("method not found: " + k.getName() + "." + mn + " " + argTypes);
			}
			expr.build = TEXPR.CALL;
			expr.ty = mtd.getReturnClass();
			expr.cons.set(0, mtd);
		}
		return expr;
	}