Browse Source

fcl-passrc: fixed alias type of member type

git-svn-id: trunk@44202 -
Mattias Gaertner 5 years ago
parent
commit
40a975b803
2 changed files with 26 additions and 1 deletions
  1. 3 1
      packages/fcl-passrc/src/pasresolver.pp
  2. 23 0
      packages/pastojs/tests/tcgenerics.pas

+ 3 - 1
packages/fcl-passrc/src/pasresolver.pp

@@ -10381,6 +10381,7 @@ begin
       Include(LeftResolved.Flags,rrfWritable);
       end;
 
+    //writeln('TPasResolver.ResolveSubIdent ',GetObjPath(El),' ',GetObjPath(LLoTypeEl));
     if LLoTypeEl.ClassType=TPasClassType then
       begin
       ClassEl:=TPasClassType(LLoTypeEl);
@@ -20563,6 +20564,7 @@ begin
         if CurScope=nil then
           RaiseMsg(20190122122529,nIllegalQualifierAfter,sIllegalQualifierAfter,
             ['.',LeftPath],ErrorEl);
+        CurScope.OnlyTypeMembers:=true;
         end
       else if CurScopeEl is TPasModule then
         PushModuleDotScope(TPasModule(CurScopeEl))
@@ -20887,7 +20889,7 @@ begin
         Include(Ref.Flags,rrfConstInherited);
       end;
     end
-  else if StartScope.ClassType=ScopeClass_WithExpr then
+  else if StartScope.ClassType=FScopeClass_WithExpr then
     begin
     OnlyTypeMembers:=wesfOnlyTypeMembers in TPasWithExprScope(StartScope).Flags;
     IsClassOf:=wesfIsClassOf in TPasWithExprScope(StartScope).Flags;

+ 23 - 0
packages/pastojs/tests/tcgenerics.pas

@@ -40,6 +40,7 @@ type
     // generic external class
     procedure TestGen_ExtClass_Array;
     procedure TestGen_ExtClass_GenJSValueAssign;
+    procedure TestGen_ExtClass_AliasMemberType;
 
     // statements
     Procedure TestGen_InlineSpec_Constructor;
@@ -821,6 +822,28 @@ begin
   CheckResolverUnexpectedHints();
 end;
 
+procedure TTestGenerics.TestGen_ExtClass_AliasMemberType;
+begin
+  StartProgram(false);
+  Add([
+  '{$mode objfpc}',
+  '{$modeswitch externalclass}',
+  'type',
+  '  generic TExt<T> = class external name ''Ext''',
+  '  public type TRun = reference to function(a: T): T;',
+  '  end;',
+  '  TExtWord = specialize TExt<word>;',
+  '  TExtWordRun = TExtWord.TRun;',
+  'begin',
+  '']);
+  ConvertProgram;
+  CheckSource('TestGen_ExtClass_AliasMemberType',
+    LinesToStr([ // statements
+    '']),
+    LinesToStr([ // $mod.$main
+    '']));
+end;
+
 procedure TTestGenerics.TestGen_InlineSpec_Constructor;
 begin
   StartProgram(false);