CnPack Forum


 
Subject: CnWizards代码结构高亮的Bug修改记录
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6760
Posts 3556
点点分 6760
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-6-24 13:16  Profile | Blog | P.M. 
CnWizards代码结构高亮的Bug修改记录

Bug以及修复记录:
=========
形如:
procedure TForm1.FormCreate(Sender: TObject);
type
??TTest = record

??end;
begin

end;
这样的代码,应该record和end,begin、end都高亮显示的,结果后面一对begin end不高亮,原因是后面一对begin end的 IsMethodClose 和 IsMethodStart 都被误判断成 False 了,因此错在解析器对 record 的处理中。它大概把 record 弄成 IsMethodClose = True 了。已经修正。
=========
形如:
procedure TForm1.FormCreate(Sender: TObject);
type
??TTest1 = procedure of object;
??TTest = record
begin

end;
需要额外处理procedure或function前面是=号的情况,需要处理object前面是of的情况,再加个PrevTokenId估计行。也解决了。
=========

还有一种情形,碰到begin,没碰到end时(这种情况常发生在未写完代码时)没匹配完全,导致开始的begin也无法设置IsMethodStart?这个确实不好解决。

=========
procedure TForm1.FormCreate(Sender: TObject);
begin

end;
光标在begin end内部时,不触发匹配事件?原因是Assigned(Parser.MethodStartToken) and

Assigned(Parser.MethodCloseToken) 为False,也就是部分内容没有搜到。
Line 27时解析不出来,Line26时可以。貌似太靠近end会找不出来。原来是一个LineNumber从0开始还是从1开始的差别。

=========
匹配模式是本过程时,当相邻俩过程函数,光标在第一个过程函数的end前后,总会导致上下俩都高亮。原因是搜索CurrentIndex时未考虑到光标在此Token前还是后的问题。
修改此问题后,出现光标在end;后,下一个procedure/function末尾前时,前后俩函数都高亮的情况。
应该是_BackwardFindDeclarePos;和_ForwardFindDeclarePos;俩函数靠同一个end;重叠了前后搜索所致。这个问题挺小,可以暂时忽略。

=========
implementation

{$R *.dfm}

type
??TA = record
??end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.
这种情形,begin end会配红色,但record end会配黑色,这个黑色哪儿来的?原来来自ALayer小于0时,ALayer mod 6是小于0的数,数组超界访问到了0,因此就是黑色了。还会造成内存错误,已修正。

=========
case end的end配色错误。有begin end时,case能和begin end配色,但没法和最后一个end配色,无begin end时最后一个同样也没法配色。最后一个end总是会少一层次。这种情况是case忘记被塞入currentblock了的缘故,改过来即可。但case 后的of没法像if then一样配色了,因为if then 是独立的配色对,后面的begin end也是独立的配色对。而case 和后面的 end 配色,没法同时和of配色。if then后如果不加begin end,加别的比如try except 等,也能正常配色。
=========

位置错乱的问题能复现了!implementation 部分加入type class的定义,定义两个以上就行。
看来是没有处理class的缘故,得处理class,后面不是分号就需要一个end来配对。并且注意,class里头的过程函数要做声明用,不能当定义来处理。
貌似这样连续俩class的错位问题,是class往后读了内容再读回来导致的错位。
另外还可能有 class function/var 的问题?这个class function/var 倒是在Lex里头就已经处理掉了。
换成俩record倒是没毛病。
class后面这个end确实错位了,IDE 里头是27行,读出来是28。在28行呢,读出来的是30。解析出来的LineNumber 就是错的,因此转换而来的EditCol也是错的。
type
??TA = class
??end;
经过跟踪,原来是Lex解析器在重新设置RunPos时未重新设置LineNumber,导致LineNumber跑到更大的地方回不来。这好办,加个写属性写回去就是了。
=========
还有个问题,实现部分出现:
function GetC: Pointer; external 'Test.dll';
这种声明时,高亮会将其全部当作实现嵌套,但对forward却会处理好。
对于这种,function Bar(const Forward: Boolean): Boolean; forward已经不是关键字了。或者应该判断forward/external前面是不是分号。
=========
局部的class/record都处理了,还有interface。加上。
=========

剩余问题:

? ?? ?if FileStream.Read(C, SizeOf(C)) = SizeOf(C) then
? ?? ???if C in ['o','O','i','I',' ',#13,#11,#9] then

问题:这俩if应该是后者比前者高的,结果没嵌套进去。
默认加粗不加粗应该从注册表中读入,不过先不管也行。
貌似还引入了点问题,不时出个Exception,比如%s不符合格式或者访问非法地址什么的。8E.
用关键字做变量名无法处理,用编译指令造成不匹配的也无法处理。
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6760
Posts 3556
点点分 6760
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-6-24 13:19  Profile | Blog | P.M. 
上面的空格咋会变成问号呢?
Top
skyjacker
版主
Rank: 7Rank: 7Rank: 7
茶农


UID 2239
Digest Posts 9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
Post at 2007-6-24 13:30  Profile | Blog | P.M.  | QQ
先 Copy 到记事本?




一壶清茶煮青春.
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6760
Posts 3556
点点分 6760
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-6-24 14:25  Profile | Blog | P.M. 
我是在记事本里头写的,记事本里头copy过来的。
不过代码是IDE里头copy出来的。
Top
kendling (小冬)
高级版主
Rank: 8Rank: 8
MyvNet


Medal No.1  
UID 703
Digest Posts 5
Credits 978
Posts 580
点点分 978
Reading Access 101
Registered 2005-2-18
Location 广东
Status Offline
Post at 2007-6-25 11:12  Profile | Site | Blog | P.M.  | QQ | Yahoo!
IDE里COPY代码过来也不应该有问题哇。




小冬
http://MyvNet.com
Top
 




All times are GMT++8, the time now is 2024-4-29 05:54

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.007592 second(s), 8 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP