source: dev/trunk/ab5.0/abdev/ProjectEditor/CClassInfo.cpp @ 440

Last change on this file since 440 was 81, checked in by dai_9181, 17 years ago

プロジェクトを開いていないときでもクラスビューの機能を有効にした。

File size: 6.2 KB
Line 
1#include "Common.h"
2
3#if defined(JPN)
4//日本語
5#include "pj_msg_jpn.h"
6#else
7//英語
8#include "pj_msg_eng.h"
9#endif
10
11
12CClassInfo::CClassInfo(){
13    pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,1);
14    MemberNum=0;
15}
16CClassInfo::~CClassInfo(){
17    int i;
18    for(i=0;i<MemberNum;i++){
19        HeapDefaultFree(pMemberInfo[i].pName);
20    }
21    HeapDefaultFree(pMemberInfo);
22}
23
24int CClassInfo::Analyze(char *pBuf,int *p){
25    int i,i2;
26    char temporary[VN_SIZE];
27
28    i=*p;
29
30    DWORD dwAccess;
31
32    //種類を取得
33    DWORD dwClassType;
34    if(memicmp(pBuf+i,"Class",5)==0){
35        dwClassType=ESC_CLASS;
36        i+=5;
37
38        dwAccess=ACCESS_PRIVATE;
39    }
40    else if(memicmp(pBuf+i,"Type",4)==0){
41        dwClassType=ESC_TYPE;
42        i+=4;
43
44        dwAccess=ACCESS_PUBLIC;
45    }
46    else if(memicmp(pBuf+i,"Interface",9)==0){
47        dwClassType=ESC_INTERFACE;
48        i+=9;
49
50        dwAccess=ACCESS_PUBLIC;
51    }
52    else return 0;
53    JumpBlank(pBuf,&i);
54
55
56    //クラス名を取得
57    for(i2=0;;i++,i2++){
58        if(!(IsVariableChar(pBuf[i])||pBuf[i]=='~')){
59            ClassName[i2]=0;
60            break;
61        }
62        ClassName[i2]=pBuf[i];
63    }
64    JumpBlank(pBuf,&i);
65
66
67    //メンバ変数、関数を取得
68    while(1){
69        if(pBuf[i]=='\0') break;
70        if(memicmp(pBuf+i,"End",3)==0){
71            /*  End Class
72                End Type
73                の検出 */
74            i2=i+3;
75            while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
76
77            if(memicmp(pBuf+i2,"Class",5)==0&&(!IsVariableChar(pBuf[i2+5]))||
78                memicmp(pBuf+i2,"Interface",9)==0&&(!IsVariableChar(pBuf[i2+9]))||
79                memicmp(pBuf+i2,"Type",4)==0&&(!IsVariableChar(pBuf[i2+4]))){
80                while(!IsCommandDelimitation(pBuf,i2)) i2++;
81                i=i2;
82                break;
83            }
84        }
85
86        // Static/Constを飛ばす
87        if( memicmp(pBuf+i,"Static",6)==0 ){
88            // Static
89            i+=6;
90            while(pBuf[i]==' '||pBuf[i]=='\t') i++;
91        }
92        if(pBuf[i]=='c'||pBuf[i]=='C'){
93            // Const
94            i+=5;
95            while(pBuf[i]==' '||pBuf[i]=='\t') i++;
96        }
97
98        DWORD dwProc;
99        if(memicmp(pBuf+i,"Abstract",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
100            memicmp(pBuf+i,"Virtual",7)==0&&(pBuf[i+7]==' '||pBuf[i+7]=='\t')||
101            memicmp(pBuf+i,"Override",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
102            memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
103            memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){
104            //メンバ関数のとき
105
106            if(pBuf[i]=='a'||pBuf[i]=='A'){
107                i+=9;
108                dwProc=ESC_ABSTRACT;
109
110                while(pBuf[i]==' '||pBuf[i]=='\t') i++;
111                if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
112                else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
113            }
114            else if(pBuf[i]=='v'||pBuf[i]=='V'){
115                i+=8;
116                dwProc=ESC_VIRTUAL;
117
118                while(pBuf[i]==' '||pBuf[i]=='\t') i++;
119                if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
120                else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
121            }
122            else if(pBuf[i]=='o'||pBuf[i]=='O'){
123                i+=9;
124                dwProc=ESC_OVERRIDE;
125
126                while(pBuf[i]==' '||pBuf[i]=='\t') i++;
127                if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
128                else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
129            }
130            else if(pBuf[i]=='f'||pBuf[i]=='F'){
131                i+=9;
132                dwProc=ESC_FUNCTION;
133            }
134            else if(pBuf[i]=='s'||pBuf[i]=='S'){
135                i+=4;
136                dwProc=ESC_SUB;
137            }
138
139            while(pBuf[i]==' '||pBuf[i]=='\t') i++;
140        }
141        else{
142            //メンバ変数のとき
143            dwProc=0;
144        }
145
146        int code_pos;
147        code_pos=i;
148
149        //変数名または関数名を取得
150        if(pBuf[i]=='~'){
151            temporary[0]='~';
152            i2=1;
153            i++;
154        }
155        else i2=0;
156        for(;;i++,i2++){
157            if(!IsVariableChar(pBuf[i])){
158                temporary[i2]=0;
159                break;
160            }
161            temporary[i2]=pBuf[i];
162        }
163
164        //次の行をサーチ
165        for(;;i++){
166            if(pBuf[i]=='\0') break;
167            if(pBuf[i]=='\''||(pBuf[i]=='/'&&pBuf[i+1]=='*')){
168                //コメント中
169                JumpBlank(pBuf,&i);
170                break;
171            }
172            i2=IsCommandDelimitation(pBuf,i);
173            if(i2){
174                i+=i2;
175                break;
176            }
177        }
178        JumpBlank(pBuf,&i);
179
180        if(lstrcmpi(temporary,"Inherits")==0){
181            //継承指定の場合(ツリーに反映すべきデータはないので無視する)
182            continue;
183        }
184
185        //アクセスを変更
186        if(lstrcmpi(temporary,"Private")==0){
187            dwAccess=ACCESS_PRIVATE;
188            continue;
189        }
190        if(lstrcmpi(temporary,"Public")==0){
191            dwAccess=ACCESS_PUBLIC;
192            continue;
193        }
194        if(lstrcmpi(temporary,"Protected")==0){
195            dwAccess=ACCESS_PROTECTED;
196            continue;
197        }
198
199        //重複チェック(オーバーライド関数を考慮)
200        for(i2=0;i2<MemberNum;i2++){
201            if(lstrcmp(pMemberInfo[i2].pName,temporary)==0){
202                lstrcat(temporary," ");
203                break;
204            }
205        }
206
207        pMemberInfo=
208            (MEMBERINFO *)HeapReAlloc(hHeap,
209                0,
210                pMemberInfo,
211                (MemberNum+1)*sizeof(MEMBERINFO));
212
213        //メンバ名
214        pMemberInfo[MemberNum].pName=
215            (char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
216        lstrcpy(pMemberInfo[MemberNum].pName,
217            temporary);
218
219        //メンバの種類(変数、Virtual、Sub、Function)
220        pMemberInfo[MemberNum].dwProc=dwProc;
221
222        //アクセシビリティ
223        pMemberInfo[MemberNum].dwAccess=dwAccess;
224
225        //コードの位置
226        pMemberInfo[MemberNum].code_pos=code_pos;
227
228        MemberNum++;
229
230        if(dwProc){
231            //Abstract定義以外はEnd Sub、End Functionをサーチする
232            if(dwProc==ESC_ABSTRACT) continue;
233            if(dwClassType==ESC_INTERFACE) continue;
234
235            while(1){
236                if(pBuf[i]=='\0'){
237                    i2=0;
238                    break;
239                }
240
241                if(memicmp(pBuf+i,"End",3)==0){
242                    /*  End Sub
243                        End Function
244                        の検出 */
245                    i+=3;
246                    while(pBuf[i]==' '||pBuf[i]=='\t') i++;
247
248                    if(memicmp(pBuf+i,"Sub",3)==0&&(!IsVariableChar(pBuf[i+3]))||
249                        memicmp(pBuf+i,"Function",8)==0&&(!IsVariableChar(pBuf[i+8]))){
250                        i2=1;
251                        break;
252                    }
253
254                    if(memicmp(pBuf+i,"Class",5)==0&&(!IsVariableChar(pBuf[i+5]))||
255                        memicmp(pBuf+i,"Interface",9)==0&&(!IsVariableChar(pBuf[i+9]))||
256                        memicmp(pBuf+i,"Type",4)==0&&(!IsVariableChar(pBuf[i+4]))){
257                        i2=0;
258                        break;
259                    }
260                }
261
262                //次の行をサーチ
263                for(;;i++){
264                    if(pBuf[i]=='\0') break;
265                    i2=IsCommandDelimitation(pBuf,i);
266                    if(i2){
267                        i+=i2;
268                        break;
269                    }
270                }
271                JumpBlank(pBuf,&i);
272            }
273
274            if(i2==0){
275                //コード解析が不正に終了
276                *p=i;
277                return 0;
278            }
279
280            //次の行をサーチ
281            for(;;i++){
282                if(pBuf[i]=='\0') break;
283                i2=IsCommandDelimitation(pBuf,i);
284                if(i2){
285                    i+=i2;
286                    break;
287                }
288            }
289            JumpBlank(pBuf,&i);
290        }
291    }
292
293    *p=i;
294
295    return 1;
296}
297
Note: See TracBrowser for help on using the repository browser.