summary refs log tree commit diff stats
path: root/tests/macros/tgetimpl.nim
blob: d231a4336a579715d543af221ad4ede9fdd5eec0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
discard """
  nimout: '''"muhaha"
proc poo(x, y: int) =
  let y = x
  echo ["poo"]'''
"""

import macros

const
  foo = "muhaha"

proc poo(x, y: int) =
  let y = x
  echo "poo"

macro m(x: typed): untyped =
  echo repr x.getImpl

m(foo)
m(poo)

#------------

macro checkOwner(x: typed, check_id: static[int]): untyped =
  let sym = case check_id:
    of 0: x
    of 1: x.getImpl.body[0][0][0]
    of 2: x.getImpl.body[0][0][^1]
    of 3: x.getImpl.body[1][0]
    else: x
  result = newStrLitNode($sym.owner.symKind)

macro isSameOwner(x, y: typed): untyped =
  result =
    if x.owner == y.owner: bindSym"true"
    else: bindSym"false"


static:
  doAssert checkOwner(foo, 0) == "nskModule"
  doAssert checkOwner(poo, 0) == "nskModule"
  doAssert checkOwner(poo, 1) == "nskProc"
  doAssert checkOwner(poo, 2) == "nskProc"
  doAssert checkOwner(poo, 3) == "nskModule"
  doAssert isSameOwner(foo, poo)
  doAssert isSameOwner(foo, echo) == false
  doAssert isSameOwner(poo, len) == false

#---------------------------------------------------------------

macro check_gen_proc(ex: typed): (bool, bool) =
  let lenChoice = bindsym"len"
  var is_equal = false 
  var is_instance_of = false 
  for child in lenChoice:
    if not is_equal:
      is_equal = ex[0] == child
    if not is_instance_of:
      is_instance_of = isInstantiationOf(ex[0], child)
         
  result = nnkTupleConstr.newTree(newLit(is_equal), newLit(is_instance_of))

# check that len(seq[int]) is not equal to bindSym"len", but is instance of it
let a = @[1,2,3]
assert: check_gen_proc(len(a)) == (false, true)
class="w"> char *maxlength; const char *md; const char *min; const char *name; int size; const char *src; const char *type; char *value; const char *width; int name_cs; /* charset handle for name */ int value_cs; /* charset handle for value */ const char *accept_cs; } InputFieldData; /* The OptionType structure is for a linked list of option entries */ typedef struct _OptionType { char *name; /* the name of the entry */ char *cp_submit_value; /* the value to submit */ int value_cs; /* charset value is in */ struct _OptionType *next; /* the next entry */ } OptionType; /* * The FormInfo structure is used to contain the form field data within each * anchor. A pointer to this structure is in the TextAnchor struct. */ typedef struct _FormInfo { char *name; /* the name of the link */ int number; /* which form is the link within */ int type; /* string, int, etc. */ char *value; /* user entered string data */ char *orig_value; /* the original value */ int size; /* width on the screen */ unsigned maxlength; /* max width of data */ int group; /* a group associated with the link * this is used for select's */ int num_value; /* value of the numerical fields */ int hrange; /* high numerical range */ int lrange; /* low numerical range */ OptionType *select_list; /* array of option choices */ char *submit_action; /* form's action */ int submit_method; /* form's method */ char *submit_enctype; /* form's entype */ char *submit_title; /* form's title */ BOOL no_cache; /* Always resubmit? */ char *cp_submit_value; /* option value to submit */ char *orig_submit_value; /* original submit value */ int size_l; /* The length of the option list */ int disabled; /* If YES, can't change values */ int name_cs; int value_cs; char *accept_cs; } FormInfo; /* * As structure for info associated with a form. There is some redundancy * here, this shouldn't waste too much memory since the total number of forms * (as opposed to form fields) per doc is expected to be rather small. More * things which are per form rather than per field could be moved here. - kw */ typedef struct _PerFormInfo { int number; /* form number, see GridText.c */ /* except for the last two, the following fields aren't actually used.. */ int disabled; /* If YES, can't change values */ struct _PerFormInfo *next; /* pointer to next form in doc */ int nfields; /* number of fields */ FormInfo *first_field; FormInfo *last_field; /* pointer to last field in form */ char *accept_cs; char *thisacceptcs; /* used during submit */ } PerFormInfo; #define HYPERTEXT_ANCHOR 1 #define INPUT_ANCHOR 2 /* forms mode input fields */ #define INTERNAL_LINK_ANCHOR 5 /* 1+4, can be used as bitflag... - kw */ typedef enum { F_UNKNOWN = 0, F_TEXT_TYPE, F_PASSWORD_TYPE, F_CHECKBOX_TYPE, F_RADIO_TYPE, F_SUBMIT_TYPE, F_RESET_TYPE, F_OPTION_LIST_TYPE, F_HIDDEN_TYPE, F_TEXTAREA_TYPE, F_RANGE_TYPE, F_FILE_TYPE, F_TEXT_SUBMIT_TYPE, F_IMAGE_SUBMIT_TYPE, F_KEYGEN_TYPE, F_BUTTON_TYPE } FieldTypes; #define F_TEXTLIKE(type) ((type) == F_TEXT_TYPE || \ (type) == F_TEXT_SUBMIT_TYPE || \ (type) == F_PASSWORD_TYPE || \ (type) == F_FILE_TYPE || \ (type) == F_TEXTAREA_TYPE) #define WWW_FORM_LINK_TYPE 1 #define WWW_LINK_TYPE 2 #define WWW_INTERN_LINK_TYPE 6 /* can be used as a bitflag... - kw */ #define LINK_LINE_FOUND 8 /* used in follow_link_number, others - kw */ #define LINK_DO_ARROWUP 16 /* returned by HTGetLinkOrFieldStart - kw */ /* #define different lynx modes */ #define NORMAL_LYNX_MODE 1 #define FORMS_LYNX_MODE 2 #define FIRST_ORDER 1 #define MIDDLE_ORDER 2 #define LAST_ORDER 3 /* in LYForms.c */ extern void show_formlink_statusline(const FormInfo * form, int for_what); #ifdef __cplusplus } #endif #endif /* HTFORMS_H */