Procházet zdrojové kódy

pastojs: mode delphi assign ano proc

git-svn-id: trunk@40534 -
Mattias Gaertner před 6 roky
rodič
revize
3053d554a8

+ 2 - 1
packages/pastojs/src/fppas2js.pp

@@ -15780,7 +15780,8 @@ begin
       writeln('TPasToJSConverter.ConvertAssignStatement Left={',GetResolverResultDbg(AssignContext.LeftResolved),'} Right={',GetResolverResultDbg(AssignContext.RightResolved),'}');
       {$ENDIF}
       if LeftIsProcType and (msDelphi in AContext.CurrentModeSwitches)
-          and (AssignContext.RightResolved.BaseType=btProc) then
+          and (AssignContext.RightResolved.BaseType=btProc)
+          and (AssignContext.RightResolved.IdentEl is TPasProcedure) then
         begin
         // Delphi allows assigning a proc without @: proctype:=proc
         AssignContext.RightSide:=CreateCallback(El.right,AssignContext.RightResolved,AContext);

+ 38 - 3
packages/pastojs/tests/tcmodules.pas

@@ -327,7 +327,9 @@ type
     Procedure TestProc_LocalVarAbsolute;
     Procedure TestProc_ReservedWords;
 
-    Procedure TestAnonymousProc_Assign;
+    // anonymous functions
+    Procedure TestAnonymousProc_Assign_ObjFPC;
+    Procedure TestAnonymousProc_Assign_Delphi;
     Procedure TestAnonymousProc_Arg;
     Procedure TestAnonymousProc_Typecast;
     Procedure TestAnonymousProc_With;
@@ -3974,10 +3976,11 @@ begin
     ]));
 end;
 
-procedure TTestModule.TestAnonymousProc_Assign;
+procedure TTestModule.TestAnonymousProc_Assign_ObjFPC;
 begin
   StartProgram(false);
   Add([
+  '{$mode objfpc}',
   'type',
   '  TFunc = reference to function(x: word): word;',
   'var Func: TFunc;',
@@ -3998,7 +4001,7 @@ begin
   '    exit(Result);',
   '  end;']);
   ConvertProgram;
-  CheckSource('TestAnonymousProc_Assign',
+  CheckSource('TestAnonymousProc_Assign_ObjFPC',
     LinesToStr([ // statements
     'this.Func = null;',
     'this.DoIt = function (a) {',
@@ -4023,6 +4026,38 @@ begin
     '']));
 end;
 
+procedure TTestModule.TestAnonymousProc_Assign_Delphi;
+begin
+  StartProgram(false);
+  Add([
+  '{$mode delphi}',
+  'type',
+  '  TProc = reference to procedure(x: word);',
+  'procedure DoIt(a: word);',
+  'var Proc: TProc;',
+  'begin',
+  '  Proc:=procedure(b:word) begin end;',
+  'end;',
+  'var Proc: TProc;',
+  'begin',
+  '  Proc:=procedure(c:word) begin end;',
+  '']);
+  ConvertProgram;
+  CheckSource('TestAnonymousProc_Assign_Delphi',
+    LinesToStr([ // statements
+    'this.DoIt = function (a) {',
+    '  var Proc = null;',
+    '  Proc = function (b) {',
+    '  };',
+    '};',
+    'this.Proc = null;',
+    '']),
+    LinesToStr([
+    '$mod.Proc = function (c) {',
+    '};',
+    '']));
+end;
+
 procedure TTestModule.TestAnonymousProc_Arg;
 begin
   StartProgram(false);