summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authormattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2>2020-11-28 11:42:42 +0000
committermattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2>2020-11-28 11:42:42 +0000
commitc95d37e4a9858990acbf7a6d7efe5758e702c4af (patch)
tree958605b352c83686c5ed248e562fdd94f26e87a8 /packages
parentf7d9f515048f60ec73aee8392f391b70bd7ae801 (diff)
downloadfpc-c95d37e4a9858990acbf7a6d7efe5758e702c4af.tar.gz
pastojs: fixed typeinfo path of inline specialize type
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@47614 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages')
-rw-r--r--packages/pastojs/src/fppas2js.pp2
-rw-r--r--packages/pastojs/tests/tcmodules.pas65
2 files changed, 65 insertions, 2 deletions
diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp
index 54493888dd..3cb1dfe021 100644
--- a/packages/pastojs/src/fppas2js.pp
+++ b/packages/pastojs/src/fppas2js.pp
@@ -19467,6 +19467,8 @@ var
Bracket: TJSBracketMemberExpression;
begin
El:=ResolveSimpleAliasType(El);
+ if El is TPasSpecializeType then
+ El:=TPasSpecializeTypeData(El.CustomData).SpecializedType;
aName:=GetTypeInfoName(El,AContext,ErrorEl);
if aName=GetBIName(pbivnRTTILocal) then
Result:=CreatePrimitiveDotExpr(aName,El)
diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas
index 124d64ba44..5bea93d08f 100644
--- a/packages/pastojs/tests/tcmodules.pas
+++ b/packages/pastojs/tests/tcmodules.pas
@@ -843,6 +843,7 @@ type
Procedure TestRTTI_Interface_COM;
Procedure TestRTTI_ClassHelper;
Procedure TestRTTI_ExternalClass;
+ Procedure TestRTTI_Unit;
// Resourcestring
Procedure TestResourcestringProgram;
@@ -30681,7 +30682,7 @@ begin
Add('{$modeswitch externalclass}');
Add('type');
Add(' TRec = record end;');
- // ToDo: ^PRec
+ // ToDo: ^TRec
Add(' TObject = class end;');
Add(' TClass = class of tobject;');
Add('var');
@@ -30691,7 +30692,7 @@ begin
Add(' tiClass: ttypeinfoclass;');
Add(' aClass: tclass;');
Add(' tiClassRef: ttypeinfoclassref;');
- // ToDo: ^PRec
+ // ToDo: ^TRec
Add(' tiPointer: ttypeinfopointer;');
Add('begin');
Add(' tirecord:=typeinfo(trec);');
@@ -31110,6 +31111,66 @@ begin
'']));
end;
+procedure TTestModule.TestRTTI_Unit;
+begin
+ WithTypeInfo:=true;
+ AddModuleWithIntfImplSrc('unit2.pas',
+ LinesToStr([
+ '{$mode delphi}',
+ 'type',
+ ' TWordArray = array of word;',
+ ' TArray<T> = array of T;',
+ '']),
+ '');
+ StartUnit(true,[supTypeInfo,supTInterfacedObject]);
+ Add([
+ '{$mode delphi}',
+ 'interface',
+ 'uses unit2;',
+ 'type',
+ ' IBird = interface',
+ ' function Swoop: TWordArray;',
+ ' function Glide: TArray<word>;',
+ ' end;',
+ 'procedure Fly;',
+ 'implementation',
+ 'procedure Fly;',
+ 'var',
+ ' ta: tTypeInfoDynArray;',
+ ' ti: tTypeInfoInterface;',
+ 'begin',
+ ' ta:=typeinfo(TWordArray);',
+ ' ta:=typeinfo(TArray<word>);',
+ ' ti:=typeinfo(IBird);',
+ 'end;',
+ '']);
+ ConvertUnit;
+ CheckSource('TestRTTI_ExternalClass',
+ LinesToStr([ // statements
+ 'rtl.createInterface(',
+ ' this,',
+ ' "IBird",',
+ ' "{3B98AAAC-6116-3E17-AA85-F16786D85B09}",',
+ ' ["Swoop", "Glide"],',
+ ' pas.system.IUnknown,',
+ ' function () {',
+ ' var $r = this.$rtti;',
+ ' $r.addMethod("Swoop", 1, null, pas.unit2.$rtti["TWordArray"]);',
+ ' $r.addMethod("Glide", 1, null, pas.unit2.$rtti["TArray<System.Word>"]);',
+ ' }',
+ ');',
+ 'this.Fly = function () {',
+ ' var ta = null;',
+ ' var ti = null;',
+ ' ta = pas.unit2.$rtti["TWordArray"];',
+ ' ta = pas.unit2.$rtti["TArray<System.Word>"];',
+ ' ti = $mod.$rtti["IBird"];',
+ '};',
+ '']),
+ LinesToStr([ // $mod.$main
+ '']));
+end;
+
procedure TTestModule.TestResourcestringProgram;
begin
AddModuleWithIntfImplSrc('unit2.pas',