|
@@ -200,14 +200,15 @@ interface
|
|
|
|
|
|
{*** Search ***}
|
|
{*** Search ***}
|
|
procedure addsymref(sym:tsym);
|
|
procedure addsymref(sym:tsym);
|
|
- function is_visible_for_object(symst:tsymtable;symvisibility:tvisibility;contextobjdef:tobjectdef):boolean;
|
|
|
|
- function is_visible_for_object(pd:tprocdef;contextobjdef:tobjectdef):boolean;
|
|
|
|
- function is_visible_for_object(sym:tsym;contextobjdef:tobjectdef):boolean;
|
|
|
|
|
|
+ function is_visible_for_object(symst:tsymtable;symvisibility:tvisibility;contextobjdef:tabstractrecorddef):boolean;
|
|
|
|
+ function is_visible_for_object(pd:tprocdef;contextobjdef:tabstractrecorddef):boolean;
|
|
|
|
+ function is_visible_for_object(sym:tsym;contextobjdef:tabstractrecorddef):boolean;
|
|
function searchsym(const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function searchsym(const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function searchsym_type(const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function searchsym_type(const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function searchsym_in_module(pm:pointer;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function searchsym_in_module(pm:pointer;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function searchsym_in_named_module(const unitname, symname: TIDString; out srsym: tsym; out srsymtable: tsymtable): boolean;
|
|
function searchsym_in_named_module(const unitname, symname: TIDString; out srsym: tsym; out srsymtable: tsymtable): boolean;
|
|
function searchsym_in_class(classh,contextclassh:tobjectdef;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function searchsym_in_class(classh,contextclassh:tobjectdef;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
|
|
+ function searchsym_in_record(recordh:tabstractrecorddef;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function searchsym_in_class_by_msgint(classh:tobjectdef;msgid:longint;out srdef : tdef;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function searchsym_in_class_by_msgint(classh:tobjectdef;msgid:longint;out srdef : tdef;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function searchsym_in_class_by_msgstr(classh:tobjectdef;const s:string;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function searchsym_in_class_by_msgstr(classh:tobjectdef;const s:string;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function search_system_type(const s: TIDString): ttypesym;
|
|
function search_system_type(const s: TIDString): ttypesym;
|
|
@@ -579,7 +580,7 @@ implementation
|
|
begin
|
|
begin
|
|
if (tsym(sym).typ in [staticvarsym,localvarsym,paravarsym,fieldvarsym]) and
|
|
if (tsym(sym).typ in [staticvarsym,localvarsym,paravarsym,fieldvarsym]) and
|
|
((tsym(sym).owner.symtabletype in
|
|
((tsym(sym).owner.symtabletype in
|
|
- [parasymtable,localsymtable,ObjectSymtable,staticsymtable])) then
|
|
|
|
|
|
+ [parasymtable,localsymtable,ObjectSymtable,recordsymtable,staticsymtable])) then
|
|
begin
|
|
begin
|
|
{ unused symbol should be reported only if no }
|
|
{ unused symbol should be reported only if no }
|
|
{ error is reported }
|
|
{ error is reported }
|
|
@@ -602,8 +603,8 @@ implementation
|
|
end
|
|
end
|
|
else if (tsym(sym).owner.symtabletype=parasymtable) then
|
|
else if (tsym(sym).owner.symtabletype=parasymtable) then
|
|
MessagePos1(tsym(sym).fileinfo,sym_h_para_identifier_not_used,tsym(sym).prettyname)
|
|
MessagePos1(tsym(sym).fileinfo,sym_h_para_identifier_not_used,tsym(sym).prettyname)
|
|
- else if (tsym(sym).owner.symtabletype=ObjectSymtable) then
|
|
|
|
- MessagePos2(tsym(sym).fileinfo,sym_n_private_identifier_not_used,tobjectdef(tsym(sym).owner.defowner).RttiName,tsym(sym).prettyname)
|
|
|
|
|
|
+ else if (tsym(sym).owner.symtabletype in [ObjectSymtable,recordsymtable]) then
|
|
|
|
+ MessagePos2(tsym(sym).fileinfo,sym_n_private_identifier_not_used,tabstractrecorddef(tsym(sym).owner.defowner).RttiName,tsym(sym).prettyname)
|
|
else
|
|
else
|
|
MessagePos1(tsym(sym).fileinfo,sym_n_local_identifier_not_used,tsym(sym).prettyname);
|
|
MessagePos1(tsym(sym).fileinfo,sym_n_local_identifier_not_used,tsym(sym).prettyname);
|
|
end
|
|
end
|
|
@@ -615,8 +616,8 @@ implementation
|
|
not(vo_is_funcret in tabstractvarsym(sym).varoptions) then
|
|
not(vo_is_funcret in tabstractvarsym(sym).varoptions) then
|
|
MessagePos1(tsym(sym).fileinfo,sym_h_para_identifier_only_set,tsym(sym).prettyname)
|
|
MessagePos1(tsym(sym).fileinfo,sym_h_para_identifier_only_set,tsym(sym).prettyname)
|
|
end
|
|
end
|
|
- else if (tsym(sym).owner.symtabletype=ObjectSymtable) then
|
|
|
|
- MessagePos2(tsym(sym).fileinfo,sym_n_private_identifier_only_set,tobjectdef(tsym(sym).owner.defowner).RttiName,tsym(sym).prettyname)
|
|
|
|
|
|
+ else if (tsym(sym).owner.symtabletype in [ObjectSymtable,recordsymtable]) then
|
|
|
|
+ MessagePos2(tsym(sym).fileinfo,sym_n_private_identifier_only_set,tabstractrecorddef(tsym(sym).owner.defowner).RttiName,tsym(sym).prettyname)
|
|
else if tabstractvarsym(sym).varoptions*[vo_is_funcret,vo_is_public,vo_is_external]=[] then
|
|
else if tabstractvarsym(sym).varoptions*[vo_is_funcret,vo_is_public,vo_is_external]=[] then
|
|
MessagePos1(tsym(sym).fileinfo,sym_n_local_identifier_only_set,tsym(sym).prettyname);
|
|
MessagePos1(tsym(sym).fileinfo,sym_n_local_identifier_only_set,tsym(sym).prettyname);
|
|
end
|
|
end
|
|
@@ -625,22 +626,22 @@ implementation
|
|
MessagePos1(tsym(sym).fileinfo,sym_w_identifier_only_read,tsym(sym).prettyname)
|
|
MessagePos1(tsym(sym).fileinfo,sym_w_identifier_only_read,tsym(sym).prettyname)
|
|
end
|
|
end
|
|
else if ((tsym(sym).owner.symtabletype in
|
|
else if ((tsym(sym).owner.symtabletype in
|
|
- [ObjectSymtable,parasymtable,localsymtable,staticsymtable])) then
|
|
|
|
|
|
+ [ObjectSymtable,parasymtable,localsymtable,staticsymtable,recordsymtable])) then
|
|
begin
|
|
begin
|
|
if (Errorcount<>0) or
|
|
if (Errorcount<>0) or
|
|
(sp_internal in tsym(sym).symoptions) then
|
|
(sp_internal in tsym(sym).symoptions) then
|
|
exit;
|
|
exit;
|
|
{ do not claim for inherited private fields !! }
|
|
{ do not claim for inherited private fields !! }
|
|
- if (tsym(sym).refs=0) and (tsym(sym).owner.symtabletype=ObjectSymtable) then
|
|
|
|
|
|
+ if (tsym(sym).refs=0) and (tsym(sym).owner.symtabletype in [ObjectSymtable,recordsymtable]) then
|
|
case tsym(sym).typ of
|
|
case tsym(sym).typ of
|
|
typesym:
|
|
typesym:
|
|
- MessagePos2(tsym(sym).fileinfo,sym_n_private_type_not_used,tobjectdef(tsym(sym).owner.defowner).RttiName,tsym(sym).prettyname);
|
|
|
|
|
|
+ MessagePos2(tsym(sym).fileinfo,sym_n_private_type_not_used,tabstractrecorddef(tsym(sym).owner.defowner).RttiName,tsym(sym).prettyname);
|
|
constsym:
|
|
constsym:
|
|
- MessagePos2(tsym(sym).fileinfo,sym_n_private_const_not_used,tobjectdef(tsym(sym).owner.defowner).RttiName,tsym(sym).prettyname);
|
|
|
|
|
|
+ MessagePos2(tsym(sym).fileinfo,sym_n_private_const_not_used,tabstractrecorddef(tsym(sym).owner.defowner).RttiName,tsym(sym).prettyname);
|
|
propertysym:
|
|
propertysym:
|
|
- MessagePos2(tsym(sym).fileinfo,sym_n_private_property_not_used,tobjectdef(tsym(sym).owner.defowner).RttiName,tsym(sym).prettyname);
|
|
|
|
|
|
+ MessagePos2(tsym(sym).fileinfo,sym_n_private_property_not_used,tabstractrecorddef(tsym(sym).owner.defowner).RttiName,tsym(sym).prettyname);
|
|
else
|
|
else
|
|
- MessagePos2(tsym(sym).fileinfo,sym_n_private_method_not_used,tobjectdef(tsym(sym).owner.defowner).RttiName,tsym(sym).prettyname);
|
|
|
|
|
|
+ MessagePos2(tsym(sym).fileinfo,sym_n_private_method_not_used,tabstractrecorddef(tsym(sym).owner.defowner).RttiName,tsym(sym).prettyname);
|
|
end
|
|
end
|
|
{ units references are problematic }
|
|
{ units references are problematic }
|
|
else
|
|
else
|
|
@@ -679,9 +680,9 @@ implementation
|
|
Don't test simple object aliases PM
|
|
Don't test simple object aliases PM
|
|
}
|
|
}
|
|
if (tsym(sym).typ=typesym) and
|
|
if (tsym(sym).typ=typesym) and
|
|
- (ttypesym(sym).typedef.typ=objectdef) and
|
|
|
|
|
|
+ (ttypesym(sym).typedef.typ in [objectdef,recorddef]) and
|
|
(ttypesym(sym).typedef.typesym=tsym(sym)) then
|
|
(ttypesym(sym).typedef.typesym=tsym(sym)) then
|
|
- tobjectdef(ttypesym(sym).typedef).symtable.SymList.ForEachCall(@TestPrivate,nil);
|
|
|
|
|
|
+ tabstractrecorddef(ttypesym(sym).typedef).symtable.SymList.ForEachCall(@TestPrivate,nil);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -1603,8 +1604,8 @@ implementation
|
|
var
|
|
var
|
|
s1,s2 : string;
|
|
s1,s2 : string;
|
|
begin
|
|
begin
|
|
- if def.typ=objectdef then
|
|
|
|
- s1:=tobjectdef(def).RttiName
|
|
|
|
|
|
+ if def.typ in [objectdef,recorddef] then
|
|
|
|
+ s1:=tabstractrecorddef(def).RttiName
|
|
else
|
|
else
|
|
s1:=def.typename;
|
|
s1:=def.typename;
|
|
{ When the names are the same try to include the unit name }
|
|
{ When the names are the same try to include the unit name }
|
|
@@ -1692,25 +1693,25 @@ implementation
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
- function is_visible_for_object(symst:tsymtable;symvisibility:tvisibility;contextobjdef:tobjectdef):boolean;
|
|
|
|
|
|
+ function is_visible_for_object(symst:tsymtable;symvisibility:tvisibility;contextobjdef:tabstractrecorddef):boolean;
|
|
|
|
|
|
- function is_holded_by(childdef,ownerdef: tobjectdef): boolean;
|
|
|
|
|
|
+ function is_holded_by(childdef,ownerdef: tabstractrecorddef): boolean;
|
|
begin
|
|
begin
|
|
result:=childdef=ownerdef;
|
|
result:=childdef=ownerdef;
|
|
- if not result and (childdef.owner.symtabletype=ObjectSymtable) then
|
|
|
|
- result:=is_holded_by(tobjectdef(childdef.owner.defowner),ownerdef);
|
|
|
|
|
|
+ if not result and (childdef.owner.symtabletype in [ObjectSymtable,recordsymtable]) then
|
|
|
|
+ result:=is_holded_by(tabstractrecorddef(childdef.owner.defowner),ownerdef);
|
|
end;
|
|
end;
|
|
|
|
|
|
var
|
|
var
|
|
- symownerdef : tobjectdef;
|
|
|
|
|
|
+ symownerdef : tabstractrecorddef;
|
|
begin
|
|
begin
|
|
result:=false;
|
|
result:=false;
|
|
|
|
|
|
{ Get objdectdef owner of the symtable for the is_related checks }
|
|
{ Get objdectdef owner of the symtable for the is_related checks }
|
|
if not assigned(symst) or
|
|
if not assigned(symst) or
|
|
- (symst.symtabletype<>objectsymtable) then
|
|
|
|
|
|
+ not (symst.symtabletype in [objectsymtable,recordsymtable]) then
|
|
internalerror(200810285);
|
|
internalerror(200810285);
|
|
- symownerdef:=tobjectdef(symst.defowner);
|
|
|
|
|
|
+ symownerdef:=tabstractrecorddef(symst.defowner);
|
|
case symvisibility of
|
|
case symvisibility of
|
|
vis_private :
|
|
vis_private :
|
|
begin
|
|
begin
|
|
@@ -1785,13 +1786,13 @@ implementation
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
- function is_visible_for_object(pd:tprocdef;contextobjdef:tobjectdef):boolean;
|
|
|
|
|
|
+ function is_visible_for_object(pd:tprocdef;contextobjdef:tabstractrecorddef):boolean;
|
|
begin
|
|
begin
|
|
result:=is_visible_for_object(pd.owner,pd.visibility,contextobjdef);
|
|
result:=is_visible_for_object(pd.owner,pd.visibility,contextobjdef);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
- function is_visible_for_object(sym:tsym;contextobjdef:tobjectdef):boolean;
|
|
|
|
|
|
+ function is_visible_for_object(sym:tsym;contextobjdef:tabstractrecorddef):boolean;
|
|
var
|
|
var
|
|
i : longint;
|
|
i : longint;
|
|
pd : tprocdef;
|
|
pd : tprocdef;
|
|
@@ -1819,7 +1820,7 @@ implementation
|
|
function searchsym(const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function searchsym(const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
var
|
|
var
|
|
hashedid : THashedIDString;
|
|
hashedid : THashedIDString;
|
|
- contextobjdef : tobjectdef;
|
|
|
|
|
|
+ contextstructdef : tabstractrecorddef;
|
|
stackitem : psymtablestackitem;
|
|
stackitem : psymtablestackitem;
|
|
begin
|
|
begin
|
|
result:=false;
|
|
result:=false;
|
|
@@ -1845,14 +1846,14 @@ implementation
|
|
defined in this unit }
|
|
defined in this unit }
|
|
if (srsymtable.symtabletype=withsymtable) and
|
|
if (srsymtable.symtabletype=withsymtable) and
|
|
assigned(srsymtable.defowner) and
|
|
assigned(srsymtable.defowner) and
|
|
- (srsymtable.defowner.typ=objectdef) and
|
|
|
|
|
|
+ (srsymtable.defowner.typ in [recorddef,objectdef]) and
|
|
(srsymtable.defowner.owner.symtabletype in [globalsymtable,staticsymtable]) and
|
|
(srsymtable.defowner.owner.symtabletype in [globalsymtable,staticsymtable]) and
|
|
(srsymtable.defowner.owner.iscurrentunit) then
|
|
(srsymtable.defowner.owner.iscurrentunit) then
|
|
- contextobjdef:=tobjectdef(srsymtable.defowner)
|
|
|
|
|
|
+ contextstructdef:=tobjectdef(srsymtable.defowner)
|
|
else
|
|
else
|
|
- contextobjdef:=current_objectdef;
|
|
|
|
- if (srsym.owner.symtabletype<>objectsymtable) or
|
|
|
|
- is_visible_for_object(srsym,contextobjdef) then
|
|
|
|
|
|
+ contextstructdef:=current_objectdef;
|
|
|
|
+ if not (srsym.owner.symtabletype in [objectsymtable,recordsymtable]) or
|
|
|
|
+ is_visible_for_object(srsym,contextstructdef) then
|
|
begin
|
|
begin
|
|
{ we need to know if a procedure references symbols
|
|
{ we need to know if a procedure references symbols
|
|
in the static symtable, because then it can't be
|
|
in the static symtable, because then it can't be
|
|
@@ -1903,7 +1904,7 @@ implementation
|
|
if assigned(srsym) and
|
|
if assigned(srsym) and
|
|
not(srsym.typ in [fieldvarsym,paravarsym]) and
|
|
not(srsym.typ in [fieldvarsym,paravarsym]) and
|
|
(
|
|
(
|
|
- (srsym.owner.symtabletype<>objectsymtable) or
|
|
|
|
|
|
+ not (srsym.owner.symtabletype in [objectsymtable,recordsymtable]) or
|
|
(is_visible_for_object(srsym,current_objectdef) and
|
|
(is_visible_for_object(srsym,current_objectdef) and
|
|
(srsym.typ=typesym))
|
|
(srsym.typ=typesym))
|
|
) then
|
|
) then
|
|
@@ -2113,6 +2114,22 @@ implementation
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ function searchsym_in_record(recordh:tabstractrecorddef;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
|
|
+ var
|
|
|
|
+ hashedid : THashedIDString;
|
|
|
|
+ begin
|
|
|
|
+ hashedid.id:=s;
|
|
|
|
+ srsymtable:=recordh.symtable;
|
|
|
|
+ srsym:=tsym(srsymtable.FindWithHash(hashedid));
|
|
|
|
+ if assigned(srsym) and is_visible_for_object(srsym,recordh) then
|
|
|
|
+ begin
|
|
|
|
+ addsymref(srsym);
|
|
|
|
+ result:=true;
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
|
|
+ srsym:=nil;
|
|
|
|
+ srsymtable:=nil;
|
|
|
|
+ end;
|
|
|
|
|
|
function searchsym_in_class_by_msgint(classh:tobjectdef;msgid:longint;out srdef : tdef;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
function searchsym_in_class_by_msgint(classh:tobjectdef;msgid:longint;out srdef : tdef;out srsym:tsym;out srsymtable:TSymtable):boolean;
|
|
var
|
|
var
|