diff options
author | mattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-11-28 11:42:42 +0000 |
---|---|---|
committer | mattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-11-28 11:42:42 +0000 |
commit | c95d37e4a9858990acbf7a6d7efe5758e702c4af (patch) | |
tree | 958605b352c83686c5ed248e562fdd94f26e87a8 /packages | |
parent | f7d9f515048f60ec73aee8392f391b70bd7ae801 (diff) | |
download | fpc-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.pp | 2 | ||||
-rw-r--r-- | packages/pastojs/tests/tcmodules.pas | 65 |
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', |