Browse Source

* Some clean-up patches by Mattias

git-svn-id: trunk@34204 -
michael 9 years ago
parent
commit
62f39e0037

+ 4 - 19
packages/fcl-js/src/jsparser.pp

@@ -25,8 +25,6 @@ Type
     FPrevious,
     FCurrent : TJSToken;
     FCurrentString : String;
-    FNextNewLine : Boolean;
-    FNextBol : Boolean;
     FFreeScanner : Boolean;
     FCurrentVars : TJSElementNodes;
     FPeekToken: TJSToken;
@@ -557,8 +555,6 @@ function TJSParser.ParseObjectLiteral: TJSElement;
 Var
   N : TJSObjectLiteral;
   E : TJSObjectLiteralElement;
-  I : Integer;
-
 begin
   Consume(tjsCurlyBraceOpen);
   N:=TJSObjectLiteral(CreateElement(TJSObjectLiteral));
@@ -618,9 +614,6 @@ function TJSParser.ParseStringLiteral: TJSElement;
 
 Var
   L : TJSLiteral;
-  D : Double;
-  I : Integer;
-
 begin
     {$ifdef debugparser} Writeln('Parsing string literal');{$endif debugparser}
   Result:=Nil;
@@ -746,7 +739,6 @@ Var
   M  : TJSDotMemberExpression;
   N  : TJSNewMemberExpression;
   B  : TJSBracketMemberExpression;
-  C : TJSCallExpression;
   Done : Boolean;
 
 begin
@@ -758,7 +750,7 @@ begin
                   N:=TJSNewMemberExpression(CreateElement(TJSNewMemberExpression));
                   try
                     Result:=N;
-                    N.Mexpr:=ParseMemberExpression();
+                    N.MExpr:=ParseMemberExpression();
                     if (CurrentToken=tjsBraceOpen) then
                       N.Args:=ParseArguments;
                   except
@@ -1378,7 +1370,6 @@ end;
 function TJSParser.ParseVariableStatement : TJSElement;
 
 Var
-  E : TJSElement;
   V : TJSVariableStatement;
 
 begin
@@ -1429,7 +1420,7 @@ begin
     I:=TJSIfStatement(CreateElement(TJSIfStatement));
     I.Cond:=C;
     I.BTrue:=Btrue;
-    I.bfalse:=BFalse;
+    I.BFalse:=BFalse;
     Result:=I;
   except
     FreeAndNil(C);
@@ -1641,8 +1632,6 @@ function TJSParser.ParseWithStatement : TJSElement;
 
 Var
   W : TJSWithStatement;
-  N : TJSElement;
-
 begin
   W:=TJSWithStatement(CreateElement(TJSWithStatement));
   try
@@ -1655,6 +1644,7 @@ begin
     FreeAndNil(W);
     Raise;
   end;
+  Result:=W;
 end;
 
 function TJSParser.ParseSwitchStatement : TJSElement;
@@ -1662,7 +1652,6 @@ function TJSParser.ParseSwitchStatement : TJSElement;
 
 Var
   N : TJSSwitchStatement;
-  C : TJSElement;
   Ca : TJSCaseElement;
 
 begin
@@ -1883,8 +1872,6 @@ function TJSParser.ParseLabeledStatement : TJSElement;
 Var
   OL : TJSLabelSet;
   LS : TJSLabeledStatement;
-  LN : String;
-
 begin
   LS:=TJSLabeledStatement(CreateElement(TJSLabeledStatement));
   try
@@ -2046,7 +2033,7 @@ begin
           If (PeekNextToken<>tjsBraceOpen) then
             begin
             F:=Self.ParseFunctionDeclaration;
-            Result.functions.AddNode.Node:=F;
+            Result.Functions.AddNode.Node:=F;
             end
           else
             begin
@@ -2095,8 +2082,6 @@ end;
 Function TJSParser.ParseProgram: TJSFunctionDeclarationStatement;
 
 Var
-  F : TJSFunctionDeclarationStatement;
-  FD : TJSFuncDef;
   B : TJSElement;
 begin
   {$ifdef debugparser} Writeln('>>> Entering FunctionDeclarationStatement');{$endif}

+ 1 - 1
packages/fcl-js/src/jstoken.pp

@@ -8,7 +8,7 @@ type
 
   TJSToken = (tjsUnknown,
      // Specials
-     tjsEOF,tjsWhiteSpace,tjsChar,tjsString, tjsIdentifier,tjsNumber, tjsComment,tjsREGEX, tjsRESERVED,
+     tjsEOF,tjsWhiteSpace,tjsChar,tjsString{this bites TJSString}, tjsIdentifier,tjsNumber, tjsComment,tjsREGEX, tjsRESERVED,
      tjsANDAND, tjsANDEQ,
      tjsBraceOpen,tjsBraceClose,tjsSQuaredBraceOpen,tjsSQuaredBraceClose,tjsCurlyBraceOpen,tjsCurlyBraceClose,
      tjsCOMMA,tjsCOLON,  tjsDOT,tjsSEMICOLON, tjsASSIGN,tjsGT,tjsLT, tjsConditional,

+ 184 - 143
packages/fcl-js/src/jstree.pp

@@ -73,45 +73,47 @@ Type
   TJSObject = Class(TObject);
 
 
-    { TJSLabelSet }
-
-    TJSLabelSet = Class(TJSObject)
-    private
-      FCOnt: Boolean;
-      FNext: TJSLabelSet;
-      FTarget: Cardinal;
-    Public
-      Property Target : Cardinal Read FTarget Write FTarget;
-      Property Next : TJSLabelSet Read FNext Write FNext; // Linked list
-      Property Continuable : Boolean Read FCOnt Write FCont;
-    end;
+  { TJSLabelSet }
 
-    { TJSLabel }
-
-    TJSLabel = Class(TJSObject)
-    private
-      FLabelSet: TJSLabelSet;
-      FLocationLine: Integer;
-      FLocationPos: Integer;
-      FLocationSource: String;
-      FName: String;
-      FNext: TJSLabel;
-    Public
-      Property Name : String Read FName Write FName;
-      Property LabelSet : TJSLabelSet Read FLabelSet Write FLabelSet;
-      Property LocationSource : String Read FLocationSource Write FLocationSource;
-      Property LocationLine : Integer Read FLocationLine Write FLocationLine;
-      Property LocationPos : Integer Read FLocationPos Write FLocationPos;
-      Property Next : TJSLabel Read FNext Write FNext;
-    end;
+  TJSLabelSet = Class(TJSObject)
+  private
+    FCont: Boolean;
+    FNext: TJSLabelSet;
+    FTarget: Cardinal;
+  Public
+    Property Target : Cardinal Read FTarget Write FTarget;
+    Property Next : TJSLabelSet Read FNext Write FNext; // Linked list
+    Property Continuable : Boolean Read FCont Write FCont;
+  end;
+
+  { TJSLabel }
+
+  TJSLabel = Class(TJSObject)
+  private
+    FLabelSet: TJSLabelSet;
+    FLocationLine: Integer;
+    FLocationPos: Integer;
+    FLocationSource: String;
+    FName: String;
+    FNext: TJSLabel;
+  Public
+    Property Name : String Read FName Write FName;
+    Property LabelSet : TJSLabelSet Read FLabelSet Write FLabelSet;
+    Property LocationSource : String Read FLocationSource Write FLocationSource;
+    Property LocationLine : Integer Read FLocationLine Write FLocationLine;
+    Property LocationPos : Integer Read FLocationPos Write FLocationPos;
+    Property Next : TJSLabel Read FNext Write FNext;
+  end;
 
-  { TJSFuncDef }
+  TJSString = jsbase.TJSString; // beware of jstoken.tjsString
+
+  { TJSFuncDef - e.g. 'function Name(Params)Body' }
 
   TJSFuncDef = Class(TJSObject)
   private
     FBody: TJSFunctionBody;
     FIsEmpty: Boolean;
-    FName: String;
+    FName: TJSString;
     FParams: TStrings;
     procedure SetParams(const AValue: TStrings);
   Public
@@ -119,13 +121,13 @@ Type
     Destructor Destroy; override;
     Property Params : TStrings Read FParams Write SetParams;
     Property Body : TJSFunctionBody Read FBody Write FBody;
-    Property Name : String Read FName Write FName;
+    Property Name : TJSString Read FName Write FName;
     Property IsEmpty : Boolean Read FIsEmpty Write FIsEmpty;
   end;
 
-  TJSString = WideString;
+  { TJSElement }
 
-  TJSElement = Class (TJSObject)
+  TJSElement = Class(TJSObject)
   private
     FFlags: TJSElementFlags;
     FLine: Integer;
@@ -140,9 +142,12 @@ Type
   end;
   TJSElementClass = Class of TJSElement;
 
-  { TJSEmptyBlockStatement }
+  { TJSEmptyBlockStatement - empty curly brackets }
 
   TJSEmptyBlockStatement = Class(TJSElement);
+
+  { TJSEmptyStatement - a dummy placeholder, needs sometimes a single semicolon }
+
   TJSEmptyStatement = Class(TJSElement);
 
   { TJSLiteral }
@@ -156,15 +161,6 @@ Type
     Property Value : TJSValue Read FValue Write FValue;
   end;
 
-(*  { TJSStringLiteral }
-
-  TJSStringLiteral = Class(TJSElement)
-  private
-    FValue: TJSString;
-  Public
-    Property Value : TJSString Read FValue Write FValue;
-  end;
-*)
   { TJSRegularExpressionLiteral }
 
   TJSRegularExpressionLiteral = Class(TJSElement)
@@ -182,18 +178,20 @@ Type
     Property Argv[AIndex : integer] : TJSValue Read GetA Write SetA;
   end;
 
-  { TJSPrimaryExpressionIdent }
   TJSPrimaryExpression = Class(TJSElement);
 
+  TJSPrimaryExpressionThis = Class(TJSPrimaryExpression); // 'this'
+
+  { TJSPrimaryExpressionIdent }
+
   TJSPrimaryExpressionIdent = Class(TJSPrimaryExpression)
   private
     FName: TJSString;
   Public
     Property Name : TJSString Read FName Write FName;
   end;
-  TJSPrimaryExpressionThis = Class(TJSPrimaryExpression);
 
-  { TJSArrayLiteralElement }
+  { TJSArrayLiteralElement - an item of a TJSArrayLiteralElements }
 
   TJSArrayLiteralElement = Class(TCollectionItem)
   private
@@ -205,7 +203,7 @@ Type
     Property ElementIndex : Integer Read FFindex Write FFIndex;
   end;
 
-  { TJSArrayLiteralElements }
+  { TJSArrayLiteralElements - Elements property of TJSArrayLiteral }
 
   TJSArrayLiteralElements = Class(TCollection)
   private
@@ -226,7 +224,7 @@ Type
     Property Elements : TJSArrayLiteralElements Read FElements;
   end;
 
-  { TJSObjectLiteralElement }
+  { TJSObjectLiteralElement - an item of TJSObjectLiteralElements }
 
   TJSObjectLiteralElement = Class(TCollectionItem)
   private
@@ -238,7 +236,7 @@ Type
     Property Name : TJSString Read FName Write FName;
   end;
 
-  { TJSObjectLiteralElements }
+  { TJSObjectLiteralElements - Elements property of TJSObjectLiteral }
 
   TJSObjectLiteralElements = Class(TCollection)
   private
@@ -263,17 +261,17 @@ Type
 
   TJSArguments = Class(TJSArrayLiteral);
 
-  { TJSMemberExpression }
+  { TJSMemberExpression - base class }
 
   TJSMemberExpression = Class(TJSElement)
   private
     FMexpr: TJSElement;
   Public
     Destructor Destroy; override;
-    Property Mexpr : TJSElement Read FMexpr Write FMexpr;
+    Property MExpr : TJSElement Read FMexpr Write FMexpr;
   end;
 
-  { TJSNewMemberExpression }
+  { TJSNewMemberExpression - e.g. 'new MExpr(Args)' }
 
   TJSNewMemberExpression = Class(TJSMemberExpression)
   private
@@ -283,7 +281,7 @@ Type
     Property Args : TJSArguments Read FArgs Write FArgs;
   end;
 
-  { TJSDotMemberExpression }
+  { TJSDotMemberExpression - e.g. 'MExpr.Name' }
 
   TJSDotMemberExpression = Class(TJSMemberExpression)
   private
@@ -292,7 +290,7 @@ Type
     Property Name : TJSString Read FName Write FName;
   end;
 
-  { TJSBracketMemberExpression }
+  { TJSBracketMemberExpression - e.g. 'MExpr[Name]' }
 
   TJSBracketMemberExpression = Class(TJSMemberExpression)
   private
@@ -302,7 +300,7 @@ Type
     Property Name : TJSElement Read FName Write FName;
   end;
 
-  { TJSCallExpression }
+  { TJSCallExpression - e.g. 'Expr(Args)'}
 
   TJSCallExpression = Class(TJSElement)
   private
@@ -314,7 +312,7 @@ Type
     Property Args : TJSArguments Read FArgs Write FArgs;
   end;
 
-  { TJSUnary }
+  { TJSUnary - e.g. 'PrefixOperator A PostFixOperator', '--i' }
 
   TJSUnary = Class(TJSElement)
   private
@@ -329,87 +327,103 @@ Type
   end;
   TJSUnaryClass = class of TJSUnary;
 
-  { TJSVariableStatement }
+  { TJSVariableStatement - e.g. 'var A' }
+
   TJSVariableStatement = Class(TJSUnary);
+
+  { TJSExpressionStatement - ? }
+
   TJSExpressionStatement = Class(TJSUnary);
 
-  { TJSThrowStatement }
+  { TJSThrowStatement - e.g. 'throw A' }
 
   TJSThrowStatement = Class(TJSUnary)
+  Public
     Class function PrefixOperatorToken : tjsToken; Override;
   end;
 
   TJSUnaryExpression = Class(TJSUnary);
 
-  { TJSUnaryDeleteExpression }
+  { TJSUnaryDeleteExpression - e.g. 'delete A' }
 
   TJSUnaryDeleteExpression = Class(TJSUnaryExpression)
+  Public
     Class function PrefixOperatorToken : tjsToken; override;
   end;
 
-  { TJSUnaryVoidExpression }
+  { TJSUnaryVoidExpression - e.g. 'void A' }
 
   TJSUnaryVoidExpression = Class(TJSUnaryExpression)
+  Public
     Class function PrefixOperatorToken : tjsToken; override;
   end;
 
-  { TJSUnaryTypeOfExpression }
+  { TJSUnaryTypeOfExpression - e.g. 'typeof A' }
 
   TJSUnaryTypeOfExpression = Class(TJSUnaryExpression)
+  Public
     Class function PrefixOperatorToken : tjsToken; override;
   end;
 
-  { TJSUnaryPrePlusPlusExpression }
+  { TJSUnaryPrePlusPlusExpression - e.g. '++A' }
 
   TJSUnaryPrePlusPlusExpression = Class(TJSUnaryExpression)
+  Public
     Class function PrefixOperatorToken : tjsToken; override;
   end;
 
-  { TJSUnaryPreMinusMinusExpression }
+  { TJSUnaryPreMinusMinusExpression - e.g. '--A' }
 
   TJSUnaryPreMinusMinusExpression = Class(TJSUnaryExpression)
+  Public
     Class function PrefixOperatorToken : tjsToken; override;
   end;
 
-  { TJSUnaryPlusExpression }
+  { TJSUnaryPlusExpression - e.g. '+A' }
 
   TJSUnaryPlusExpression = Class(TJSUnaryExpression)
+  Public
     Class function PrefixOperatorToken : tjsToken; override;
   end;
 
-  { TJSUnaryMinusExpression }
+  { TJSUnaryMinusExpression - e.g. '-A' }
 
   TJSUnaryMinusExpression = Class(TJSUnaryExpression)
+  Public
     Class function PrefixOperatorToken : tjsToken; override;
   end;
 
-  { TJSUnaryInvExpression }
+  { TJSUnaryInvExpression - e.g. '~A' }
 
   TJSUnaryInvExpression = Class(TJSUnaryExpression)
+  Public
     Class function PrefixOperatorToken : tjsToken; override;
   end;
 
-  { TJSUnaryNotExpression }
+  { TJSUnaryNotExpression - e.g. '!A' }
 
   TJSUnaryNotExpression = Class(TJSUnaryExpression)
+  Public
     Class function PrefixOperatorToken : tjsToken; override;
   end;
 
-  { TJSUnaryPostPlusPlusExpression }
+  { TJSUnaryPostPlusPlusExpression - e.g. 'A++' }
 
   TJSUnaryPostPlusPlusExpression = Class(TJSUnaryExpression)
+  Public
     Class function PostFixOperatorToken : tjsToken; override;
   end;
 
-  { TJSUnaryPostMinusMinusExpression }
+  { TJSUnaryPostMinusMinusExpression - e.g. 'A--' }
 
   TJSUnaryPostMinusMinusExpression = Class(TJSUnaryExpression)
+  Public
     Class function PostFixOperatorToken : tjsToken; override;
   end;
 
 
 
-  { TJSBinary }
+  { TJSBinary - base class }
 
   TJSBinary = Class(TJSElement)
   private
@@ -425,42 +439,49 @@ Type
   { TJSStatementList }
 
   TJSStatementList = Class(TJSBinary); // A->first statement, B->next in list, chained.
-  TJSVariableDeclarationList = Class(TJSBinary);
+
+  { TJSVariableDeclarationList }
+
+  TJSVariableDeclarationList = Class(TJSBinary); // A->first variable, B->next in list, chained.
+
+  { TJSWithStatement }
+
   TJSWithStatement = Class(TJSBinary); // A-> with expression, B->statement(s)
 
-  { TJSBinaryExpression }
+  { TJSBinaryExpression - e.g. A operator B }
 
   TJSBinaryExpression = Class(TJSBinary)
+  Public
     Class function OperatorToken : tjsToken; virtual;
     Class function OperatorString : string;
     Class Function AllowCompact : Boolean; virtual;
   end;
 
-  { TJSLogicalOrExpression }
+  { TJSLogicalOrExpression - e.g. A || B }
 
   TJSLogicalOrExpression = Class (TJSBinaryExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSLogicalAndExpression }
+  { TJSLogicalAndExpression - e.g. A && B }
 
   TJSLogicalAndExpression = Class (TJSBinaryExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSBitwiseAndExpression }
+  { TJSBitwiseAndExpression - e.g. A & B }
 
   TJSBitwiseAndExpression = Class (TJSBinaryExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSBitwiseOrExpression }
+  { TJSBitwiseOrExpression - e.g. A | B }
 
   TJSBitwiseOrExpression = Class (TJSBinaryExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSBitwiseXOrExpression }
+  { TJSBitwiseXOrExpression - e.g. A ^ B }
 
   TJSBitwiseXOrExpression = Class (TJSBinaryExpression)
     Class function OperatorToken : tjsToken; override;
@@ -468,25 +489,25 @@ Type
 
   TJSEqualityExpression = Class (TJSBinaryExpression);
 
-  { TJSEqualityExpressionEQ }
+  { TJSEqualityExpressionEQ - e.g. A == B }
 
   TJSEqualityExpressionEQ = Class(TJSEqualityExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSEqualityExpressionNE }
+  { TJSEqualityExpressionNE - e.g. A != B }
 
   TJSEqualityExpressionNE = Class(TJSEqualityExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSEqualityExpressionSEQ }
+  { TJSEqualityExpressionSEQ strict equal - e.g. A === B }
 
   TJSEqualityExpressionSEQ = Class(TJSEqualityExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSEqualityExpressionSNE }
+  { TJSEqualityExpressionSNE not strict equal - e.g. A !== B }
 
   TJSEqualityExpressionSNE = Class(TJSEqualityExpression)
     Class function OperatorToken : tjsToken; override;
@@ -494,38 +515,38 @@ Type
 
   TJSRelationalExpression = Class(TJSBinaryExpression);
 
-  { TJSRelationalExpressionLT }
+  { TJSRelationalExpressionLT lower than - e.g. A < B }
 
   TJSRelationalExpressionLT = Class(TJSRelationalExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSRelationalExpressionGT }
+  { TJSRelationalExpressionGT greater than - e.g. A > B }
 
   TJSRelationalExpressionGT = Class(TJSRelationalExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSRelationalExpressionLE }
+  { TJSRelationalExpressionLE lower equal - e.g. A <= B }
 
   TJSRelationalExpressionLE = Class(TJSRelationalExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSRelationalExpressionGE }
+  { TJSRelationalExpressionGE greater equal - e.g. A >= B }
 
   TJSRelationalExpressionGE = Class(TJSRelationalExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSRelationalExpressionIn }
+  { TJSRelationalExpressionIn - e.g. A in B }
 
   TJSRelationalExpressionIn = Class(TJSRelationalExpression)
     Class function OperatorToken : tjsToken; override;
     Class Function AllowCompact : Boolean; override;
   end;
 
-  { TJSRelationalExpressionInstanceOf }
+  { TJSRelationalExpressionInstanceOf - e.g. A instanceof B }
 
   TJSRelationalExpressionInstanceOf = Class(TJSRelationalExpression)
     Class function OperatorToken : tjsToken; override;
@@ -534,19 +555,19 @@ Type
 
   TJSShiftExpression = Class(TJSBinaryExpression);
 
-  { TJSLShiftExpression }
+  { TJSLShiftExpression - e.g. A << B }
 
   TJSLShiftExpression = Class(TJSShiftExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSRShiftExpression }
+  { TJSRShiftExpression right shift keep sign - e.g. A >> B }
 
   TJSRShiftExpression = Class(TJSShiftExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSURShiftExpression }
+  { TJSURShiftExpression right shift unsigned, insert zeroes - e.g. A >>> B }
 
   TJSURShiftExpression = Class(TJSShiftExpression)
     Class function OperatorToken : tjsToken; override;
@@ -554,13 +575,13 @@ Type
 
   TJSAdditiveExpression = Class(TJSBinaryExpression);
 
-  { TJSAdditiveExpressionPlus }
+  { TJSAdditiveExpressionPlus - e.g. A + B }
 
   TJSAdditiveExpressionPlus = Class(TJSAdditiveExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSAdditiveExpressionMinus }
+  { TJSAdditiveExpressionMinus - e.g. A - B }
 
   TJSAdditiveExpressionMinus = Class(TJSAdditiveExpression)
     Class function OperatorToken : tjsToken; override;
@@ -568,31 +589,31 @@ Type
 
   TJSMultiplicativeExpression = Class(TJSBinaryExpression);
 
-  { TJSMultiplicativeExpressionMul }
+  { TJSMultiplicativeExpressionMul - e.g. A * B }
 
   TJSMultiplicativeExpressionMul = Class(TJSMultiplicativeExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSMultiplicativeExpressionDiv }
+  { TJSMultiplicativeExpressionDiv - e.g. A / B }
 
   TJSMultiplicativeExpressionDiv = Class(TJSMultiplicativeExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSMultiplicativeExpressionMod }
+  { TJSMultiplicativeExpressionMod - e.g. A % B }
 
   TJSMultiplicativeExpressionMod = Class(TJSMultiplicativeExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSCommaExpression }
+  { TJSCommaExpression - e.g. A , B }
 
   TJSCommaExpression = Class(TJSBinaryExpression)
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSConditionalExpression }
+  { TJSConditionalExpression - e.g. A ? B :C }
 
   TJSConditionalExpression = Class(TJSElement)
   private
@@ -606,7 +627,7 @@ Type
     Property C : TJSElement Read FC Write FC;
   end;
 
-  { TJSAssignStatement }
+  { TJSAssignStatement - e.g. LHS operator Expr }
 
   TJSAssignStatement = Class(TJSElement)
   private
@@ -622,79 +643,91 @@ Type
 
   TJSAssignStatementClass = Class of TJSAssignStatement;
 
-  { TJSSimpleAssignStatement }
+  { TJSSimpleAssignStatement - e.g. LHS=Expr }
 
   TJSSimpleAssignStatement = Class(TJSAssignStatement)
+  Public
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSMulEqAssignStatement }
+  { TJSMulEqAssignStatement - e.g. LHS*=Expr }
 
   TJSMulEqAssignStatement = Class(TJSAssignStatement)
+  Public
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSDivEqAssignStatement }
+  { TJSDivEqAssignStatement - e.g. LHS/=Expr }
 
   TJSDivEqAssignStatement = Class(TJSAssignStatement)
+  Public
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSModEqAssignStatement }
+  { TJSModEqAssignStatement - e.g. LHS%=Expr }
 
   TJSModEqAssignStatement = Class(TJSAssignStatement)
+  Public
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSAddEqAssignStatement }
+  { TJSAddEqAssignStatement - e.g. LHS+=Expr }
 
   TJSAddEqAssignStatement = Class(TJSAssignStatement)
+  Public
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSSubEqAssignStatement }
+  { TJSSubEqAssignStatement - e.g. LHS-=Expr }
 
   TJSSubEqAssignStatement = Class(TJSAssignStatement)
+  Public
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSLShiftEqAssignStatement }
+  { TJSLShiftEqAssignStatement - e.g. LHS<<=Expr }
 
   TJSLShiftEqAssignStatement = Class(TJSAssignStatement)
+  Public
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSRShiftEqAssignStatement }
+  { TJSRShiftEqAssignStatement - e.g. LHS>>=Expr keep sign }
 
   TJSRShiftEqAssignStatement = Class(TJSAssignStatement)
+  Public
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSURShiftEqAssignStatement }
+  { TJSURShiftEqAssignStatement - e.g. LHS>>>=Expr unsigned, insert zeroes }
 
   TJSURShiftEqAssignStatement = Class(TJSAssignStatement)
+  Public
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSANDEqAssignStatement }
+  { TJSANDEqAssignStatement - e.g. LHS&=Expr }
 
   TJSANDEqAssignStatement = Class(TJSAssignStatement)
+  Public
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSOREqAssignStatement }
+  { TJSOREqAssignStatement - e.g. LHS|=Expr }
 
   TJSOREqAssignStatement = Class(TJSAssignStatement)
+  Public
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSXOREqAssignStatement }
+  { TJSXOREqAssignStatement - e.g. LHS^=Expr }
 
   TJSXOREqAssignStatement = Class(TJSAssignStatement)
+  Public
     Class function OperatorToken : tjsToken; override;
   end;
 
-  { TJSVarDeclaration }
+  { TJSVarDeclaration - e.g. Name=Init }
 
   TJSVarDeclaration = Class(TJSElement)
   private
@@ -706,7 +739,7 @@ Type
     Property Init : TJSElement Read FInit Write FInit;
   end;
 
-  { TJSIfStatement }
+  { TJSIfStatement - e.g. if (Cond) btrue else bfalse }
 
   TJSIfStatement = Class(TJSElement)
   private
@@ -716,13 +749,13 @@ Type
   Public
     Destructor Destroy; override;
     Property Cond : TJSElement Read FCond Write FCond;
-    Property btrue : TJSElement Read FBTrue Write FBTrue;
-    Property bfalse : TJSElement Read FBFalse Write FBFalse;
+    Property BTrue : TJSElement Read FBTrue Write FBTrue;
+    Property BFalse : TJSElement Read FBFalse Write FBFalse;
   end;
 
-  { TJSWhileStatement }
-
-  { TJSTargetStatement }
+  { TJSTargetStatement
+    - base class for statements targetable by continue and break
+    - TargetName can be empty }
 
   TJSTargetStatement = Class(TJSElement)
   private
@@ -733,17 +766,17 @@ Type
     Property TargetName : TJSString Read FTargetName Write FTargetName;
   end;
 
-  { TJSBodyStatement }
+  { TJSBodyStatement - base class }
 
   TJSBodyStatement = Class(TJSTargetStatement)
   private
     FBody: TJSElement;
   Public
     Destructor Destroy; override;
-    Property body : TJSElement Read FBody Write FBody;
+    Property Body : TJSElement Read FBody Write FBody;
   end;
 
-  { TJSCondLoopStatement }
+  { TJSCondLoopStatement - base class for do..while and while..do }
 
   TJSCondLoopStatement = Class(TJSBodyStatement)
   private
@@ -753,10 +786,15 @@ Type
     Property Cond : TJSElement Read FCond Write FCond;
   end;
 
+  { TJSWhileStatement - e.g. 'while(Cond) Body' }
+
   TJSWhileStatement = Class(TJSCondLoopStatement);
+
+  { TJSDoWhileStatement - e.g. 'do Body while(Cond)' }
+
   TJSDoWhileStatement = Class(TJSWhileStatement);
 
-  { TJSForStatement }
+  { TJSForStatement - e.g. 'for(Init;Cond;Incr) Body' }
 
   TJSForStatement = Class(TJSCondLoopStatement)
   private
@@ -768,7 +806,7 @@ Type
     Property Init : TJSElement Read FInit Write FInit;
   end;
 
-  { TJSForInStatement }
+  { TJSForInStatement - e.g. 'for(LHS in List) Body' }
 
   TJSForInStatement = Class(TJSBodyStatement)
   private
@@ -780,11 +818,15 @@ Type
     Property List : TJSElement Read FList Write FList;
   end;
 
+  { TJSContinueStatement - e.g. 'continue'}
+
   TJSContinueStatement = Class(TJSTargetStatement);
 
+  { TJSBreakStatement - e.g. 'break' }
+
   TJSBreakStatement = Class(TJSTargetStatement);
 
-  { TJSReturn }
+  { TJSReturn - e.g. 'return Expr'}
 
   TJSReturnStatement = Class(TJSElement)
   private
@@ -794,7 +836,7 @@ Type
     Property Expr : TJSElement Read FExpr Write FExpr;
   end;
 
-  { TJSCaseElement }
+  { TJSCaseElement - element of TJSCaseElements, e.g. 'case Expr: Body' }
 
   TJSCaseElement = Class(TCollectionItem)
   private
@@ -806,7 +848,7 @@ Type
     Property Body : TJSElement Read FBody Write FBody;
   end;
 
-  { TJSCaseElements }
+  { TJSCaseElements - Cases property of TJSSwitch }
 
   TJSCaseElements = Class(TCollection)
   private
@@ -816,7 +858,7 @@ Type
     Property Cases[AIndex : Integer] : TJSCaseElement Read GetC ;default;
   end;
 
-  { TJSSwitch }
+  { TJSSwitch - e.g. switch(Cond) Cases }
 
   TJSSwitchStatement = Class(TJSTargetStatement)
   private
@@ -828,10 +870,10 @@ Type
     Destructor Destroy; override;
     Property Cond : TJSelement Read FCond Write FCond;
     Property Cases : TJSCaseElements Read FCases;
-    Property TheDefault : TJSCaseelement Read FDefault Write FDefault;
+    Property TheDefault : TJSCaseelement Read FDefault Write FDefault; // one of Cases
   end;
 
-  { TJSLabeledStatement }
+  { TJSLabeledStatement - e.g. 'TheLabel : A' }
 
   TJSLabeledStatement = Class(TJSUnary)
   private
@@ -839,11 +881,11 @@ Type
     FTarget: Integer;
   Public
     Destructor Destroy; override;
-    Property target: Integer Read FTarget Write FTarget;
+    Property Target: Integer Read FTarget Write FTarget;
     Property TheLabel : TJSLabel Read FLabel Write Flabel;
   end;
 
-  { TJSTryStatement }
+  { TJSTryStatement - e.g. 'try Block catch(Ident) BCatch finally BFinally' }
 
   TJSTryStatement = Class(TJSElement)
   private
@@ -864,9 +906,9 @@ Type
   TJSTryFinallyStatement = Class(TJSTryStatement);
 
 
-  { TJSFunction }
+  { TJSFunctionDeclarationStatement - as TJSFuncDef, except as a statement }
 
-  TJSFunctionDeclarationStatement = Class(TJSelement)
+  TJSFunctionDeclarationStatement = Class(TJSElement)
   private
     FFuncDef: TJSFuncDef;
   Public
@@ -874,16 +916,16 @@ Type
     Property AFunction : TJSFuncDef Read FFuncDef Write FFuncDef;
   end;
 
-  { TJSFunctionBody }
+  { TJSFunctionBody - the statement block of a function }
 
   TJSFunctionBody = Class(TJSUnary)
   private
-    FisProgram: Boolean;
+    FIsProgram: Boolean;
   Public
-    Property isProgram : Boolean Read FisProgram Write FIsProgram;
+    Property isProgram : Boolean Read FIsProgram Write FIsProgram;
   end;
 
-  { TJSElementNode }
+  { TJSElementNode - element of TJSElementNodes }
 
   TJSElementNode = Class(TCollectionItem)
   private
@@ -893,7 +935,7 @@ Type
     Property Node : TJSElement Read FNode Write FNode;
   end;
 
-  { TJSElementNodes }
+  { TJSElementNodes -  }
 
   TJSElementNodes = Class(TCollection)
   private
@@ -904,6 +946,7 @@ Type
   end;
 
   { TJSSourceElements }
+
   TJSSourceElements = Class(TJSElement)
   private
     FFunctions: TJSElementNodes;
@@ -913,11 +956,10 @@ Type
     Constructor Create(ALine,ARow : Integer; const ASource : String = ''); override;
     Destructor Destroy; override;
     Property Statements : TJSElementNodes Read FStatements;
-    Property functions : TJSElementNodes Read FFunctions;
+    Property Functions : TJSElementNodes Read FFunctions;
     Property Vars : TJSElementNodes Read FVars;
   end;
 
-
 implementation
 
 {$IFDEF NOCLASSES}
@@ -1444,7 +1486,7 @@ end;
 
 { TJSElement }
 
-constructor TJSElement.Create(ALine, ARow: Integer; Const ASource: String = '');
+constructor TJSElement.Create(ALine, ARow: Integer; const ASource: String);
 begin
   FLine:=ALine;
   FRow:=ARow;
@@ -1809,7 +1851,6 @@ begin
   Result:=TJSElementNode(Items[Aindex])
 end;
 
-
 function TJSElementNodes.AddNode: TJSElementNode;
 begin
   Result:=TJSElementNode(Add);

+ 10 - 19
packages/fcl-js/src/jswriter.pp

@@ -622,13 +622,10 @@ end;
 
 Procedure TJSWriter.WriteMemberExpression(el : TJSMemberExpression);
 
-Var
-  I : integer;
-  A : TJSArguments;
 begin
   if el is TJSNewMemberExpression then
     Write('new ');
-  WriteJS(el.mexpr);
+  WriteJS(el.MExpr);
   if el is TJSDotMemberExpression then
     begin
     write('.');
@@ -651,9 +648,6 @@ end;
 
 Procedure TJSWriter.WriteCallExpression(El : TJSCallExpression);
 
-Var
-  I : integer;
-  A : TJSArguments;
 begin
   WriteJS(El.Expr);
   if Assigned(El.Args) then
@@ -743,21 +737,19 @@ Procedure TJSWriter.WriteBinary(El : TJSBinary);
 
 Var
   S : AnsiString;
-  B : Boolean;
-  T : TJSToken;
-
+  AllowCompact : Boolean;
 begin
   Write('(');
   WriteJS(EL.A);
-  B:=False;
+  AllowCompact:=False;
   if (el is TJSBinaryExpression) then
     begin
     S:=TJSBinaryExpression(El).OperatorString;
-    B:=TJSBinaryExpression(El).AllowCompact;
+    AllowCompact:=TJSBinaryExpression(El).AllowCompact;
     end;
-  If Not (B and (woCompact in Options)) then
+  If Not (AllowCompact and (woCompact in Options)) then
     S:=' '+S+' ';
-  Write(s);
+  Write(S);
   WriteJS(EL.B);
   Write(')');
 end;
@@ -778,7 +770,6 @@ Procedure TJSWriter.WriteAssignStatement(El : TJSAssignStatement);
 
 Var
   S : AnsiString;
-  T : TJSToken;
 begin
   WriteJS(EL.LHS);
   S:=El.OperatorString;
@@ -823,7 +814,7 @@ begin
   if Assigned(El.List) then
     WriteJS(El.List);
   Write(') ');
-  if Assigned(El.body) then
+  if Assigned(El.Body) then
     WriteJS(El.Body);
 end;
 
@@ -840,7 +831,7 @@ begin
   if Assigned(El.Incr) then
     WriteJS(El.Incr);
   Write(') ');
-  if Assigned(El.body) then
+  if Assigned(El.Body) then
     WriteJS(El.Body);
 end;
 
@@ -851,7 +842,7 @@ begin
   if El is TJSDoWhileStatement then
     begin
     Write('do ');
-    if Assigned(El.body) then
+    if Assigned(El.Body) then
       WriteJS(El.Body);
     Write(' while (');
     If Assigned(El.Cond) then
@@ -864,7 +855,7 @@ begin
     If Assigned(El.Cond) then
       WriteJS(EL.Cond);
     Write(') ');
-    if Assigned(El.body) then
+    if Assigned(El.Body) then
       WriteJS(El.Body);
     end;
 end;

+ 1 - 1
packages/fcl-js/tests/testjs.lpr

@@ -4,7 +4,7 @@ program testjs;
 
 uses
   cwstring,Classes, consoletestrunner, tcscanner, jsparser, jsscanner, jstree, jsbase,
-  tcparser, jswriter, tctextwriter, tcwriter, jstoken;
+  tcparser, jswriter, tcwriter, jstoken;
 
 var
   Application: TTestRunner;