Merge branch 'a12_2_a13'

This commit is contained in:
Basile Burg 2015-02-25 09:24:15 +01:00
commit 30400b865e
5 changed files with 109 additions and 134 deletions

View File

@ -2,36 +2,6 @@ module cesyms;
import std.stdio, std.path, std.file, std.array, std.string; import std.stdio, std.path, std.file, std.array, std.string;
import std.d.lexer, std.d.ast, std.d.parser; 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 enum SymbolType
{ {
@ -93,9 +63,8 @@ void main(string[] args)
slb.visit(decl); slb.visit(decl);
} }
version(none)
// TODO-cfeature: Outputs the symbol tree in a format handlable by a Coedit widget {
int level = -1; int level = -1;
void print(Symbol * s) void print(Symbol * s)
{ {
@ -107,14 +76,12 @@ void main(string[] args)
level--; level--;
} }
//print(&slb.root); print(&slb.root);
}
auto str = slb.serialize; auto str = slb.serialize;
//std.file.write(r"C:\tool.txt",cast(ubyte[])str);
//std.file.write(r"C:\too.txt",cast(ubyte[])str);
write(str); write(str);
stdout.flush;
} }
class SymbolListBuilder : ASTVisitor class SymbolListBuilder : ASTVisitor
@ -139,7 +106,6 @@ class SymbolListBuilder : ASTVisitor
lfmApp.put(">\rend\r\n"); 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". /// returns a new symbol if the declarator is based on a Token named "name".
@ -161,7 +127,7 @@ class SymbolListBuilder : ASTVisitor
{ {
count++; count++;
auto result = new Symbol; auto result = new Symbol;
result.name = adt.name.text.idup; result.name = adt.name.text;
result.line = adt.name.line; result.line = adt.name.line;
result.col = adt.name.column; result.col = adt.name.column;
parent.subs ~= result; parent.subs ~= result;
@ -242,7 +208,7 @@ class SymbolListBuilder : ASTVisitor
final override void visit(const MixinDeclaration decl) final override void visit(const MixinDeclaration decl)
{ {
// TODO-cfeature: MixinDeclaration, just display the name of the mixed template. // 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) final override void visit(const StructDeclaration decl)

View File

@ -225,6 +225,7 @@ void main(string[] args)
// samples for testing the program as a runnable ('Compile and runfile ...') with '<CFF>' // samples for testing the program as a runnable ('Compile and runfile ...') with '<CFF>'
// fixme-p8: èuèuuè``u`èuùè
// fixme-p8: fixme also handled // fixme-p8: fixme also handled
// TODO-cINVALID_because_no_content: // TODO-cINVALID_because_no_content:
// TODO: set this property as const() to set it read only. // TODO: set this property as const() to set it read only.

View File

@ -213,6 +213,11 @@ type
*) *)
procedure processOutputToStrings(aProcess: TProcess; var aList: TStringList); procedure processOutputToStrings(aProcess: TProcess; var aList: TStringList);
(**
* Copy available process output to a stream.
*)
procedure processOutputToStream(aProcess: TProcess; output: TMemoryStream);
(** (**
* Terminates and frees aProcess; * Terminates and frees aProcess;
*) *)
@ -810,6 +815,25 @@ begin
end; end;
end; end;
procedure processOutputToStream(aProcess: TProcess; output: TMemoryStream);
var
sum, cnt: Integer;
const
buffSz = 2048;
begin
if not (poUsePipes in aProcess.Options) then
exit;
//
sum := output.Size;
while aProcess.Output.NumBytesAvailable <> 0 do begin
output.SetSize(sum + buffSz);
cnt := aProcess.Output.Read((output.Memory + sum)^, buffSz);
sum += cnt;
end;
output.SetSize(sum);
output.Position := sum;
end;
procedure killProcess(var aProcess: TAsyncProcess); procedure killProcess(var aProcess: TAsyncProcess);
begin begin
if aProcess = nil then if aProcess = nil then

View File

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

View File

@ -79,11 +79,12 @@ type
procedure handleListClick(Sender: TObject); procedure handleListClick(Sender: TObject);
procedure mnuAutoRefreshClick(Sender: TObject); procedure mnuAutoRefreshClick(Sender: TObject);
private private
fToolOutput: TMemoryStream;
fAutoRefresh: Boolean; fAutoRefresh: Boolean;
fSingleClick: Boolean; fSingleClick: Boolean;
fProj: TCEProject; fProj: TCEProject;
fDoc: TCESynMemo; fDoc: TCESynMemo;
fToolProcess: TCheckedAsyncProcess; fToolProc: TCheckedAsyncProcess;
fTodos: TTodoItems; fTodos: TTodoItems;
fMsgs: ICEMessagesDisplay; fMsgs: ICEMessagesDisplay;
fOptions: TCETodoOptions; fOptions: TCETodoOptions;
@ -107,7 +108,8 @@ type
function getContext: TTodoContext; function getContext: TTodoContext;
procedure killToolProcess; procedure killToolProcess;
procedure callToolProcess; procedure callToolProcess;
procedure procOutput(sender: TObject); procedure toolTerminated(sender: TObject);
procedure toolOutputData(sender: TObject);
procedure procOutputDbg(sender: TObject); procedure procOutputDbg(sender: TObject);
procedure clearTodoList; procedure clearTodoList;
procedure fillTodoList; procedure fillTodoList;
@ -193,6 +195,7 @@ var
begin begin
inherited; inherited;
// //
fToolOutput := TMemoryStream.Create;
fOptions := TCETodoOptions.Create(self); fOptions := TCETodoOptions.Create(self);
fOptions.autoRefresh := true; fOptions.autoRefresh := true;
fOptions.Name := 'todolistOptions'; fOptions.Name := 'todolistOptions';
@ -230,6 +233,7 @@ destructor TCETodoListWidget.destroy;
begin begin
fOptions.saveToFile(getCoeditDocPath + OptFname); fOptions.saveToFile(getCoeditDocPath + OptFname);
killToolProcess; killToolProcess;
fToolOutput.Free;
inherited; inherited;
end; end;
@ -364,11 +368,11 @@ end;
procedure TCETodoListWidget.killToolProcess; procedure TCETodoListWidget.killToolProcess;
begin begin
if fToolProcess = nil then exit; if fToolProc = nil then exit;
// //
fToolProcess.Terminate(0); fToolProc.Terminate(0);
fToolProcess.Free; fToolProc.Free;
fToolProcess := nil; fToolProc := nil;
end; end;
procedure TCETodoListWidget.callToolProcess; procedure TCETodoListWidget.callToolProcess;
@ -382,26 +386,19 @@ begin
// //
killToolProcess; killToolProcess;
// process parameter // process parameter
fToolProcess := TCheckedAsyncProcess.Create(nil); fToolProc := TCheckedAsyncProcess.Create(nil);
fToolProcess.Executable := ToolExeName; fToolProc.Executable := ToolExeName;
fToolProcess.Options := [poUsePipes]; fToolProc.Options := [poUsePipes];
fToolProcess.ShowWindow := swoHIDE; fToolProc.ShowWindow := swoHIDE;
fToolProcess.CurrentDirectory := ExtractFileDir(Application.ExeName); fToolProc.CurrentDirectory := ExtractFileDir(Application.ExeName);
fToolProc.OnTerminate := @toolTerminated;
// Something not quite clear: fToolProc.OnReadData := @toolOutputData;
// --------------------------
// actually the two events can be called, depending
// on the amount of data in the output.
// many: OnReadData is called.
// few: OnTerminate is called.
fToolProcess.OnTerminate := @procOutput;
fToolProcess.OnReadData := @procOutput;
// files passed to the tool argument // files passed to the tool argument
if ctxt = tcProject then fToolProcess.Parameters.AddText(symbolExpander.get('<CPFS>')) if ctxt = tcProject then fToolProc.Parameters.AddText(symbolExpander.get('<CPFS>'))
else fToolProcess.Parameters.Add(symbolExpander.get('<CFF>')); else fToolProc.Parameters.Add(symbolExpander.get('<CFF>'));
// //
fToolProcess.Execute; fToolProc.Execute;
end; end;
procedure TCETodoListWidget.procOutputDbg(sender: TObject); procedure TCETodoListWidget.procOutputDbg(sender: TObject);
@ -413,7 +410,7 @@ begin
getMessageDisplay(fMsgs); getMessageDisplay(fMsgs);
str := TStringList.Create; str := TStringList.Create;
try try
processOutputToStrings(fToolProcess, str); processOutputToStrings(fToolProc, str);
ctxt := getContext; ctxt := getContext;
for msg in str do case ctxt of for msg in str do case ctxt of
tcNone: fMsgs.message(msg, nil, amcMisc, amkAuto); tcNone: fMsgs.message(msg, nil, amcMisc, amkAuto);
@ -425,29 +422,22 @@ begin
end; end;
end; end;
procedure TCETodoListWidget.procOutput(sender: TObject); procedure TCETodoListWidget.toolOutputData(sender: TObject);
var
str: TMemoryStream;
cnt: Integer;
sum: Integer;
const
buffSz = 1024;
begin begin
sum := 0; processOutputToStream(fToolProc, fToolOutput);
str := TMemoryStream.Create;
try
while fToolProcess.Output.NumBytesAvailable <> 0 do begin
str.SetSize(sum + buffSz);
cnt := fToolProcess.Output.Read((str.Memory + sum)^, buffSz);
sum += cnt;
end; end;
str.SetSize(sum);
str.Position := 0; procedure TCETodoListWidget.toolTerminated(sender: TObject);
fTodos.loadFromTxtStream(str); begin
processOutputToStream(fToolProc, fToolOutput);
fToolOutput.Position := 0;
//TODO-cbugfix: UTF chars in TODO comments bug either in the widget or the tool, symptom: empty todo list, conditions: to determine.
//fToolOutput.SaveToFile('C:\cetodo_widgetside.txt');
fTodos.loadFromTxtStream(fToolOutput);
fillTodoList; fillTodoList;
finally fToolProc.OnTerminate := nil;
str.Free; fToolProc.OnReadData := nil;
end; fToolOutput.Clear;
end; end;
procedure TCETodoListWidget.clearTodoList; procedure TCETodoListWidget.clearTodoList;