From 8a10f0f4b9fd81cfc4941523257a51839a70f79e Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Thu, 17 Oct 2019 15:00:36 +0000 Subject: [PATCH] pastojs: generic function: infer types git-svn-id: trunk@43213 - --- packages/pastojs/src/fppas2js.pp | 5 +- packages/pastojs/tests/tcgenerics.pas | 77 ++++++++++++++++++++++++++- 2 files changed, 79 insertions(+), 3 deletions(-) diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index 5b5e2a3950..19b6d3a10f 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -1191,7 +1191,8 @@ const msArrayOperators, msPrefixedAttributes, msOmitRTTI, - msMultiHelpers]; + msMultiHelpers, + msImplicitFunctionSpec]; bsAllPas2jsBoolSwitchesReadOnly = [ bsLongStrings @@ -13399,7 +13400,7 @@ begin begin P:=TPasElement(El.Declarations[i]); {$IFDEF VerbosePas2JS} - //writeln('TPasToJSConverter.ConvertDeclarations El[',i,']=',GetObjName(P)); + writeln('TPasToJSConverter.ConvertDeclarations El[',i,']=',GetObjName(P)); {$ENDIF} if not IsElementUsed(P) then continue; diff --git a/packages/pastojs/tests/tcgenerics.pas b/packages/pastojs/tests/tcgenerics.pas index 693e52a79a..1be4e2cc24 100644 --- a/packages/pastojs/tests/tcgenerics.pas +++ b/packages/pastojs/tests/tcgenerics.pas @@ -42,7 +42,9 @@ type procedure TestGenProc_Function_ObjFPC; procedure TestGenProc_Function_Delphi; procedure TestGenProc_Overload; - // ToDo: inference Fly(3); + procedure TestGenProc_Forward; + procedure TestGenProc_Infer_OverloadForward; + // ToDo: specialize before impl end; implementation @@ -716,6 +718,79 @@ begin ''])); end; +procedure TTestGenerics.TestGenProc_Forward; +begin + StartProgram(false); + Add([ + '{$mode delphi}', + 'procedure Run(a: S; b: boolean); forward;', + 'procedure Run(a: S; b: boolean);', + 'begin', + ' Run(1,true);', + 'end;', + 'begin', + ' Run(1.3,true);', + '']); + ConvertProgram; + CheckSource('TestGenProc_infer_OverloadForward', + LinesToStr([ // statements + 'this.Run$s0 = function (a, b) {', + ' $mod.Run$s0(1, true);', + '};', + 'this.Run$s1 = function (a, b) {', + ' $mod.Run$s0(1, true);', + '};', + '']), + LinesToStr([ // $mod.$main + '$mod.Run$s1(1.3, true);', + ''])); +end; + +procedure TTestGenerics.TestGenProc_Infer_OverloadForward; +begin + StartProgram(false); + Add([ + '{$mode delphi}', + 'procedure {#A}Run(a: S; b: boolean); forward; overload;', + 'procedure {#B}Run(a: T; w: word); forward; overload;', + 'procedure {#C}Run(a: U; b: U); forward; overload;', + 'procedure {#A2}Run(a: S; b: boolean); overload;', + 'begin', + ' {@A}Run(1,true);', // non generic take precedence + ' {@B}Run(2,word(3));', // non generic take precedence + ' {@C}Run(''foo'',''bar'');', + 'end;', + 'procedure {#B2}Run(a: T; w: word); overload;', + 'begin', + 'end;', + 'procedure {#C2}Run(a: U; b: U); overload;', + 'begin', + 'end;', + 'begin', + ' {@A}Run(1,true);', // non generic take precedence + ' {@B}Run(2,word(3));', // non generic take precedence + ' {@C}Run(''foo'',''bar'');', + '']); + ConvertProgram; + CheckSource('TestGenProc_infer_OverloadForward', + LinesToStr([ // statements + 'this.Run$s0 = function (a, b) {', + ' $mod.Run$s0(1, true);', + ' $mod.Run$1s0(2, 3);', + ' $mod.Run$2s0("foo", "bar");', + '};', + 'this.Run$1s0 = function (a, w) {', + '};', + 'this.Run$2s0 = function (a, b) {', + '};', + '']), + LinesToStr([ // $mod.$main + '$mod.Run$s0(1, true);', + '$mod.Run$1s0(2, 3);', + '$mod.Run$2s0("foo", "bar");', + ''])); +end; + Initialization RegisterTests([TTestGenerics]); end.