Pārlūkot izejas kodu

pastojs: precompiled proc: store shortref to enumtype of enumvalue

git-svn-id: trunk@49025 -
Mattias Gaertner 4 gadi atpakaļ
vecāks
revīzija
8b09375ec2

+ 8 - 0
packages/pastojs/src/fppas2js.pp

@@ -25054,7 +25054,9 @@ var
   Parent: TPasElement;
   Parent: TPasElement;
   CurModule: TPasModule;
   CurModule: TPasModule;
   ElClass: TClass;
   ElClass: TClass;
+  aResolver: TPas2JSResolver;
 begin
 begin
+  aResolver:=AContext.Resolver;
   Result:=AContext.GetLocalName(El,[cvkGlobal]);
   Result:=AContext.GetLocalName(El,[cvkGlobal]);
   if Result<>'' then
   if Result<>'' then
     begin
     begin
@@ -25091,6 +25093,12 @@ begin
         Result:=TransformModuleName(TPasModule(Parent),true,AContext)
         Result:=TransformModuleName(TPasModule(Parent),true,AContext)
       else
       else
         RaiseNotSupported(El,AContext,20200609230526,GetObjPath(El));
         RaiseNotSupported(El,AContext,20200609230526,GetObjPath(El));
+      end
+    else
+      begin
+      // parent has local var
+      if (coStoreImplJS in Options) and (aResolver.GetParentProcBody(Parent)=nil) then
+        StoreImplJSLocal(Parent,AContext);
       end;
       end;
     Result:=Result+'.'+TransformElToJSName(El,AContext);
     Result:=Result+'.'+TransformElToJSName(El,AContext);
     end
     end

+ 42 - 0
packages/pastojs/tests/tcprecompile.pas

@@ -64,6 +64,7 @@ type
     procedure TestPCU_Class_Constructor;
     procedure TestPCU_Class_Constructor;
     procedure TestPCU_Class_ClassConstructor;
     procedure TestPCU_Class_ClassConstructor;
     procedure TestPCU_ClassInterface;
     procedure TestPCU_ClassInterface;
+    procedure TestPCU_EnumNames;
     procedure TestPCU_Namespace;
     procedure TestPCU_Namespace;
     procedure TestPCU_CheckVersionMain;
     procedure TestPCU_CheckVersionMain;
     procedure TestPCU_CheckVersionMain2;
     procedure TestPCU_CheckVersionMain2;
@@ -135,6 +136,7 @@ begin
     if ExpExitCode=0 then
     if ExpExitCode=0 then
       begin
       begin
       NewSrc:=JSFile.Source;
       NewSrc:=JSFile.Source;
+      //writeln('TCustomTestCLI_Precompile.CheckPrecompile ',NewSrc);
       if not CheckSrcDiff(OrigSrc,NewSrc,s) then
       if not CheckSrcDiff(OrigSrc,NewSrc,s) then
         begin
         begin
         WriteSources;
         WriteSources;
@@ -510,6 +512,46 @@ begin
   CheckPrecompile('test1.pas','src');
   CheckPrecompile('test1.pas','src');
 end;
 end;
 
 
+procedure TTestCLI_Precompile.TestPCU_EnumNames;
+var
+  SharedParams: TStringList;
+begin
+  AddUnit('src/system.pp',[
+    'type integer = longint;',
+    '  TObject = class end;',
+    'procedure Writeln; varargs;'],
+    ['procedure Writeln; begin end;']);
+  AddUnit('src/unit1.pp',
+  ['type',
+  '  TEnum = (red,green,blue);',
+   '  TBird = class ',
+   '  private',
+   '    Color: TEnum;',
+   '  public',
+   '    procedure Fly;',
+   '    procedure Run;',
+   '  end;',
+   ''],
+  ['procedure TBird.Fly;',
+   'begin',
+   '  Color:=blue;',
+   'end;',
+   'procedure TBird.Run;',
+   'begin',
+   '  Color:=green;',
+   'end;']);
+  AddFile('test1.pas',[
+    'uses unit1;',
+    'var b: TBird;',
+    'begin',
+    '  b.Fly();',
+    '  b.Run();',
+    'end.']);
+  SharedParams:=TStringList.Create;
+  SharedParams.Add('-OoEnumNumbers-');
+  CheckPrecompile('test1.pas','src',SharedParams);
+end;
+
 procedure TTestCLI_Precompile.TestPCU_Namespace;
 procedure TTestCLI_Precompile.TestPCU_Namespace;
 begin
 begin
   AddUnit('src/system.pp',[
   AddUnit('src/system.pp',[