source: dev/trunk/abdev/ProjectEditor/EndPairCommandComplement.cpp @ 366

Last change on this file since 366 was 366, checked in by dai_9181, 16 years ago

Tryスコープのコード補完機能のバグを修正(EndTryコード補間が過剰に行われていた)。
コンパイラのログ生成処理をきった。

File size: 12.1 KB
Line 
1#include "common.h"
2
3///////////////////////////////////////////////////////////////////
4// ここから、ペアステートメント補完を行うための関数郡
5///////////////////////////////////////////////////////////////////
6
7int GetStartCommandId_FromBuffer(char *buffer){
8    int i;
9    char temporary[VN_SIZE];
10
11    for(i=0;;i++){
12        if(!IsVariableChar(buffer[i])){
13            temporary[i]=0;
14            break;
15        }
16        temporary[i]=buffer[i];
17    }
18
19    if(lstrcmpi(temporary,"If")==0){
20        //If文の場合はブロック形式の有無を判定
21
22        int IsStr=0;
23        for(;;i++){
24            if(buffer[i]=='\"') IsStr^=1;
25            if((buffer[i]=='\''||IsCommandDelimitation(buffer,i))&&IsStr==0){
26                i--;
27                break;
28            }
29        }
30
31        while(buffer[i]==' '||buffer[i]=='\t') i--;
32
33        if(memicmp(buffer+i-3,"Then",4)==0){
34            //ブロック形式のIf
35            return COM_IF;
36        }
37        else{
38            //一行のみのIf
39            return 0;
40        }
41    }
42
43    if(lstrcmpi(temporary,"Virtual")==0||
44        lstrcmpi(temporary,"Override")==0||
45        lstrcmpi(temporary,"Static")==0){
46        if(temporary[0]=='s'||temporary[0]=='S')
47            i=7;
48        else if(temporary[0]=='v'||temporary[0]=='V')
49            i=8;
50        else i=9;
51
52        while(buffer[i]==' '||buffer[i]=='\t') i++;
53
54        int i2;
55        for(i2=0;;i++,i2++){
56            if(!IsVariableChar(buffer[i])){
57                temporary[i2]=0;
58                break;
59            }
60            temporary[i2]=buffer[i];
61        }
62
63        if(lstrcmpi(temporary,"Function")==0) return COM_FUNCTION;
64        if(lstrcmpi(temporary,"Sub")==0) return COM_SUB;
65        return 0;
66    }
67
68    if(lstrcmpi(temporary,"Class")==0) return COM_CLASS;
69    if(lstrcmpi(temporary,"Interface")==0) return COM_INTERFACE;
70    if(lstrcmpi(temporary,"Do")==0) return COM_DO;
71    if(lstrcmpi(temporary,"Enum")==0) return COM_ENUM;
72    if(lstrcmpi(temporary,"For")==0) return COM_FOR;
73    if(lstrcmpi(temporary,"Function")==0) return COM_FUNCTION;
74    if(lstrcmpi(temporary,"Namespace")==0) return COM_NAMESPACE;
75    if(lstrcmpi(temporary,"Select")==0) return COM_SELECT;
76    if(lstrcmpi(temporary,"Sub")==0) return COM_SUB;
77    if(lstrcmpi(temporary,"Try")==0) return COM_TRY;
78    if(lstrcmpi(temporary,"Type")==0) return COM_TYPE;
79    if(lstrcmpi(temporary,"While")==0) return COM_WHILE;
80    if(lstrcmpi(temporary,"With")==0) return COM_WITH;
81
82    return 0;
83}
84int GetEndCommandId_FromBuffer(char *buffer){
85    int i,i2;
86    char temporary[VN_SIZE];
87
88    for(i=0,i2=0;;i++,i2++){
89        if(!IsVariableChar(buffer[i])){
90            temporary[i2]=0;
91
92            if(lstrcmpi(temporary,"End")==0&&
93                (buffer[i]==' '||buffer[i]=='\t')){
94                while(buffer[i]==' '||buffer[i]=='\t') i++;
95                i--;
96                i2--;
97                continue;
98            }
99
100            break;
101        }
102        temporary[i2]=buffer[i];
103    }
104
105    if(lstrcmpi(temporary,"EndClass")==0) return COM_CLASS;
106    if(lstrcmpi(temporary,"EndInterface")==0) return COM_INTERFACE;
107    if(lstrcmpi(temporary,"Loop")==0) return COM_DO;
108    if(lstrcmpi(temporary,"EndEnum")==0) return COM_ENUM;
109    if(lstrcmpi(temporary,"Next")==0) return COM_FOR;
110    if(lstrcmpi(temporary,"EndFunction")==0) return COM_FUNCTION;
111    if(lstrcmpi(temporary,"EndIf")==0) return COM_IF;
112    if(lstrcmpi(temporary,"EndNamespace")==0) return COM_NAMESPACE;
113    if(lstrcmpi(temporary,"EndSelect")==0) return COM_SELECT;
114    if(lstrcmpi(temporary,"EndSub")==0) return COM_SUB;
115    if(lstrcmpi(temporary,"EndTry")==0) return COM_TRY;
116    if(lstrcmpi(temporary,"EndType")==0) return COM_TYPE;
117    if(lstrcmpi(temporary,"Wend")==0) return COM_WHILE;
118    if(lstrcmpi(temporary,"EndWith")==0) return COM_WITH;
119
120    return 0;
121}
122void GetNameOfEndCommand(int CmdId,char *buffer){
123    switch(CmdId){
124        case COM_CLASS:
125            lstrcpy(buffer,"End Class");
126            break;
127        case COM_INTERFACE:
128            lstrcpy(buffer,"End Interface");
129            break;
130        case COM_DO:
131            lstrcpy(buffer,"Loop");
132            break;
133        case COM_ENUM:
134            lstrcpy(buffer,"End Enum");
135            break;
136        case COM_FOR:
137            lstrcpy(buffer,"Next");
138            break;
139        case COM_FUNCTION:
140            lstrcpy(buffer,"End Function");
141            break;
142        case COM_IF:
143            lstrcpy(buffer,"End If");
144            break;
145        case COM_NAMESPACE:
146            lstrcpy(buffer,"End Namespace");
147            break;
148        case COM_SELECT:
149            lstrcpy(buffer,"End Select");
150            break;
151        case COM_SUB:
152            lstrcpy(buffer,"End Sub");
153            break;
154        case COM_TRY:
155            lstrcpy(buffer,"End Try");
156            break;
157        case COM_TYPE:
158            lstrcpy(buffer,"End Type");
159            break;
160        case COM_WHILE:
161            lstrcpy(buffer,"Wend");
162            break;
163        case COM_WITH:
164            lstrcpy(buffer,"End With");
165            break;
166    }
167}
168BOOL IsIntoStringQuotes(char *buffer,int i){
169    int i2;
170
171    i2=i;
172    while(i2&&buffer[i2]!='\n') i2--;
173    if(i2==-1) i2=0;
174    if(buffer[i2]=='\n') i2++;
175
176    int IsStr=0;
177    for(;i2<i;i2++){
178        if(buffer[i2]=='\"') IsStr^=1;
179    }
180    return IsStr;
181}
182BOOL GetEndPairCommandInfo(char *buffer,int p){
183    int i,i2,i3,CmdId;
184    char epcName[32];
185    char indent[255],LineNum;
186
187    int stack[255];
188    int sp;
189
190    CmdId=0;
191    LineNum=0;
192    sp=-1;
193
194    i=p;
195
196    //入力中の行を除く
197    for(i--;i>=0;i--){
198        i2=IsCommandDelimitation(buffer,i);
199        if(i2) break;
200    }
201
202    while(1){
203
204        //i2に一行前の先頭位置を格納
205        for(i--;i>=0;i--){
206            i2=IsCommandDelimitation(buffer,i);
207            if(i2){
208                if(IsIntoStringQuotes(buffer,i)){
209                    //文字列中の場合
210                    continue;
211                }
212
213                if(i2==1) i2=i+1;
214                else{
215                    i2=i+2;
216                    LineNum++;
217
218                    if(LineNum>pobj_nv->BackNum_PairStatementComplement){
219                        //設定された行数を超えた場合
220                        return 0;
221                    }
222                }
223
224                break;
225            }
226        }
227        if(i==-1) i2=i+1;
228
229        //インデント文字列をindentにコピー
230        for(i3=0;;i2++,i3++){
231            if(buffer[i2]!='\t'){
232                indent[i3]=0;
233                break;
234            }
235            indent[i3]=buffer[i2];
236        }
237
238        //空白文字を飛び越す
239        while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
240
241        //終了コマンドを取得(End Class、End Sub、Next、Wendなど…)
242        i3=GetEndCommandId_FromBuffer(buffer+i2);
243        if(i3){
244            sp++;
245            stack[sp]=i3;
246        }
247
248        //開始コマンドを取得(Class、Sub、For、Whileなど…)
249        i3=GetStartCommandId_FromBuffer(buffer+i2);
250        if(i3){
251            if(sp==-1){
252                CmdId=i3;
253                break;
254            }
255
256            if(stack[sp]!=i3) return 0;
257            sp--;
258        }
259
260        if(i<=0) break;
261    }
262
263    if(!CmdId) return 0;
264
265    extern HANDLE hHeap;
266    extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
267    if(CmdId==COM_IF){
268        //Else、ElseIf、End Ifをリストに追加
269
270        ///////////////////////
271        // 補完情報
272        ///////////////////////
273
274        ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*2);
275        ComplementWndInfo.MemberNum=2;
276
277        ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,5);
278        lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"Else");
279        ComplementWndInfo.pMemberInfo[0].dwProc=0;
280        ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
281
282        ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,7);
283        lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"End If");
284        ComplementWndInfo.pMemberInfo[1].dwProc=0;
285        ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
286    }
287    else if(CmdId==COM_CLASS){
288        ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*4);
289        ComplementWndInfo.MemberNum=4;
290
291        ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,10);
292        lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"End Class");
293        ComplementWndInfo.pMemberInfo[0].dwProc=0;
294        ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
295
296        ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,8);
297        lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"Private");
298        ComplementWndInfo.pMemberInfo[1].dwProc=0;
299        ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
300
301        ComplementWndInfo.pMemberInfo[2].pName=(char *)HeapAlloc(hHeap,0,10);
302        lstrcpy(ComplementWndInfo.pMemberInfo[2].pName,"Protected");
303        ComplementWndInfo.pMemberInfo[2].dwProc=0;
304        ComplementWndInfo.pMemberInfo[2].dwAccess=ACCESS_PAIRCOMMAND;
305
306        ComplementWndInfo.pMemberInfo[3].pName=(char *)HeapAlloc(hHeap,0,7);
307        lstrcpy(ComplementWndInfo.pMemberInfo[3].pName,"Public");
308        ComplementWndInfo.pMemberInfo[3].dwProc=0;
309        ComplementWndInfo.pMemberInfo[3].dwAccess=ACCESS_PAIRCOMMAND;
310    }
311    else if(CmdId==COM_SELECT){
312        ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*4);
313        ComplementWndInfo.MemberNum=2;
314
315        ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,10);
316        lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"End Select");
317        ComplementWndInfo.pMemberInfo[0].dwProc=0;
318        ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
319
320        ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,8);
321        lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"Case");
322        ComplementWndInfo.pMemberInfo[1].dwProc=0;
323        ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
324    }
325    else if(CmdId==COM_TRY){
326        ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*4);
327        ComplementWndInfo.MemberNum=3;
328
329        ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,10);
330        lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"End Try");
331        ComplementWndInfo.pMemberInfo[0].dwProc=0;
332        ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
333
334        ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,10);
335        lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"Catch");
336        ComplementWndInfo.pMemberInfo[1].dwProc=0;
337        ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
338
339        ComplementWndInfo.pMemberInfo[2].pName=(char *)HeapAlloc(hHeap,0,8);
340        lstrcpy(ComplementWndInfo.pMemberInfo[2].pName,"Finally");
341        ComplementWndInfo.pMemberInfo[2].dwProc=0;
342        ComplementWndInfo.pMemberInfo[2].dwAccess=ACCESS_PAIRCOMMAND;
343    }
344    else{
345        //その他のコマンド
346
347        //エンドペアステートメントの名前を取得
348        GetNameOfEndCommand(CmdId,epcName);
349
350
351        ///////////////////////
352        // 補完情報
353        ///////////////////////
354
355        ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO));
356        ComplementWndInfo.MemberNum=1;
357
358        ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,lstrlen(epcName)+1);
359        lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,epcName);
360
361        ComplementWndInfo.pMemberInfo[0].dwProc=0;
362        ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
363    }
364    lstrcpy(ComplementWndInfo.szIndent,indent);
365
366
367    return 1;
368}
369BOOL IsNeedNewIndentCommand(char *name){
370    if(lstrcmpi(name,"Case")==0) return 1;
371    return 0;
372}
373
374
375
376///////////////////////////////////////////////
377// Withで構成されるオブジェクト識別子を取得
378///////////////////////////////////////////////
379
380void GetWithObjectVariable(char *buffer,int p,char *pObjectVar){
381    int i,i2,i3,i4,CmdId;
382    char LineNum;
383    char temporary[VN_SIZE];
384
385    int stack[255];
386    int sp;
387
388    CmdId=0;
389    LineNum=0;
390    sp=-1;
391    pObjectVar[0]=0;
392
393    i=p;
394
395    //入力中の行を除く
396    for(i--;i>=0;i--){
397        i2=IsCommandDelimitation(buffer,i);
398        if(i2) break;
399    }
400
401    while(1){
402
403        //i2に一行前の先頭位置を格納
404        for(i--;i>=0;i--){
405            i2=IsCommandDelimitation(buffer,i);
406            if(i2){
407                if(i2==1) i2=i+1;
408                else{
409                    i2=i+2;
410                    LineNum++;
411
412                    if(LineNum>pobj_nv->BackNum_PairStatementComplement){
413                        //設定された行数を超えた場合
414                        return;
415                    }
416                }
417
418                break;
419            }
420        }
421        if(i==-1) i2=i+1;
422
423        //インデントを飛び越す
424        while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
425
426        //終了コマンドを取得(End Class、End Sub、Next、Wendなど…)
427        CmdId=GetEndCommandId_FromBuffer(buffer+i2);
428        if(CmdId){
429            sp++;
430            stack[sp]=CmdId;
431        }
432
433        //開始コマンドを取得(Class、Sub、For、Whileなど…)
434        CmdId=GetStartCommandId_FromBuffer(buffer+i2);
435        if(CmdId){
436            if(sp==-1){
437                if(CmdId==COM_WITH){
438                    //オブジェクト識別子を付加
439                    i2+=5;
440                    while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
441
442                    for(i3=0;;i2++,i3++){
443                        if(buffer[i2]=='-'&&buffer[i2+1]=='>'){
444                            temporary[i3++]=buffer[i2++];
445                            temporary[i3]=buffer[i2];
446                            continue;
447                        }
448                        if(buffer[i2]=='['){
449                            i4=GetStringInBracket(temporary+i3,buffer+i2);
450                            i2+=i4-1;
451                            i3+=i4-1;
452                            continue;
453                        }
454                        if(buffer[i2]=='('){
455                            i4=GetStringInPare(temporary+i3,buffer+i2);
456                            i2+=i4-1;
457                            i3+=i4-1;
458                            continue;
459                        }
460                        if(!(IsVariableChar(buffer[i2])||buffer[i2]=='.')){
461                            temporary[i3]=0;
462                            break;
463                        }
464                        temporary[i3]=buffer[i2];
465                    }
466                    lstrcat(temporary,pObjectVar);
467                    lstrcpy(pObjectVar,temporary);
468                }
469            }
470            else{
471                if(stack[sp]!=CmdId){
472                    pObjectVar[0]=0;
473                    break;
474                }
475                sp--;
476            }
477        }
478
479        if(i<=0) break;
480    }
481}
Note: See TracBrowser for help on using the repository browser.