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
{
@ -58,18 +28,18 @@ struct Symbol
void serialize(ref Appender!string lfmApp)
{
lfmApp.put(" \r item\r");
lfmApp.put("\ritem\r");
lfmApp.put(format(" line = %d\r", line));
lfmApp.put(format(" col = %d\r", col));
lfmApp.put(format(" name = '%s'\r", name));
lfmApp.put(format(" symType = %s\r", type));
lfmApp.put(format("line = %d\r", line));
lfmApp.put(format("col = %d\r", col));
lfmApp.put(format("name = '%s'\r", name));
lfmApp.put(format("symType = %s\r", type));
lfmApp.put(" subs = <");
lfmApp.put("subs = <");
if (subs.length) foreach(Symbol * sub; subs)
sub.serialize(lfmApp);
lfmApp.put(">\r");
lfmApp.put(" end\r");
lfmApp.put("end\r");
}
}
@ -91,30 +61,27 @@ void main(string[] args)
{
slb.resetRoot;
slb.visit(decl);
}
// TODO-cfeature: Outputs the symbol tree in a format handlable by a Coedit widget
int level = -1;
void print(Symbol * s)
{
foreach(i; 0 .. level) write(".");
level++;
write(s.name, '\r');
foreach(ss; s.subs)
print(ss);
level--;
}
//print(&slb.root);
version(none)
{
int level = -1;
void print(Symbol * s)
{
foreach(i; 0 .. level) write(".");
level++;
write(s.name, '\r');
foreach(ss; s.subs)
print(ss);
level--;
}
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
@ -134,12 +101,11 @@ class SymbolListBuilder : ASTVisitor
Appender!string lfmApp;
lfmApp.reserve(count * 64);
lfmApp.put("object TSymbolList\r symbols = <");
lfmApp.put("object TSymbolList\rsymbols = <");
foreach(Symbol * sym; root.subs) sym.serialize(lfmApp);
lfmApp.put(">\rend\r\n");
return lfmApp.data;
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;
@ -185,7 +151,7 @@ class SymbolListBuilder : ASTVisitor
dt.accept(this);
}
}
final override void visit(const AliasDeclaration decl)
{
// old alias syntax not supported by this.
@ -201,7 +167,7 @@ class SymbolListBuilder : ASTVisitor
final override void visit(const EnumDeclaration decl)
{
// TODO-ctest: try to see if what dmd outputs as , "enum member" is handled.
//TODO-ctest: try to see if what dmd outputs as , "enum member" is handled.
namedVisitorImpl!(EnumDeclaration, SymbolType._class)(decl);
}
@ -241,8 +207,8 @@ 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.
// TODO-cfeature: MixinDeclaration, just display the name of the mixed template.
// 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