Browse Source

pastojs: fixed adding local and global const in order

git-svn-id: trunk@37168 -
Mattias Gaertner 8 years ago
parent
commit
339560f4b9
2 changed files with 38 additions and 27 deletions
  1. 6 26
      packages/pastojs/src/fppas2js.pp
  2. 32 1
      packages/pastojs/tests/tcmodules.pas

+ 6 - 26
packages/pastojs/src/fppas2js.pp

@@ -1324,8 +1324,6 @@ type
     // Convert declarations
     // Convert declarations
     Function ConvertElement(El : TPasElement; AContext: TConvertContext) : TJSElement; virtual;
     Function ConvertElement(El : TPasElement; AContext: TConvertContext) : TJSElement; virtual;
     Function ConvertProperty(El: TPasProperty; AContext: TConvertContext ): TJSElement; virtual;
     Function ConvertProperty(El: TPasProperty; AContext: TConvertContext ): TJSElement; virtual;
-    Function ConvertCommand(El: TPasImplCommand; AContext: TConvertContext): TJSElement; virtual;
-    Function ConvertCommands(El: TPasImplCommands; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertConst(El: TPasConst; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertConst(El: TPasConst; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertDeclarations(El: TPasDeclarations; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertDeclarations(El: TPasDeclarations; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertExportSymbol(El: TPasExportSymbol; AContext: TConvertContext): TJSElement; virtual;
     Function ConvertExportSymbol(El: TPasExportSymbol; AContext: TConvertContext): TJSElement; virtual;
@@ -7578,6 +7576,8 @@ Var
       begin
       begin
       // NewEl is already added
       // NewEl is already added
       end
       end
+    else if AContext.IsGlobal and (AContext.JSElement is TJSSourceElements) then
+      AddToSourceElements(TJSSourceElements(AContext.JSElement),NewEl)
     else
     else
       begin
       begin
       AddToStatementList(SLFirst,SLLast,NewEl,PosEl);
       AddToStatementList(SLFirst,SLLast,NewEl,PosEl);
@@ -9014,8 +9014,10 @@ begin
 
 
     // create implementation declarations
     // create implementation declarations
     ImplDecl:=ConvertDeclarations(El.ImplementationSection,ImplContext);
     ImplDecl:=ConvertDeclarations(El.ImplementationSection,ImplContext);
-    if ImplDecl=nil then
-      exit;
+    if ImplDecl<>nil then
+      RaiseInconsistency(20170910175032); // elements should have been added directly
+    if Src.Statements[Src.Statements.Count-1].Node=ImplVarSt then
+      exit; // no implementation
     // add impl declarations
     // add impl declarations
     AddToSourceElements(Src,ImplDecl);
     AddToSourceElements(Src,ImplDecl);
     Result:=FunDecl;
     Result:=FunDecl;
@@ -9917,15 +9919,6 @@ begin
   end;
   end;
 end;
 end;
 
 
-function TPasToJSConverter.ConvertCommand(El: TPasImplCommand;
-  AContext: TConvertContext): TJSElement;
-
-begin
-  RaiseNotSupported(El,AContext,20161024192705);
-  Result:=Nil;
-  // ToDo: TPasImplCommand = class(TPasImplElement)
-end;
-
 function TPasToJSConverter.ConvertIfStatement(El: TPasImplIfElse;
 function TPasToJSConverter.ConvertIfStatement(El: TPasImplIfElse;
   AContext: TConvertContext): TJSElement;
   AContext: TConvertContext): TJSElement;
 
 
@@ -11632,15 +11625,6 @@ begin
 }
 }
 end;
 end;
 
 
-function TPasToJSConverter.ConvertCommands(El: TPasImplCommands;
-  AContext: TConvertContext): TJSElement;
-
-begin
-  RaiseNotSupported(El,AContext,20161024192806);
-  Result:=Nil;
-  // ToDo: TPasImplCommands = class(TPasImplElement)
-end;
-
 function TPasToJSConverter.ConvertConst(El: TPasConst; AContext: TConvertContext
 function TPasToJSConverter.ConvertConst(El: TPasConst; AContext: TConvertContext
   ): TJSElement;
   ): TJSElement;
 // Important: returns nil if const was added to higher context
 // Important: returns nil if const was added to higher context
@@ -11726,10 +11710,6 @@ begin
     Result:=ConvertExportSymbol(TPasExportSymbol(El),AContext)
     Result:=ConvertExportSymbol(TPasExportSymbol(El),AContext)
   else if (C=TPasLabels) then
   else if (C=TPasLabels) then
     Result:=ConvertLabels(TPasLabels(El),AContext)
     Result:=ConvertLabels(TPasLabels(El),AContext)
-  else if (C=TPasImplCommand) then
-    Result:=ConvertCommand(TPasImplCommand(El),AContext)
-  else if (C=TPasImplCommands) then
-    Result:=ConvertCommands(TPasImplCommands(El),AContext)
   else if (C=TPasImplLabelMark) then
   else if (C=TPasImplLabelMark) then
     Result:=ConvertLabelMark(TPasImplLabelMark(El),AContext)
     Result:=ConvertLabelMark(TPasImplLabelMark(El),AContext)
   else if C.InheritsFrom(TPasExpr) then
   else if C.InheritsFrom(TPasExpr) then

+ 32 - 1
packages/pastojs/tests/tcmodules.pas

@@ -247,6 +247,7 @@ type
     Procedure TestProc_OverloadUnit;
     Procedure TestProc_OverloadUnit;
     Procedure TestProc_OverloadNested;
     Procedure TestProc_OverloadNested;
     Procedure TestProc_Varargs;
     Procedure TestProc_Varargs;
+    Procedure TestProc_ConstOrder;
 
 
     // enums, sets
     // enums, sets
     Procedure TestEnum_Name;
     Procedure TestEnum_Name;
@@ -2784,6 +2785,36 @@ begin
     '']));
     '']));
 end;
 end;
 
 
+procedure TTestModule.TestProc_ConstOrder;
+begin
+  StartProgram(false);
+  Add([
+  'const A = 3;',
+  'const B = A+1;',
+  'procedure DoIt;',
+  'const C = A+1;',
+  'const D = B+1;',
+  'const E = D+C+B+A;',
+  'begin',
+  'end;',
+  'begin'
+  ]);
+  ConvertProgram;
+  CheckSource('TestProc_ConstOrder',
+    LinesToStr([ // statements
+    'this.A = 3;',
+    'this.B = $mod.A + 1;',
+    'var C = $mod.A + 1;',
+    'var D = $mod.B + 1;',
+    'var E = ((D + C) + $mod.B) + $mod.A;',
+    'this.DoIt = function () {',
+    '};',
+    '']),
+    LinesToStr([
+    ''
+    ]));
+end;
+
 procedure TTestModule.TestEnum_Name;
 procedure TTestModule.TestEnum_Name;
 begin
 begin
   StartProgram(false);
   StartProgram(false);
@@ -4488,9 +4519,9 @@ begin
     '']),
     '']),
     '', // this.$init
     '', // this.$init
     LinesToStr([ // implementation
     LinesToStr([ // implementation
-    'var cLoc = 3;',
     '$impl.cImpl = 2;',
     '$impl.cImpl = 2;',
     '$impl.vImpl = 0;',
     '$impl.vImpl = 0;',
+    'var cLoc = 3;',
     '$impl.DoIt = function () {',
     '$impl.DoIt = function () {',
     '  var vLoc = 0;',
     '  var vLoc = 0;',
     '};',
     '};',