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.
用关键字做变量名无法处理,用编译指令造成不匹配的也无法处理。
|