Annotation of parser3/src/types/pa_vclass.h, revision 1.21
1.13 paf 1: /** @file
1.14 paf 2: Parser: @b class parser class decl.
1.13 paf 3:
1.1 paf 4: Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
1.21 ! paf 5: Author: Alexander Petrosyan <paf@design.ru> (http://paf.design.ru)
1.1 paf 6:
1.21 ! paf 7: $Id: pa_vclass.h,v 1.20 2001/10/22 08:27:44 parser Exp $
1.1 paf 8: */
9:
10: #ifndef PA_VCLASS_H
11: #define PA_VCLASS_H
12:
1.8 paf 13: #include "pa_vstateless_class.h"
1.18 parser 14: //#include "pa_vhash.h"
1.1 paf 15: #include "pa_vjunction.h"
16:
1.13 paf 17: /** stores
18: - base: VClass::base()
1.16 paf 19: - static fields: VClass::ffields
1.13 paf 20: */
1.8 paf 21: class VClass : public VStateless_class {
1.1 paf 22: public: // Value
23:
24: const char *type() const { return "class"; }
1.20 parser 25:
26: /// VClass: true
27: Value *as_expr_result(bool) { return NEW VBool(pool(), as_bool()); }
28: /// VClass: true
29: bool as_bool() const { return true; }
1.9 paf 30:
1.16 paf 31: // VClass: (field)=STATIC value;(method)=method_ref with self=object_class
1.8 paf 32: Value *get_element(const String& aname) {
1.16 paf 33: // $field=static field
34: if(Value *result=get_field(aname))
1.8 paf 35: return result;
1.16 paf 36:
1.17 parser 37: // $CLASS,$method
1.16 paf 38: return VStateless_class::get_element(aname);
1.8 paf 39: }
1.1 paf 40:
1.16 paf 41: // VClass: (field)=value - static values only
1.11 paf 42: void put_element(const String& name, Value *value) {
43: set_field(name, value);
44: }
1.1 paf 45:
46: public: // usage
47:
1.8 paf 48: VClass(Pool& apool) : VStateless_class(apool),
49: ffields(apool) {
1.1 paf 50: }
51:
1.12 paf 52: private:
53:
1.1 paf 54: void set_field(const String& name, Value *value) {
1.12 paf 55: //if(value) // used in ^process to temporarily remove @main
56: //value->set_name(name);
1.1 paf 57: if(fbase && fbase->replace_field(name, value))
58: return;
59:
60: ffields.put(name, value);
61: }
62:
63: Value *get_field(const String& name) {
64: Value *result=static_cast<Value *>(ffields.get(name));
65: if(!result && fbase)
66: result=fbase->get_field(name);
67: return result;
68: }
1.8 paf 69:
70: protected:
1.1 paf 71:
72: bool replace_field(const String& name, Value *value) {
73: return
74: (fbase && fbase->replace_field(name, value)) ||
75: ffields.put_replace(name, value);
76: }
1.4 paf 77:
1.1 paf 78: private:
79:
80: Hash ffields;
81: };
82:
83: #endif
E-mail: