Bläddra i källkod

* Patch from Mattias Gaertner to make exception object configurable, fix tests

git-svn-id: trunk@34218 -
michael 9 år sedan
förälder
incheckning
d8266a708f

+ 39 - 25
packages/pastojs/src/fppas2js.pp

@@ -130,6 +130,9 @@ Type
   end;
   EPasToJS = Class(Exception);
 
+var
+  DefaultJSExceptionObject: string = 'exceptObject';
+
 implementation
 
 resourcestring
@@ -149,20 +152,20 @@ Var
 begin
   While El<>nil do
   begin
-    if EL is TJSStatementList then
+    if El is TJSStatementList then
       begin
-      List:=EL as TJSStatementList;
+      List:=El as TJSStatementList;
       // List.A is first statement, List.B is next in list, chained.
       // -> add A, continue with B and free List
       AddEl:=List.A;
-      EL:=List.B;
+      El:=List.B;
       List.A:=Nil;
       List.B:=Nil;
       FreeAndNil(List);
       end
     else
       begin
-      AddEl:=EL;
+      AddEl:=El;
       El:=Nil;
       end;
     Src.Statements.AddNode.Node:=AddEl;
@@ -176,17 +179,16 @@ function TPasToJSConverter.ConvertModule(El: TPasModule;
       [<interface uses1>,<uses2>, ...],
       function(uses,unit){
         <interface>
-        this.impl={
-            <implementation>
-            $<unitname>_init:function(){
-              <initialization>
-              }
+        <implementation>
+        $<unitname>_init:function(){
+          <initialization>
           };
+        this.impl=$impl;
       },
       [<implementation uses1>,<uses2>, ...]);
 *)
 Var
-  Src : TJSSourceElements;
+  Src , UnitSrc: TJSSourceElements;
   RegModuleCall: TJSCallExpression;
   ArgArray: TJSArguments;
   UsesList: TFPList;
@@ -198,10 +200,12 @@ begin
   Result:=Nil;
   if (El.ClassType=TPasModule) or (El is TPasUnitModule) then
     begin
+      Src:=TJSSourceElements(CreateElement(TJSSourceElements, El));
+      Result:=Src;
+
       // create 'rtl.module(...)'
-      // ToDo: fix missing semicolon
       RegModuleCall:=TJSCallExpression(CreateElement(TJSCallExpression,El));
-      Result:=RegModuleCall;
+      AddToSourceElements(Src,RegModuleCall);
       RegModuleCall.Expr:=CreateMemberExpression(['module','rtl']);
       ArgArray := TJSArguments.Create(0, 0, '');
       RegModuleCall.Args:=ArgArray;
@@ -227,18 +231,18 @@ begin
       FunDef.Params.Add('unit');
       FunBody:=TJSFunctionBody.Create(0,0,'');
       FunDef.Body:=FunBody;
-      Src:=TJSSourceElements(CreateElement(TJSSourceElements, El));
-      FunBody.A:=Src;
+      UnitSrc:=TJSSourceElements(CreateElement(TJSSourceElements, El));
+      FunBody.A:=UnitSrc;
 
-      // add interface
+      // add interface section
       if Assigned(El.InterfaceSection) then
-        AddToSourceElements(Src,ConvertElement(El.InterfaceSection,AContext));
-      // ToDo: prefix/enclose implementation section
+        AddToSourceElements(UnitSrc,ConvertElement(El.InterfaceSection,AContext));
+      // add implementation section
       if Assigned(El.ImplementationSection) then
-        AddToSourceElements(Src,ConvertElement(El.ImplementationSection,AContext));
-      // ToDo: prefix/enclose initialization section
+        AddToSourceElements(UnitSrc,ConvertElement(El.ImplementationSection,AContext));
+      // add initialization section
       if Assigned(El.InitializationSection) then
-        AddToSourceElements(Src,ConvertElement(El.InitializationSection,AContext));
+        AddToSourceElements(UnitSrc,ConvertElement(El.InitializationSection,AContext));
       if Assigned(El.FinalizationSection) then
         raise Exception.Create('TPasToJSConverter.ConvertModule: finalization section is not supported');
 
@@ -529,7 +533,10 @@ function TPasToJSConverter.TransFormIdent(El: TJSPrimaryExpressionIdent;
 
 begin
   if AContext=nil then ;
-  EL.Name:=LowerCase(EL.Name);
+  if CompareText(String(El.Name),DefaultJSExceptionObject)=0 then
+    El.Name:=TJSString(DefaultJSExceptionObject)
+  else
+    El.Name:=LowerCase(El.Name);
   Result:=El;
 end;
 
@@ -1101,6 +1108,7 @@ end;
 function TPasToJSConverter.ConvertInitializationSection(
   El: TInitializationSection; AContext: TConvertContext): TJSElement;
 begin
+  // ToDo: enclose in a function $init_unitname
   Result:=ConvertImplBlockElements(El,AContext);
 end;
 
@@ -1561,7 +1569,7 @@ function TPasToJSConverter.GetExceptionObjectName(AContext: TConvertContext
   ): string;
 begin
   if AContext=nil then ;
-  Result:='ExceptObject'; // use the same as the FPC RTL
+  Result:=DefaultJSExceptionObject; // use the same as the FPC RTL
 end;
 
 function TPasToJSConverter.ResolveType(El: TPasElement;
@@ -1932,14 +1940,17 @@ function TPasToJSConverter.TransformVariableName(const AName: String;
   AContext: TConvertContext): String;
 begin
   if AContext=nil then ;
-  Result:=LowerCase(AName);
+  if CompareText(AName,DefaultJSExceptionObject)=0 then
+    Result:=DefaultJSExceptionObject
+  else
+    Result:=LowerCase(AName);
 end;
 
 function TPasToJSConverter.TransformVariableName(El: TPasElement;
   AContext: TConvertContext): String;
 begin
   if AContext=nil then ;
-  Result:=TransformVariableName(EL.Name,AContext);
+  Result:=TransformVariableName(El.Name,AContext);
   // Add to context.
 end;
 
@@ -1947,7 +1958,10 @@ function TPasToJSConverter.TransformFunctionName(El: TPasElement;
   AContext: TConvertContext): String;
 begin
   if AContext=nil then ;
-  Result:=LowerCase(EL.Name);
+  if CompareText(El.Name,DefaultJSExceptionObject)=0 then
+    Result:=DefaultJSExceptionObject
+  else
+    Result:=LowerCase(El.Name);
 end;
 
 function TPasToJSConverter.ConvertElement(El: TPasElement): TJSElement;

+ 12 - 12
packages/pastojs/tests/tcconverter.pp

@@ -575,12 +575,12 @@ begin
   F:=T.AddExcept;
   F.AddElement(CreateAssignStatement('b','c'));
   El:=TJSTryFinallyStatement(Convert(T,TJSTryCatchStatement));
-  L:=AssertListStatement('try..except block is statement list',EL.Block);
+  L:=AssertListStatement('try..except block is statement list',El.Block);
   AssertAssignStatement('Correct assignment in try..except block',L.A,'a','b');
   AssertNull('No second statement',L.B);
   L:=AssertListStatement('try..except block is statement list',El.BCatch);
   AssertAssignStatement('Correct assignment in except..end block',L.A,'b','c');
-  AssertEquals('Correct exception object name','jsexception',EL.Ident);
+  AssertEquals('Correct exception object name',DefaultJSExceptionObject,El.Ident);
   AssertNull('No second statement',L.B);
 end;
 
@@ -603,9 +603,9 @@ begin
     Becomes:
     try {
      a=b;
-    } catch (jsexception) {
-      if jsexception instanceof exception {
-        var e = jsexception;
+    } catch (ExceptObject) {
+      if (ExceptObject instanceof exception) {
+        var e = ExceptObject;
         b = c;
       }
     }
@@ -617,18 +617,18 @@ begin
   O.Body:=CreateAssignStatement('b','c');
   // Convert
   El:=TJSTryFinallyStatement(Convert(T,TJSTryCatchStatement));
-  AssertEquals('Correct exception object name','jsexception',EL.Ident);
+  AssertEquals('Correct exception object name',DefaultJSExceptionObject,EL.Ident);
   L:=AssertListStatement('try..except block is statement list',El.BCatch);
   AssertNull('No second statement',L.B);
   I:=TJSIfStatement(AssertElement('On block is if',TJSIfStatement,L.A));
   Ic:=TJSRelationalExpressionInstanceOf(AssertElement('If condition is InstanceOf expression',TJSRelationalExpressionInstanceOf,I.Cond));
-  Assertidentifier('InstanceOf left is exception object',Ic.A,'jsexception');
+  Assertidentifier('InstanceOf left is exception object',Ic.A,DefaultJSExceptionObject);
   // Lowercased exception - May need checking
   Assertidentifier('InstanceOf right is original exception type',Ic.B,'exception');
   L:=AssertListStatement('On block is always a list',i.btrue);
   V:=TJSVarDeclaration(AssertElement('First statement in list is a var declaration',TJSVarDeclaration,L.A));
   AssertEquals('Variable name is identifier in On A : Ex do','e',V.Name);
-  Assertidentifier('Variable init is exception object',v.init,'jsexception');
+  Assertidentifier('Variable init is exception object',v.init,DefaultJSExceptionObject);
   L:=AssertListStatement('Second statement is again list',L.B);
   AssertAssignStatement('Original assignment in second statement',L.A,'b','c');
 end;
@@ -665,20 +665,20 @@ begin
   O.Body:=TPasImplRaise.Create('',Nil);
   // Convert
   El:=TJSTryFinallyStatement(Convert(T,TJSTryCatchStatement));
-  AssertEquals('Correct exception object name','jsexception',EL.Ident);
+  AssertEquals('Correct exception object name',DefaultJSExceptionObject,EL.Ident);
   L:=AssertListStatement('try..except block is statement list',El.BCatch);
   AssertNull('No second statement',L.B);
   I:=TJSIfStatement(AssertElement('On block is if',TJSIfStatement,L.A));
   Ic:=TJSRelationalExpressionInstanceOf(AssertElement('If condition is InstanceOf expression',TJSRelationalExpressionInstanceOf,I.Cond));
-  Assertidentifier('InstanceOf left is exception object',Ic.A,'jsexception');
+  Assertidentifier('InstanceOf left is exception object',Ic.A,DefaultJSExceptionObject);
   // Lowercased exception - May need checking
   L:=AssertListStatement('On block is always a list',i.btrue);
   V:=TJSVarDeclaration(AssertElement('First statement in list is a var declaration',TJSVarDeclaration,L.A));
   AssertEquals('Variable name is identifier in On A : Ex do','e',V.Name);
-  Assertidentifier('Variable init is exception object',v.init,'jsexception');
+  Assertidentifier('Variable init is exception object',v.init,DefaultJSExceptionObject);
   L:=AssertListStatement('Second statement is again list',L.B);
   R:=TJSThrowStatement(AssertElement('On block is throw statement',TJSThrowStatement,L.A));
-  Assertidentifier('R expression is original exception ',R.A,'jsexception');
+  Assertidentifier('R expression is original exception ',R.A,DefaultJSExceptionObject);
 end;
 
 Procedure TTestStatementConverter.TestVariableStatement;

+ 0 - 9
packages/pastojs/tests/testpas2js.lpi

@@ -38,17 +38,14 @@
       <Unit0>
         <Filename Value="testpas2js.pp"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="testpas2js"/>
       </Unit0>
       <Unit1>
         <Filename Value="tcconverter.pp"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="tcconverter"/>
       </Unit1>
       <Unit2>
         <Filename Value="../src/fppas2js.pp"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="fppas2js"/>
       </Unit2>
     </Units>
   </ProjectOptions>
@@ -58,12 +55,6 @@
       <IncludeFiles Value="$(ProjOutDir)"/>
       <OtherUnitFiles Value="../src"/>
     </SearchPaths>
-    <Other>
-      <CompilerMessages>
-        <MsgFileName Value=""/>
-      </CompilerMessages>
-      <CompilerPath Value="$(CompPath)"/>
-    </Other>
   </CompilerOptions>
   <Debugging>
     <Exceptions Count="3">