fix, in asyncprocess, output has to be accumulated in the two events

This commit is contained in:
Basile Burg 2015-02-25 09:23:29 +01:00
parent ac5c8e1ad4
commit 2c8182223f
2 changed files with 48 additions and 88 deletions

View File

@ -2,36 +2,6 @@ module cesyms;
import std.stdio, std.path, std.file, std.array, std.string;
import std.d.lexer, std.d.ast, std.d.parser;
static import std.conv;
interface I{}
alias Int32 = int;
//alias long Int64;
enum E
{
e1,
e2,
e3,
}
enum {opt1,opt2}
class A
{
class AA
{
class AA1{}
class AA2{}
}
class BB
{
class BB1{}
class BB2{}
}
}
enum SymbolType
{
@ -93,9 +63,8 @@ void main(string[] args)
slb.visit(decl);
}
// TODO-cfeature: Outputs the symbol tree in a format handlable by a Coedit widget
version(none)
{
int level = -1;
void print(Symbol * s)
{
@ -107,14 +76,12 @@ void main(string[] args)
level--;
}
//print(&slb.root);
print(&slb.root);
}
auto str = slb.serialize;
//std.file.write(r"C:\too.txt",cast(ubyte[])str);
//std.file.write(r"C:\tool.txt",cast(ubyte[])str);
write(str);
stdout.flush;
}
class SymbolListBuilder : ASTVisitor
@ -139,7 +106,6 @@ class SymbolListBuilder : ASTVisitor
lfmApp.put(">\rend\r\n");
return lfmApp.data;
}
/// returns a new symbol if the declarator is based on a Token named "name".
@ -161,7 +127,7 @@ class SymbolListBuilder : ASTVisitor
{
count++;
auto result = new Symbol;
result.name = adt.name.text.idup;
result.name = adt.name.text;
result.line = adt.name.line;
result.col = adt.name.column;
parent.subs ~= result;
@ -242,7 +208,7 @@ class SymbolListBuilder : ASTVisitor
final override void visit(const MixinDeclaration decl)
{
// TODO-cfeature: MixinDeclaration, just display the name of the mixed template.
// the template might be implemented in another module so their ùeùbrs cant be displayed.
// the template might be implemented in another module so their cant be displayed.
}
final override void visit(const StructDeclaration decl)

View File

@ -94,6 +94,7 @@ type
fAutoRefresh: boolean;
fRefreshOnChange: boolean;
fRefreshOnFocus: boolean;
fToolOutput: TMemoryStream;
ndAlias, ndClass, ndEnum, ndFunc, ndUni: TTreeNode;
ndImp, ndIntf, ndMix, ndStruct, ndTmp, ndVar: TTreeNode;
procedure TreeDblClick(Sender: TObject);
@ -106,7 +107,8 @@ type
procedure clearTree;
//
procedure callToolProc;
procedure symbolListProduced(sender: TObject);
procedure toolOutputData(sender: TObject);
procedure toolTerminated(sender: TObject);
//
procedure optget_AutoRefresh(aWriter: TWriter);
procedure optset_AutoRefresh(aReader: TReader);
@ -239,6 +241,7 @@ begin
inherited;
// allow empty name if owner is nil
fSyms := TSymbolList.create(nil);
fToolOutput := TMemoryStream.create;
//
ndAlias := Tree.Items[0];
ndClass := Tree.Items[1];
@ -271,6 +274,7 @@ begin
EntitiesConnector.removeObserver(self);
//
killProcess(fToolProc);
fToolOutput.free;
fSyms.Free;
inherited;
end;
@ -517,8 +521,8 @@ begin
fToolProc.ShowWindow := swoHIDE;
fToolProc.Options := [poUsePipes];
fToolProc.Executable := 'cesyms';
fToolProc.OnTerminate := @symbolListProduced;
fToolProc.OnReadData := @symbolListProduced;
fToolProc.OnTerminate := @toolTerminated;
fToolProc.OnReadData := @toolOutputData;
fToolProc.CurrentDirectory := ExtractFileDir(Application.ExeName);
// focused source
@ -531,13 +535,14 @@ begin
fToolProc.Execute;
end;
procedure TCESymbolListWidget.symbolListProduced(sender: TObject);
procedure TCESymbolListWidget.toolOutputData(sender: TObject);
begin
processOutputToStream(TProcess(sender), fToolOutput);
end;
procedure TCESymbolListWidget.toolTerminated(sender: TObject);
var
cnt, sum: Integer;
str: TmemoryStream;
i: Integer;
const
buffSz = 1024;
//
procedure symbolToTreeNode(sym: TSymbol);
var
@ -573,23 +578,12 @@ begin
updateVisibleCat;
if fDoc = nil then exit;
//
sum := 0;
str := TMemoryStream.Create;
try
while fToolProc.Output.NumBytesAvailable <> 0 do begin
str.SetSize(sum + buffSz);
cnt := fToolProc.Output.Read((str.Memory + sum)^, buffSz);
sum += cnt;
end;
str.SetSize(sum);
str.Position := 0;
//str.SaveToFile('C:\symlist.txt');
fSyms.LoadFromTool(str);
finally
str.Free;
end;
processOutputToStream(TProcess(sender), fToolOutput);
fToolOutput.Position := 0;
fSyms.LoadFromTool(fToolOutput);
fToolProc.OnTerminate := nil;
fToolProc.OnReadData := nil;
fToolOutput.Clear;
//
tree.BeginUpdate;
for i := 0 to fSyms.symbols.Count-1 do