source: dev/trunk/abdev/BasicCompiler_Common/error.cpp @ 351

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

インターフェイスメソッドはオーバーライド対象外とした

File size: 24.6 KB
Line 
1#include "stdafx.h"
2
3#include <jenga/include/smoothie/LexicalAnalysis.h>
4
5#include <Program.h>
6#include <Compiler.h>
7
8#include "../BasicCompiler_Common/common.h"
9
10BOOL GetErrorMsg(int num,const char *KeyWord,char *msg,int pos){
11    extern HANDLE hHeap;
12    int i2;
13    char temporary[64];
14
15    char tempKeyWord[1024];
16    if(KeyWord){
17        lstrcpy(tempKeyWord,KeyWord);
18        for(i2=0;;i2++){
19            if(tempKeyWord[i2]=='\0') break;
20            if(tempKeyWord[i2]==1){
21                GetDefaultNameFromES(tempKeyWord[i2+1],temporary);
22                SlideString(tempKeyWord+i2+2,lstrlen(temporary)-2);
23                memcpy(tempKeyWord+i2,temporary,lstrlen(temporary));
24            }
25        }
26    }
27    else{
28        lstrcpy(tempKeyWord,"");
29    }
30
31    if(num==-1||num==-2) lstrcpy(msg,tempKeyWord);  //部分エラー
32
33    if(num==3){
34        temporary[0]=tempKeyWord[0];
35        for(i2=1;;i2++){
36            if((!IsVariableChar(tempKeyWord[i2]))||i2>=255){
37                temporary[i2]=0;
38                break;
39            }
40            temporary[i2]=tempKeyWord[i2];
41        }
42
43        extern char **SynonymErrorWords;
44        extern int SynonymErrorNum;
45        for(i2=0;i2<SynonymErrorNum;i2++){
46            if(lstrcmp(SynonymErrorWords[i2],temporary)==0) return 0;
47        }
48
49#if defined(JPN)
50        //日本語
51        sprintf(msg,"\"%s\" 無効な識別子です",temporary);
52#else
53        //英語
54        sprintf(msg,"\"%s\" Invalid identifier.",temporary);
55#endif
56
57        //重複エラー情報を追加
58        SynonymErrorWords=(char **)HeapReAlloc(hHeap,0,SynonymErrorWords,(SynonymErrorNum+1)*sizeof(char *));
59        SynonymErrorWords[SynonymErrorNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
60        lstrcpy(SynonymErrorWords[SynonymErrorNum],temporary);
61        SynonymErrorNum++;
62    }
63    if(num==30){
64#if defined(JPN)
65        //日本語
66        if(temporary[0]) sprintf(msg,"\"%s\" の使い方が不正です",tempKeyWord);
67        else lstrcpy(msg,"文法が間違っています");
68#else
69        //英語
70        if(temporary[0]) sprintf(msg,"How to use the \"%s\" is wrong.",tempKeyWord);
71        else lstrcpy(msg,"Syntax Error.");
72#endif
73    }
74
75
76    /////////////////////
77    // ワーニングエラー
78    /////////////////////
79#if defined(JPN)
80    ////////////////////
81    //日本語
82    ////////////////////
83    if(num==-101) sprintf(msg,"[警告] %sに強制変換されています。データが失われる可能性があります。",tempKeyWord);
84    if(num==-102) sprintf(msg,"[警告] %sに強制変換されています。",tempKeyWord);
85    if(num==-103) sprintf(msg,"[警告] \"%s\" 型が指定されていません。Double型として扱います。",tempKeyWord);
86    if(num==-104) sprintf(msg,"[警告] \"%s\" 戻り値の型が指定されていません。Double型として扱います。",tempKeyWord);
87    if(num==-105) sprintf(msg,"[警告] 一時オブジェクトの解放を行えません。キャスト用オブジェクトを用意してください。",tempKeyWord);
88    if(num==-106) sprintf(msg,"[警告] DLLファイル \"%s\" が見つかりません。",tempKeyWord);
89    if(num==-107) sprintf(msg,"[警告] DLL関数 \"%s\" を参照できません。",tempKeyWord);
90    if(num==-120) sprintf(msg,"[警告] VarPtr関数の引数にオブジェクト インスタンスが指定されました。オブジェクトの先頭アドレスを取得したいときはObjPtr関数に切り替えをお願いします。m(__)m(この警告はVarPtr→ObjPtrへの切り替えが完了したら消します(切り替えは \"適材箇所に限り\" ですので、ご注意ください!))",tempKeyWord);
91#else
92#endif
93
94
95    ///////////////
96    // 一般エラー
97    ///////////////
98
99#if defined(JPN)
100    ////////////////////
101    //日本語
102    ////////////////////
103    if(num==1) lstrcpy(msg,"文法が間違っています。");
104    if(num==2) sprintf(msg,"左のオペランドが、左辺値になっていません。");
105    //num==3は予約されています
106    if(num==4) sprintf(msg,"%sの相互関係が一致しません。",tempKeyWord);
107    if(num==5) sprintf(msg,"ダブルクォートの数が一致しません。");
108    if(num==6) sprintf(msg,"\"%s\" ジャンプ先が不正です。",tempKeyWord);
109    if(num==7) lstrcpy(msg,"DLL名が長すぎます(拡張子を含め、16文字以下にして下さい)。");
110    if(num==8) lstrcpy(msg,"コンパイラが認識できない文字コードが含まれています。");
111    if(num==9) sprintf(msg,"型が違います。");
112    if(num==10) sprintf(msg,"\"%s\" のパラメータ指定が間違っています。",tempKeyWord);
113    if(num==11) sprintf(msg,"\"%s\" 型が違います。",tempKeyWord);
114    if(num==12) sprintf(msg,"\"%s\" の使い方が不正です。",tempKeyWord);
115    if(num==13) sprintf(msg,"\"%s\" を参照できません。",tempKeyWord);
116    if(num==14) sprintf(msg,"\"%s\" 配列指定が不正です。",tempKeyWord);
117    if(num==15) sprintf(msg,"\"%s\" はすでに定義されています。",tempKeyWord);
118    if(num==16) sprintf(msg,"\"%s\" 配列、またはポインタ以外の変数に添え字が指定されています。",tempKeyWord);
119    if(num==17) sprintf(msg,"リソース データが不正です。");
120    if(num==18) sprintf(msg,"\"%s\"はポインタ変数型です。文字列演算を指定することはできません。",tempKeyWord);
121    if(num==19) sprintf(msg,"\"%s\"は値参照型です。ByVal指定することはできません。",tempKeyWord);
122    if(num==20) lstrcpy(msg,"全角スペースが含まれています(全角スペースはコンパイラが認識できないので、半角スペースまたはタブ文字にしてください)。");
123    if(num==21) sprintf(msg,"If制御のブロック指定が不正です。");
124    if(num==22) sprintf(msg,"\"%s\" に対する \"End %s\" が見つかりません。",tempKeyWord,tempKeyWord);
125    if(num==23) sprintf(msg,"リソース ファイル \"%s\" の読み込みに失敗。",tempKeyWord);
126    if(num==24) lstrcpy(msg,"Export指定の関数のパラメータには実体オブジェクトを利用することはできません(BytePtr型などを利用して下さい)。");
127    if(num==25) sprintf(msg,"DLL関数にオブジェクトを引き渡すことはできません(%s)。",tempKeyWord);
128    if(num==26) sprintf(msg,"\"%s\" 戻り値の型が指定されていません。",tempKeyWord);
129    if(num==27) sprintf(msg,"\"%s\" は定義されていません。",tempKeyWord);
130    if(num==28) sprintf(msg,"構造体パラメータは参照渡しにしてください(%s)。",tempKeyWord);
131    if(num==29) sprintf(msg,"配列ポインタを要素と同時に引渡すときは、ポインタ参照(ByRef)にしてください。");
132    //num==30は予約されています
133    if(num==31) sprintf(msg,"\"%s\" は構造体です(メンバの参照はピリオド \".\" で区切ってください)。",tempKeyWord);
134    if(num==32) sprintf(msg,"\"%s\" は構造体ポインタです(メンバの参照は \"->\" で区切ってください)。",tempKeyWord);
135    if(num==33) sprintf(msg,"定数式にリテラル値、または定数以外のものが含まれています。");
136    if(num==34) sprintf(msg,"定数はモジュールレベルで宣言して下さい。");
137    if(num==38) sprintf(msg,"\"%s\" 戻り値が存在しないプロシージャです。",tempKeyWord);
138    if(num==39) sprintf(msg,"\"%s\" はオブジェクトポインタではありません(\"->\" 参照はできません)。",tempKeyWord);
139    if(num==40) lstrcpy(msg,"DLL関数の戻り値としてオブジェクトを受け取ることはできません。");
140    if(num==41) lstrcpy(msg,"初期データが不正です。");
141    if(num==42) lstrcpy(msg,"閉じカッコ \")\" の後に不正な文字が含まれています。");
142    if(num==43) lstrcpy(msg,"ダブルクォートの後に不正な文字が含まれています。");
143    if(num==45) sprintf(msg,"実数に対して \"%s\" 演算子は利用できません。",tempKeyWord);
144    if(num==46) lstrcpy(msg,"配列の添え字に整数以外の値が与えられています。");
145    if(num==47) lstrcpy(msg,"As演算子の右辺値に型名以外の識別子が指定されています。");
146    if(num==48) sprintf(msg,"%s演算子に対して型名が指定されています。",tempKeyWord);
147    if(num==49) lstrcpy(msg,"添え字に整数以外の型が指定されています。");
148    if(num==50) sprintf(msg,"%sに変換できません。",tempKeyWord);
149    if(num==51) lstrcpy(msg,"オブジェクト、構造体のアラインメント値は1,2,4,8,16のいずれかでなければなりません。");
150    if(num==52) sprintf(msg,"\"%s\" オーバーロードを解決できません。",tempKeyWord);
151    if(num==53) sprintf(msg,"\"%s\" 出力ファイルの書き込みに失敗しました。実行されている可能性があります。",tempKeyWord);
152    if(num==54) sprintf(msg,"対応する%sが存在しません。",tempKeyWord);
153    if(num==55) sprintf(msg,"\"%s\" は対応するForステートメントで利用されるカウンタ変数ではありません。",tempKeyWord);
154    if(num==56) lstrcpy(msg,"ゼロ割りが行われました。");
155    if(num==57) lstrcpy(msg,"8進数のリテラル表記が不正です。");
156    if(num==58) lstrcpy(msg,"16進数のリテラル表記が不正です。");
157    if(num==59) sprintf(msg,"マニフェスト ファイル \"%s\" の読み込みに失敗。",tempKeyWord);
158    if(num==60) lstrcpy(msg,"Staticステートメントはグローバル領域では使用できません。");
159    if(num==61) sprintf(msg,"\"%s\" は定数です。書き込みアクセスはできません。",tempKeyWord);
160    if(num==62) sprintf(msg,"グローバル領域でのReturnは禁止されています。",tempKeyWord);
161    if(num==63) lstrcpy(msg,"名前空間が正しく閉じられていません。");
162    if(num==64) sprintf(msg,"\"%s\" 無効な名前空間です。",tempKeyWord);
163    if(num==65) sprintf(msg,"ローカル領域で%sは使用できません。",tempKeyWord);
164    if(num==66) sprintf(msg,"%s 要求されている関数ポインタのパラメータまたは戻り値が一致しません。", tempKeyWord );
165    if(num==67) sprintf(msg,"%s 要求されているデリゲートのパラメータまたは戻り値が一致しません。", tempKeyWord );
166
167
168    //オブジェクト関連
169    if(num==102) sprintf(msg,"\"%s\" オブジェクトは定義されていません。",tempKeyWord);
170    if(num==103) sprintf(msg,"\"%s\" メンバは定義されていません。",tempKeyWord);
171    if(num==104) sprintf(msg,"\"%s\" 参照方法が違います。",tempKeyWord);
172    if(num==105) sprintf(msg,"\"%s\" 自身のクラスを継承することはできません。",tempKeyWord);
173    if(num==106) sprintf(msg,"\"%s\" 存在しないクラスです。",tempKeyWord);
174    if(num==107) sprintf(msg,"Privateメンバ \"%s\" にアクセスすることはできません。",tempKeyWord);
175    if(num==108) sprintf(msg,"Protectedメンバ \"%s\" にアクセスすることはできません。",tempKeyWord);
176    if(num==109) sprintf(msg,"Privateメンバ関数 \"%s\" を呼び出すことはできません。",tempKeyWord);
177    if(num==110) sprintf(msg,"Protectedメンバ関数 \"%s\" を呼び出すことはできません。",tempKeyWord);
178    if(num==111) lstrcpy(msg,"InheritsはClass定義内の先頭に記述する必要があります。");
179    if(num==112) sprintf(msg,"\"%s\" はクラス型ではないため、初期パラメータを指定することはできません。",tempKeyWord);
180    if(num==113) sprintf(msg,"\"%s\" コンストラクタへ渡すパラメータが不正です。",tempKeyWord);
181    if(num==114) lstrcpy(msg,"デストラクタはパラメータを持てません。");
182    if(num==115) lstrcpy(msg,"コンストラクタ及びデストラクタは戻り値を持てません。");
183    //if(num==116) lstrcpy(msg,"コンストラクタ及びデストラクタはパブリックアクセスにしなければなりません。");
184    if(num==117) lstrcpy(msg,"デストラクタの名前が \"~クラス名\" になっていません。");
185    if(num==118) lstrcpy(msg,"参照する基底クラスが存在しません。");
186    if(num==119) sprintf(msg,"\"%s\" メンバは基底クラスで定義されていません。",tempKeyWord);
187    if(num==120) lstrcpy(msg,"デストラクトするオブジェクトの型が不明です。");
188    if(num==121) lstrcpy(msg,"New演算子にはクラス以外の型を指定できません。");
189    if(num==122) lstrcpy(msg,"Delete演算子にポインタ以外の型が指定されています。");
190    if(num==123) lstrcpy(msg,"ループ継承が行われました。");
191    if(num==124) lstrcpy(msg,"循環参照が行われました。");
192    if(num==125) sprintf(msg,"\"%s\" は抽象クラスです。インスタンス化することはできません。",tempKeyWord);
193    if(num==126) lstrcpy(msg,"オペレータのオーバーロードをクラスの外で行うことはできません。");
194    if(num==127) lstrcpy(msg,"Override修飾子の指定が無い状況でオーバーライドを行うことはできません。");
195    if(num==128) lstrcpy(msg,"オーバーライドを行うときはアクセシビリティを同一にしなければなりません。");
196    if(num==129) sprintf(msg,"静的メンバ \"%s\" は定義されていません。",tempKeyWord);
197    if(num==130) sprintf(msg,"\"%s\" はオブジェクト定数です。書き込みアクセスはできません。",tempKeyWord);
198    if(num==131) lstrcpy(msg,"Const定義されたメソッド内でクラスメンバへの書き込みアクセスはできません。");
199    if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。");
200    if(num==133) lstrcpy(msg,"Thisに代入はできません。");
201    if(num==134) lstrcpy( msg,"ObjPtr関数にはオブジェクト インスタンス以外を指定できません。" );
202    if(num==135) lstrcpy( msg, "クラスまたはインターフェイス以外の型を継承元として指定することはできません。" );
203    if(num==136) lstrcpy( msg, "非仮想関数に対してオーバーライドしようとしました。" );
204    if(num==137) lstrcpy(msg,"ImplementsはClass定義内の先頭に記述する必要があります。");
205    if(num==138) sprintf(msg,"%s はインターフェイスではありません。Implementsできるのはインターフェイスに限ります。",tempKeyWord);
206
207    //Enum関連
208    if(num==150) sprintf(msg,"\"%s\" 値が定義されていません。",tempKeyWord);
209    if(num==151) sprintf(msg,"\"%s\" 列挙リストに登録されていません。",tempKeyWord);
210
211    //リンカ
212    if(num==200) sprintf(msg,"\"%s\" 未解決です (リンク エラー)。",tempKeyWord);
213    if(num==201) sprintf(msg,"\"%s\" の読み込みに失敗。",tempKeyWord);
214
215    //原因不明
216    if(num==300) lstrcpy(msg,"内部エラー");
217
218    // ベースライブラリ不整合
219    if( num == 400 )    sprintf( msg, "\"%s\" が存在しません。標準ライブラリの内容が古い可能性があります。", tempKeyWord );
220
221#else
222    ////////////////////
223    //英語
224    ////////////////////
225    if(num==1) lstrcpy(msg,"Syntax Error.");
226    if(num==2) sprintf(msg,"Left operand must be l-value.");
227    //num==3は予約されています
228    if(num==4) sprintf(msg,"Correlation of %s is wrong.",tempKeyWord);
229    if(num==5) sprintf(msg,"Correlation of double quotes is wrong.");
230    if(num==6) sprintf(msg,"\"%s\" Label not found.",tempKeyWord);
231    if(num==7) lstrcpy(msg,"The DLL name is too long. Must be 16 characters or less.");
232    if(num==8) lstrcpy(msg,"The inaccurate characters are contained.");
233    if(num==9) sprintf(msg,"Type is wrong.");
234    if(num==10) sprintf(msg,"\"%s\" Rule of parameter is wrong.",tempKeyWord);
235    if(num==11) sprintf(msg,"\"%s\" Type is wrong.",tempKeyWord);
236    if(num==12) sprintf(msg,"\"%s\" Not a valid use.",tempKeyWord);
237    if(num==13) sprintf(msg,"Cannot refer to \"%s\".",tempKeyWord);
238    if(num==14) sprintf(msg,"\"%s\" Array argument(s) out of bound.",tempKeyWord);
239    if(num==15) sprintf(msg,"\"%s\" is already defined.",tempKeyWord);
240    if(num==16) sprintf(msg,"\"%s\" Argument(s) following variable which is not pointer or array.",tempKeyWord);
241    if(num==17) sprintf(msg,"Invalid resource data.");
242    if(num==18) sprintf(msg,"\"%s\" Invalid operation on a pointer variable.",tempKeyWord);
243    if(num==19) sprintf(msg,"\"%s\" is already to be passed by value. You cannot use \"ByVal\".",tempKeyWord);
244    if(num==21) sprintf(msg,"Wrong structure of \"If\" block.");
245    if(num==22) sprintf(msg,"No matching \"End %s\" found for \"%s\".",tempKeyWord,tempKeyWord);
246    if(num==23) sprintf(msg,"Cannot read the resource file \"%s\".",tempKeyWord);
247    if(num==24) lstrcpy(msg,"Must not use String type as an argument for exported function. (Use BytePtr type instead.)");
248    if(num==27) sprintf(msg,"\"%s\" Undefined procedure.",tempKeyWord);
249    if(num==28) sprintf(msg,"\"%s\" Structure must not be passed by value. (Use \"ByRef\".)",tempKeyWord);
250    if(num==29) sprintf(msg,"Array must not be passed by value. (Use \"ByRef\".)");
251    //num==30は予約されています
252    if(num==31) sprintf(msg,"\"%s\" is a struct. (Use period \".\" to refer to the members.)",tempKeyWord);
253    if(num==32) sprintf(msg,"\"%s\" is a pointer of struct. (Use arrow \"->\" to refer to the members.)",tempKeyWord);
254    if(num==33) sprintf(msg,"Constant formula has a thing that is not literal value or constant value.");
255    if(num==34) sprintf(msg,"Constant formula must be defined in the module level.");
256    if(num==38) sprintf(msg,"\"%s\" is a procedure without a return value.",tempKeyWord);
257    if(num==39) sprintf(msg,"\"%s\" is not object pointer. \"->\" is invalid.",tempKeyWord);
258    if(num==40) lstrcpy(msg,"Cannot set a object to return value.");
259    if(num==41) lstrcpy(msg,"Init data is wrong.");
260    if(num==42) lstrcpy(msg,"The inaccurate characters are contained after the closing parenthesis \")\".");
261    if(num==43) lstrcpy(msg,"The inaccurate characters are contained after the double quote.");
262
263    //オブジェクト関連
264    if(num==102) sprintf(msg,"\"%s\" The object is not defined.",tempKeyWord);
265    if(num==103) sprintf(msg,"\"%s\" The member is not defined.",tempKeyWord);
266    if(num==104) sprintf(msg,"\"%s\" The reference character is different.",tempKeyWord);
267    if(num==105) sprintf(msg,"\"%s\" An own class is not inheritable.",tempKeyWord);
268    if(num==106) sprintf(msg,"\"%s\" It class is not defined.",tempKeyWord);
269    if(num==107) sprintf(msg,"\"%s\" Cannot access the private member.",tempKeyWord);
270    if(num==108) sprintf(msg,"\"%s\" Cannot access the protected member.",tempKeyWord);
271    if(num==109) sprintf(msg,"\"%s\" Cannot call the private member.",tempKeyWord);
272    if(num==110) sprintf(msg,"\"%s\" Cannot call the protected member.",tempKeyWord);
273    if(num==111) lstrcpy(msg,"The Inherits phrase must be described to the 1st line of class module");
274    if(num==112) sprintf(msg,"\"%s\" is not class object. Therefor you cannot set the parameter for constructor.",tempKeyWord);
275    if(num==113) sprintf(msg,"\"%s\" The parameter for constructor is wrong.",tempKeyWord);
276    if(num==114) lstrcpy(msg,"Destructor cannot have a parameter.");
277    if(num==115) lstrcpy(msg,"Constructor and Destructor cannot have a return value.");
278    if(num==116) lstrcpy(msg,"Constructor and Destructor must be public access.");
279    if(num==117) lstrcpy(msg,"Destructors name must be \"~ClassName\".");
280    if(num==118) lstrcpy(msg,"Super class is not found.");
281    if(num==119) sprintf(msg,"\"%s\" The member is not defined in the super class.",tempKeyWord);
282
283    //Enum関連
284    if(num==150) sprintf(msg,"\"%s\" The value is not set",tempKeyWord);
285    if(num==151) sprintf(msg,"\"%s\" is not found from enum lists.",tempKeyWord);
286
287    //リンカ
288    if(num==200) sprintf(msg,"\"%s\" Unknown error.",tempKeyWord);
289#endif
290
291    return 1;
292}
293void SetError(int ErrorNum,const string &keyWord,int pos){
294    SetError( ErrorNum, keyWord.c_str(), pos );
295}
296void SetError(int num,const char *KeyWord,int pos){
297    extern HANDLE hHeap;
298    extern HWND hMainDlg;
299    extern ERRORINFO *pErrorInfo;
300    extern int ErrorNum;
301    char temporary[1024],temp2[1024],temp3[32];
302    BOOL bFirst;
303    int i2;
304
305    extern BOOL bDebugRun;
306    if(bDebugRun) return;
307
308    if(num!=-2){
309        //一般エラーまたは警告
310        i2=0;   //ここにブレークポイントをおく
311
312        if(num>-100){
313            //エラーのみ
314
315            i2=0;
316        }
317
318    }
319
320    if(!GetErrorMsg(num,KeyWord,temporary,pos)) return;
321
322    if(ErrorNum==0){
323        SetDlgItemText(hMainDlg,IDC_ERRORLIST,"");
324        EnableWindow(GetDlgItem(hMainDlg,IDC_ERRORLIST),1);
325        bFirst=1;
326    }
327    else bFirst=0;
328
329
330    ////////////////////
331    // エラー情報を追加
332    pErrorInfo=(ERRORINFO *)HeapReAlloc(hHeap,0,pErrorInfo,(ErrorNum+1)*sizeof(ERRORINFO));
333
334    if(pos==-1){
335        pErrorInfo[ErrorNum].FileName=0;
336        lstrcpy(temp2,temporary);
337    }
338    else{
339        std::string dummyStr;
340        compiler.GetObjectModule().GetCurrentSource().GetLineInfo( pos, pErrorInfo[ErrorNum].line, dummyStr );
341
342        pErrorInfo[ErrorNum].FileName=(char *)HeapAlloc(hHeap,0,lstrlen(dummyStr.c_str())+1);
343        lstrcpy(pErrorInfo[ErrorNum].FileName,dummyStr.c_str());
344
345        _splitpath(pErrorInfo[ErrorNum].FileName,0,0,temp2,temp3);
346        lstrcat(temp2,temp3);
347
348        if(pErrorInfo[ErrorNum].line==-1)
349            sprintf(temp2+lstrlen(temp2),"(no area) %s",temporary);
350        else
351            sprintf(temp2+lstrlen(temp2),"(%d) - %s",pErrorInfo[ErrorNum].line+1,temporary);
352    }
353
354    i2=GetWindowTextLength(GetDlgItem(hMainDlg,IDC_ERRORLIST));
355    SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_SETSEL,i2,i2);
356    if(bFirst==0){
357        SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_REPLACESEL,0,(LPARAM)"\r\n");
358        i2+=2;
359        SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_SETSEL,i2,i2);
360    }
361    SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_REPLACESEL,0,(LPARAM)temp2);
362
363
364    if(num==-2){
365        //コンパイルメッセージ
366        //※何もしない
367        extern int CompileMsgNum;
368        CompileMsgNum++;
369    }
370    else{
371        if(num>-100){
372            //警告ではなく、エラーの場合はエラーチェックフラグを立てる
373            extern BOOL bError;
374            bError=1;
375
376            // ログに出力
377            trace( "error - " << temp2 );
378        }
379        else{
380            extern int WarningNum;
381            WarningNum++;
382
383            // ログに出力
384            trace( "warning - " << temp2 );
385        }
386    }
387
388    ErrorNum++;
389}
390void SetError(){
391    SetError(300,NULL,cp);
392}
393void CompileMessage(const char *buffer){
394    SetError(-2,buffer,-1);
395}
396
397#define STRING_SYSTEM_DECLAREHANDLE "*_System_DeclareHandle_"
398void DifferentTypeError( const Type &varType, const Type &calcFormalType, const int iWarning,const char *pszFuncName,const int ParmNum){
399    //////////////////////////
400    // キャストに関する警告
401    //////////////////////////
402    char temporary[255];
403    Type calcType( calcFormalType );
404
405    if(IS_LITERAL(calcType.GetIndex()))
406    {
407        calcType.SetIndex( -1 );
408    }
409
410    if(pszFuncName)
411        sprintf(temporary,"\"%s\"の第%dパラメータが、",pszFuncName,ParmNum+1);
412    else temporary[0]=0;
413
414    std::string varTypeName = compiler.TypeToString( varType );
415    if(memcmp( varTypeName.c_str(),STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0)
416    {
417        varTypeName = varTypeName.substr( lstrlen(STRING_SYSTEM_DECLAREHANDLE) );
418    }
419
420    std::string calcTypeName = compiler.TypeToString( calcType );
421    if(memcmp( calcTypeName.c_str(),STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0)
422    {
423        calcTypeName = calcTypeName.substr( lstrlen(STRING_SYSTEM_DECLAREHANDLE) );
424    }
425    sprintf(temporary+lstrlen(temporary),"%sから%s",calcTypeName.c_str(),varTypeName.c_str());
426
427    extern int cp;
428    if(iWarning==1) SetError(-101,temporary,cp);
429    else if(iWarning==2) SetError(-102,temporary,cp);
430    else if(iWarning==3) SetError(50,temporary,cp);
431}
432
433bool CheckDifferentType( const Type &varType,const Type &calcFormalType,const char *pszFuncName,const int ParmNum)
434{
435    Type calcType( calcFormalType );
436
437    if( varType.IsStruct() || calcType.IsStruct() )
438    {
439        //いずれかが構造体場合
440        if( !varType.Equals( calcType ) )
441        {
442            DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
443            return false;
444        }
445    }
446
447    if( varType.IsObject() || calcType.IsObject() )
448    {
449        //いずれかがオブジェクトの場合
450        if( varType.GetBasicType() != calcType.GetBasicType() )
451        {
452            DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
453            return false;
454        }
455
456        if( !varType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) )
457        {
458            //等しくなく、派生クラスでもないとき
459            DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
460            return false;
461        }
462    }
463
464    //#strictが指定されていないときは型チェックを行わないようにする
465    extern BOOL bStrict;
466    if(bStrict==0) return true;
467
468    if( calcType.GetBasicType() & FLAG_PTR )
469    {
470        //配列先頭フラグがたっている場合は、ポインタ型として扱う
471        calcType.SetBasicType( MAKE_PTR_TYPE(NATURAL_TYPE(calcType.GetBasicType()),PTR_LEVEL(calcType.GetBasicType())+1) );
472    }
473
474    if( varType.IsPointer() || calcType.IsPointer() )
475    {
476        /* 右辺及び左辺のいずれかがポインタ型の場合は、
477            型チェックを行う。
478        ・同一の種類のポインタ型以外はエラーとする */
479
480        if( varType.IsPointer() && calcType.GetIndex() == LITERAL_NULL )
481        {
482            //リテラルNULL値の場合
483            return true;
484        }
485
486        if( varType.IsVoidPtr() )
487        {
488            //左辺がVoidPtr型の場合は、ポインタ型すべてを受け入れる
489            if( calcType.IsPointer() )
490            {
491                return true;
492            }
493        }
494
495        if( calcType.IsVoidPtr() )
496        {
497            //右辺がVoidPtr型の場合は、ポインタ型すべてを受け入れる
498            if( varType.IsPointer() )
499            {
500                return true;
501            }
502        }
503
504        if( varType.GetBasicType() != calcType.GetBasicType() )
505        {
506            DifferentTypeError( varType, calcType, 2,pszFuncName,ParmNum);
507            return true;
508        }
509
510        if( varType.IsObjectPtr() )
511        {
512            //双方がオブジェクトポインタ型の場合
513            if( varType.GetIndex() != calcType.GetIndex() )
514            {
515                const CClass *pobj_tempClass = &calcType.GetClass();
516                while(pobj_tempClass&&(!IS_LITERAL((LONG_PTR)pobj_tempClass))){
517                    pobj_tempClass=&pobj_tempClass->GetSuperClass();
518
519                    if( &varType.GetClass() == pobj_tempClass )
520                    {
521                        //継承先が等しいとき
522                        return true;
523                    }
524                }
525                DifferentTypeError( varType, calcType, 2,pszFuncName,ParmNum);
526                return true;
527            }
528        }
529    }
530
531    if( varType.IsDouble() )
532    {
533        if( calcType.Is64() )
534        {
535            //64ビット整数値の場合は警告を出す
536            DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
537        }
538    }
539    else if( varType.IsSingle() )
540    {
541        if( calcType.Is64() || calcType.IsDouble() )
542        {
543            //64ビット整数値、またはDouble型の場合は警告を出す
544            DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
545        }
546    }
547    else if( varType.GetSize() == sizeof(char) )
548    {
549        if( calcType.GetSize() > sizeof(char)
550            && calcType.GetIndex() != LITERAL_NULL
551            && calcType.GetIndex() != LITERAL_M128_0
552            && calcType.GetIndex() != LITERAL_0_255 )
553        {
554            //8ビット整数値より大きな型で、リテラル値でもない場合は警告を出す
555            DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
556        }
557    }
558    else if( varType.GetSize() == sizeof(short) )
559    {
560        if( calcType.GetSize() > sizeof(short)
561            && calcType.GetIndex() != LITERAL_NULL
562            && calcType.GetIndex() != LITERAL_M128_0
563            && calcType.GetIndex() != LITERAL_0_255
564            && calcType.GetIndex() != LITERAL_M32768_0
565            && calcType.GetIndex() != LITERAL_0_65535 )
566        {
567            //16ビット整数値より大きな型で、リテラル値でもない場合は警告を出す
568            DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
569        }
570    }
571    else if( varType.GetSize() == sizeof(long) )
572    {
573        if( calcType.IsReal()
574            || ( calcType.IsWhole() && calcType.GetSize() > sizeof(long) && calcType.GetIndex() != LITERAL_NULL ) )
575        {
576            /* 32ビット整数値より大きな型、または実数、
577                    またはリテラル値でもない場合は警告を出す */
578            DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
579        }
580    }
581    else if( varType.GetSize() == sizeof(_int64) )
582    {
583        if( calcType.IsReal() )
584        {
585            //実数の場合は警告を出す
586            DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
587        }
588    }
589
590    return true;
591}
Note: See TracBrowser for help on using the repository browser.