added syntactic errors to symbol list

+ option to auto expand warn/err list
This commit is contained in:
Basile Burg 2015-03-12 12:50:29 +01:00
parent 11326abf36
commit 2a6b8f757d
3 changed files with 156 additions and 74 deletions

View File

@ -11,10 +11,12 @@ void main(string[] args)
if (!fname.exists) return;
// load and parse the file
auto config = LexerConfig(fname, StringBehavior.source, WhitespaceBehavior.include);
auto config = LexerConfig(fname, StringBehavior.source, WhitespaceBehavior.skip);
auto source = cast(ubyte[]) read(fname, size_t.max);
auto scache = StringCache(StringCache.defaultBucketCount);
auto ast = parseModule(getTokensForParser(source, config, &scache), fname);
auto ast = parseModule(getTokensForParser(source, config, &scache), fname, null, &(SymbolListBuilder.astError));
// visit each root member
auto slb = construct!SymbolListBuilder;
@ -87,17 +89,19 @@ if (is(T == class) || (isPointer!T && is(PointerTarget!T == struct)))
// Serializable Symbol --------------------------------------------------------+
enum SymbolType
{
_alias, // X
_class, // X
_enum, // X
_function, // X
_interface, // X
_import, // X
_mixin, // X (template decl)
_struct, // X
_template, // X
_union, // X
_variable // X
_alias,
_class,
_enum,
_function,
_interface,
_import,
_mixin, // (template decl)
_struct,
_template,
_union,
_variable,
_error,
_warning
}
struct Symbol
@ -137,6 +141,7 @@ class SymbolListBuilder : ASTVisitor
{
Symbol * root;
Symbol * parent;
static Symbol * [] illFormed;
size_t count;
alias visit = ASTVisitor.visit;
@ -144,6 +149,8 @@ class SymbolListBuilder : ASTVisitor
this()
{
root = construct!Symbol;
if(illFormed.length)
root.subs ~= illFormed;
resetRoot;
}
@ -152,6 +159,16 @@ class SymbolListBuilder : ASTVisitor
root.destruct;
}
static void astError(string fname, size_t line, size_t col, string msg, bool isErr)
{
Symbol * newSym = construct!Symbol;
newSym.col = col;
newSym.line = line;
newSym.name = msg;
isErr ? newSym.type = SymbolType._error : newSym.type = SymbolType._warning;
illFormed ~= newSym;
}
final void resetRoot(){parent = root;}
final string serialize()

View File

@ -36,7 +36,7 @@ inherited CESymbolListWidget: TCESymbolListWidget
OnKeyPress = TreeKeyPress
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoRightClickSelect, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
Items.Data = {
F9FFFFFF02000B000000000000000000000000000000FFFFFFFF000000000000
F9FFFFFF02000D000000000000000000000000000000FFFFFFFF000000000000
00000005000000416C696173010000000100000001000000FFFFFFFF00000000
000000000005000000436C617373020000000200000002000000FFFFFFFF0000
0000000000000004000000456E756D030000000300000003000000FFFFFFFF00
@ -48,7 +48,9 @@ inherited CESymbolListWidget: TCESymbolListWidget
6374080000000800000008000000FFFFFFFF0000000000000000000800000054
656D706C617465000000000000000000000000FFFFFFFF000000000000000000
05000000556E696F6E010000000100000001000000FFFFFFFF00000000000000
0000080000005661726961626C65
0000080000005661726961626C65090000000900000009000000FFFFFFFF0000
00000000000000080000005761726E696E67730A0000000A0000000A000000FF
FFFFFF000000000000000000060000004572726F7273
}
TreeLineColor = 14671839
TreeLinePenStyle = psSolid
@ -106,7 +108,7 @@ inherited CESymbolListWidget: TCESymbolListWidget
left = 152
top = 48
Bitmap = {
4C69090000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
4C690B0000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
@ -394,6 +396,70 @@ inherited CESymbolListWidget: TCESymbolListWidget
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF003B85CC003B85CC003B85CC003B85CC003B85
CC003B85CC003983CA213384CDFF3384CDFF3983CA213B85CC003B85CC003B85
CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85
CC003983CB00337EC7CF84C3F1FF84C3F1FF337EC7CF3983CB003B85CC003B85
CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003A84
CB003580CA6D5398D7FFC1F0FFFFC1F0FFFF5398D7FF3580CA6D3A84CB003B85
CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003882
CA0A3A83CBFFB2E5FFFF9EC8DEFF9EC8DEFFB2E5FFFF3A83CBFF3882CA0A3B85
CC003B85CC003B85CC003B85CC003B85CC003B85CC003B85CC003983CB00337E
C8CF86BEEAFFA4ECFFFF6C5D53FF6C5D53FFA4ECFFFF86BEEAFF337EC8CF3983
CB003B85CC003B85CC003B85CC003B85CC003B85CC003A84CC003580C9585797
D5FFC6F3FFFF3ACAFFFF6C5B54FF6C5B54FF3ACAFFFFC6F3FFFF5797D5FF3580
C9583A84CC003B85CC003B85CC003B85CC003B85CC003882CA003C82C9FFC1E8
FDFF50CCFFFF27C5FFFF69554CFF69554CFF27C5FFFF50CCFFFFC1E8FDFF3C82
C9FF3882CA003B85CC003B85CC003B85CC003983CB00337EC8BB90BFE6FF6FD7
FFFF32C3FFFF34CBFFFF644B3FFF644B3FFF34CBFFFF32C3FFFF6FD7FFFF90BF
E6FF337EC8BB3983CB003B85CC003A84CC003680C9445B97D4FF9EE8FFFF38C7
FFFF3DC8FFFF3DCFFFFF4BBCE9FF4BBCE9FF3DCFFFFF3DC8FFFF38C7FFFF9EE8
FFFF5B97D4FF3680C9443A84CC003982CB003F82C9FFA3E0FAFF40CFFFFF44CE
FFFF46CFFFFF44D6FFFF775C50FF775C50FF44D6FFFF46CFFFFF44CEFFFF40CF
FFFFA3E0FAFF3F82C9FF3982CB003880C9947AB8E4FF52DBFFFF4BD5FFFF4DD5
FFFF4DD6FFFF4BDCFFFF67493FFF67493FFF4BDCFFFF4DD6FFFF4DD5FFFF4BD5
FFFF52DBFFFF7AB8E4FF3880C9943B86CDFF55E3FFFF55E3FFFF56E1FFFF56E1
FFFF56E2FFFF56E5FFFF55E9FFFF55E9FFFF56E5FFFF56E2FFFF56E1FFFF56E1
FFFF55E3FFFF55E3FFFF3B86CDFF3A82CAFF397FC8FF387DC7FF387CC7FF397C
C7FF397CC7FF387DC7FF387EC9FF387EC9FF387DC7FF397CC7FF397CC7FF387C
C7FF387DC7FF397FC8FF3A82CAFF000000330000003300000033000000330000
0033000000330000003300000033000000330000003300000033000000330000
0033000000330000003300000033FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006A85
FC236984FA7D6782F9DB6580F7F3637EF5F3617CF3DB5F7AF17D5D77EF23FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006984FA536882
F9E66E83EEFF92A6F4FFA0B4F8FFA0B4F8FF91A6F3FF687DE9FF5973EBE65671
E953FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006883F9536681F8F48497
F1FFA9BDFBFF8AA3F8FF6B89F6FF6B89F6FF89A2F8FFA8BCFAFF7F92ECFF526C
E4F44F69E253FFFFFF00FFFFFF00FFFFFF006781F822657FF6E58397F0FFA9BD
FBFF6382F5FF6382F5FFFFFFFFFFFFFFFFFF617EF3FF607CF3FFA6B9F9FF7B8D
EAFF4A64DEE54862DB22FFFFFF00FFFFFF00637EF57E6C81ECFFA9BDFBFF6382
F5FF6281F5FF6280F4FFFFFFFFFFFFFFFFFF5F7AF1FF5F78F0FF5D76EFFFA5B5
F8FF5D70DDFF435DD77EFFFFFF00FFFFFF005F7AF1DB91A6F3FF88A1F8FF6280
F4FF617EF3FF607CF3FFFFFFFFFFFFFFFFFF5D76EFFF5C73EEFF5B70ECFF8293
F1FF8998ECFF3E58D2DBFFFFFF00FFFFFF005B76EDF6A1B6F8FF6784F4FF607C
F3FF5F7AF1FF5F78F0FFFFFFFFFFFFFFFFFF5B70ECFF5A6EEBFF596CEAFF5F6F
E9FF9BA8F1FF3A53CEF6FFFFFF00FFFFFF005771E9F6A0B3F7FF6580F2FF5F78
F0FF5D76EFFF5C73EEFFD3D9FAFFFFFFFFFF596CEAFF5869E8FF5767E7FF5D6C
E7FF99A5F1FF354FCAF6FFFFFF00FFFFFF00526DE5DB8E9FF0FF8499F4FF5C73
EEFF5B70ECFF5A6EEBFF909DF1FFA6AFF3FF5767E7FF5665E6FF5562E5FF7D89
EBFF8591E7FF314AC6DBFFFFFF00FFFFFF004E68E17E6073E0FFA4B3F7FF5A6E
EBFF596CEAFF5869E8FFFFFFFFFFFFFFFFFF5562E5FF5461E3FF535FE2FF9FA9
F2FF5061D1FF2D46C27EFFFFFF00FFFFFF004963DC224660DAE57888E6FFA3B0
F5FF5767E7FF5665E6FF8992EDFF8892ECFF535FE2FF525DE1FF9FA9F2FF6F7D
DDFF2B44C0E52942BE22FFFFFF00FFFFFF00FFFFFF00425CD5533F59D3F47584
E3FFA1ACF4FF7F8BECFF5C67E4FF5B66E3FF7D87EAFF9FA8F1FF6F7CDDFF2943
BFF42741BD53FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003A54CF533852
CCE65264D4FF8490E7FF95A0EEFF959FEDFF838EE5FF4C5DCEFF2841BDE6263F
BB53FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00334D
C823314BC67D2F48C4DB2C46C2F32A44C0F32842BEDB2640BC7D243EBA23FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00
}
end

View File

@ -23,7 +23,9 @@ type
_struct,
_template,
_union,
_variable
_variable,
_error,
_warning
);
TSymbolCollection = class;
@ -78,6 +80,7 @@ type
fShowChildCategories: boolean;
fAutoRefreshDelay: Integer;
fSmartFilter: boolean;
fAutoExpandErrors: boolean;
published
property autoRefresh: boolean read fAutoRefresh write fAutoRefresh;
property refreshOnChange: boolean read fRefreshOnChange write fRefreshOnChange;
@ -85,6 +88,7 @@ type
property showChildCategories: boolean read fShowChildCategories write fShowChildCategories;
property autoRefreshDelay: Integer read fAutoRefreshDelay write fAutoRefreshDelay;
property smartFilter: boolean read fSmartFilter write fSmartFilter;
property autoExpandErrors: boolean read fAutoExpandErrors write fAutoExpandErrors;
public
constructor Create(AOwner: TComponent); override;
procedure Assign(Source: TPersistent); override;
@ -122,9 +126,11 @@ type
fRefreshOnFocus: boolean;
fShowChildCategories: boolean;
fSmartFilter: boolean;
fAutoExpandErrors: boolean;
fToolOutput: TMemoryStream;
ndAlias, ndClass, ndEnum, ndFunc, ndUni: TTreeNode;
ndImp, ndIntf, ndMix, ndStruct, ndTmp, ndVar: TTreeNode;
ndImp, ndIntf, ndMix, ndStruct, ndTmp: TTreeNode;
ndVar, ndWarn, ndErr: TTreeNode;
procedure TreeDblClick(Sender: TObject);
procedure actRefreshExecute(Sender: TObject);
procedure actAutoRefreshExecute(Sender: TObject);
@ -218,11 +224,19 @@ end;
procedure TSymbolList.LoadFromTool(str: TStream);
var
bin: TMemoryStream;
dat: integer;
begin
bin := TMemoryStream.Create;
try
str.Position:=0;
ObjectTextToBinary(str, bin);
try
ObjectTextToBinary(str, bin);
except
// if output is not fully read then
// the tool process never terminates.
while str.Read(dat, SizeOf(dat)) <> 0 do;
exit;
end;
bin.Position:=0;
bin.ReadComponent(self);
finally
@ -237,6 +251,7 @@ begin
inherited;
fRefreshOnFocus := true;
fShowChildCategories := true;
fAutoExpandErrors := true;
fSmartFilter := true;
fAutoRefreshDelay := 1500;
end;
@ -255,6 +270,7 @@ begin
fAutoRefresh := widg.fAutoRefresh;
fShowChildCategories := widg.fShowChildCategories;
fSmartFilter := widg.fSmartFilter;
fAutoExpandErrors := widg.fAutoExpandErrors;
end
else inherited;
end;
@ -273,6 +289,7 @@ begin
widg.fAutoRefresh := fAutoRefresh;
widg.fShowChildCategories := fShowChildCategories;
widg.fSmartFilter := fSmartFilter;
widg.fAutoExpandErrors := fAutoExpandErrors;
//
widg.fActAutoRefresh.Checked := fAutoRefresh;
widg.fActRefreshOnChange.Checked:= fRefreshOnChange;
@ -340,6 +357,8 @@ begin
ndTmp := Tree.Items[8];
ndUni := Tree.Items[9];
ndVar := Tree.Items[10];
ndWarn := Tree.Items[11];
ndErr := Tree.Items[12];
//
png := TPortableNetworkGraphic.Create;
try
@ -526,6 +545,8 @@ begin
ndTmp.Visible := ndTmp.Count > 0;
ndUni.Visible := ndUni.Count > 0;
ndVar.Visible := ndVar.Count > 0;
ndWarn.Visible := ndWarn.Count > 0;
ndErr.Visible := ndErr.Count > 0;
end else
begin
ndAlias.Visible := true;
@ -539,6 +560,8 @@ begin
ndTmp.Visible := true;
ndUni.Visible := true;
ndVar.Visible := true;
ndWarn.Visible := true;
ndErr.Visible := true;
end;
end;
@ -555,6 +578,8 @@ begin
ndTmp.DeleteChildren;
ndUni.DeleteChildren;
ndVar.DeleteChildren;
ndWarn.DeleteChildren;
ndErr.DeleteChildren;
end;
procedure TCESymbolListWidget.TreeFilterEdit1AfterFilter(Sender: TObject);
@ -636,6 +661,13 @@ end;
procedure TCESymbolListWidget.toolTerminated(sender: TObject);
//
function getCatNode(node: TTreeNode; stype: TSymbolType ): TTreeNode;
//
function newCat(const aCat: string): TTreeNode;
begin
result := node.FindNode(aCat);
if result = nil then result := node.TreeNodes.AddChild(node, aCat);
end;
//
begin
if node = nil then case stype of
_alias : exit(ndAlias);
@ -649,62 +681,22 @@ begin
_template : exit(ndTmp);
_union : exit(ndUni);
_variable : exit(ndVar);
_warning : exit(ndWarn);
_error : exit(ndErr);
end else case stype of
_alias:
begin
result := node.FindNode('Alias');
if result = nil then result := node.TreeNodes.AddChild(node, 'Alias');
end;
_class:
begin
result := node.FindNode('Class');
if result = nil then result := node.TreeNodes.AddChild(node, 'Class');
end;
_enum:
begin
result := node.FindNode('Enum');
if result = nil then result := node.TreeNodes.AddChild(node, 'Enum');
end;
_function:
begin
result := node.FindNode('Function');
if result = nil then result := node.TreeNodes.AddChild(node, 'Function');
end;
_import:
begin
result := node.FindNode('Import');
if result = nil then result := node.TreeNodes.AddChild(node, 'Import');
end;
_interface:
begin
result := node.FindNode('Interface');
if result = nil then result := node.TreeNodes.AddChild(node, 'Interface');
end;
_mixin:
begin
result := node.FindNode('Mixin');
if result = nil then result := node.TreeNodes.AddChild(node, 'Mixin');
end;
_struct:
begin
result := node.FindNode('Struct');
if result = nil then result := node.TreeNodes.AddChild(node, 'Struct');
end;
_template:
begin
result := node.FindNode('Template');
if result = nil then result := node.TreeNodes.AddChild(node, 'Template');
end;
_union:
begin
result := node.FindNode('Union');
if result = nil then result := node.TreeNodes.AddChild(node, 'Union');
end;
_variable:
begin
result := node.FindNode('Variable');
if result = nil then result := node.TreeNodes.AddChild(node, 'Variable');
end;
_alias: exit(newCat('Alias'));
_class: exit(newCat('Class'));
_enum: exit(newCat('Enum'));
_function: exit(newCat('Function'));
_import: exit(newCat('Import'));
_interface: exit(newCat('Interface'));
_mixin: exit(newCat('Mixin'));
_struct: exit(newCat('Struct'));
_template: exit(newCat('Template'));
_union: exit(newCat('Union'));
_variable: exit(newCat('Variable'));
_warning: exit(ndWarn);
_error: exit(ndErr);
end;
end;
//
@ -743,6 +735,13 @@ begin
tree.BeginUpdate;
for i := 0 to fSyms.symbols.Count-1 do
symbolToTreeNode(nil, fSyms.symbols[i]);
if fAutoExpandErrors then
begin
if ndWarn.Visible then
ndWarn.Expand(true);
if ndErr.Visible then
ndErr.Expand(true);
end;
tree.EndUpdate;
end;
{$ENDREGION --------------------------------------------------------------------}