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

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

・ジェネリックな型をパラメータに持つメソッドのオーバーロード解決に対応した。
・型パラメータの制約クラス指定に対応した。

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