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
RevLine 
[3]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;
[118]74 if(lstrcmpi(temporary,"Namespace")==0) return COM_NAMESPACE;
[3]75 if(lstrcmpi(temporary,"Select")==0) return COM_SELECT;
76 if(lstrcmpi(temporary,"Sub")==0) return COM_SUB;
[364]77 if(lstrcmpi(temporary,"Try")==0) return COM_TRY;
[3]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;
[118]112 if(lstrcmpi(temporary,"EndNamespace")==0) return COM_NAMESPACE;
[3]113 if(lstrcmpi(temporary,"EndSelect")==0) return COM_SELECT;
114 if(lstrcmpi(temporary,"EndSub")==0) return COM_SUB;
[366]115 if(lstrcmpi(temporary,"EndTry")==0) return COM_TRY;
[3]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;
[118]145 case COM_NAMESPACE:
146 lstrcpy(buffer,"End Namespace");
147 break;
[3]148 case COM_SELECT:
149 lstrcpy(buffer,"End Select");
150 break;
151 case COM_SUB:
152 lstrcpy(buffer,"End Sub");
153 break;
[364]154 case COM_TRY:
155 lstrcpy(buffer,"End Try");
156 break;
[3]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 }
[364]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 }
[3]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.