diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index bec289689c..36c06e9a23 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -12837,6 +12837,8 @@ begin Result:=ConvertProcedureType(TPasProcedureType(El),GlobalCtx) else if (C=TPasArrayType) then Result:=ConvertArrayType(TPasArrayType(El),GlobalCtx) + else if (C=TPasSpecializeType) then + // specialize type is converted at the generic type else begin {$IFDEF VerbosePas2JS} diff --git a/packages/pastojs/tests/tcgenerics.pas b/packages/pastojs/tests/tcgenerics.pas index 21a7ef5540..624333552c 100644 --- a/packages/pastojs/tests/tcgenerics.pas +++ b/packages/pastojs/tests/tcgenerics.pas @@ -14,9 +14,15 @@ type TTestGenerics = class(TCustomTestModule) Published + // generic record Procedure TestGeneric_RecordEmpty; + + // generic class Procedure TestGeneric_ClassEmpty; Procedure TestGeneric_Class_EmptyMethod; + + // generic external class + procedure TestGen_ExtClass_Array; end; implementation @@ -119,6 +125,65 @@ begin ])); end; +procedure TTestGenerics.TestGen_ExtClass_Array; +begin + StartProgram(false); + Add([ + '{$mode delphi}', + '{$ModeSwitch externalclass}', + 'type', + ' NativeInt = longint;', + ' TJSGenArray = Class external name ''Array''', + ' private', + ' function GetElements(Index: NativeInt): T; external name ''[]'';', + ' procedure SetElements(Index: NativeInt; const AValue: T); external name ''[]'';', + ' public', + ' type TSelfType = TJSGenArray;', + ' public', + ' FLength : NativeInt; external name ''length'';', + ' constructor new; overload;', + ' constructor new(aLength : NativeInt); overload;', + ' class function _of() : TSelfType; varargs; external name ''of'';', + ' function fill(aValue : T) : TSelfType; overload;', + ' function fill(aValue : T; aStartIndex : NativeInt) : TSelfType; overload;', + ' function fill(aValue : T; aStartIndex,aEndIndex : NativeInt) : TSelfType; overload;', + ' property Length : NativeInt Read FLength Write FLength;', + ' property Elements[Index: NativeInt]: T read GetElements write SetElements; default;', + ' end;', + ' TJSWordArray = TJSGenArray;', + 'var', + ' wa: TJSWordArray;', + ' w: word;', + 'begin', + ' wa:=TJSWordArray.new;', + ' wa:=TJSWordArray.new(3);', + ' wa:=TJSWordArray._of(4,5);', + ' wa:=wa.fill(7);', + ' wa:=wa.fill(7,8,9);', + ' w:=wa.length;', + ' wa.length:=10;', + ' wa[11]:=w;', + ' w:=wa[12];', + '']); + ConvertProgram; + CheckSource('TestGen_ExtClass_Array', + LinesToStr([ // statements + 'this.wa = null;', + 'this.w = 0;', + '']), + LinesToStr([ // $mod.$main + '$mod.wa = new Array();', + '$mod.wa = new Array(3);', + '$mod.wa = Array.of(4, 5);', + '$mod.wa = $mod.wa.fill(7);', + '$mod.wa = $mod.wa.fill(7, 8, 9);', + '$mod.w = $mod.wa.length;', + '$mod.wa.length = 10;', + '$mod.wa[11] = $mod.w;', + '$mod.w = $mod.wa[12];', + ''])); +end; + Initialization RegisterTests([TTestGenerics]); end.