Browse Source

* Dotted filenames for package fcl-js

Michaël Van Canneyt 2 years ago
parent
commit
f3c74295e2

+ 3 - 0
packages/fcl-js/namespaced/Js.Base.pp

@@ -0,0 +1,3 @@
+unit Js.Base;
+{$DEFINE FPC_DOTTEDUNITS}
+{$i jsbase.pp}

+ 3 - 0
packages/fcl-js/namespaced/Js.Minifier.pp

@@ -0,0 +1,3 @@
+unit Js.Minifier;
+{$DEFINE FPC_DOTTEDUNITS}
+{$i jsminifier.pp}

+ 3 - 0
packages/fcl-js/namespaced/Js.Parser.pp

@@ -0,0 +1,3 @@
+unit Js.Parser;
+{$DEFINE FPC_DOTTEDUNITS}
+{$i jsparser.pp}

+ 3 - 0
packages/fcl-js/namespaced/Js.Scanner.pp

@@ -0,0 +1,3 @@
+unit Js.Scanner;
+{$DEFINE FPC_DOTTEDUNITS}
+{$i jsscanner.pp}

+ 3 - 0
packages/fcl-js/namespaced/Js.SrcMap.pas

@@ -0,0 +1,3 @@
+unit Js.SrcMap;
+{$DEFINE FPC_DOTTEDUNITS}
+{$i jssrcmap.pas}

+ 3 - 0
packages/fcl-js/namespaced/Js.Token.pp

@@ -0,0 +1,3 @@
+unit Js.Token;
+{$DEFINE FPC_DOTTEDUNITS}
+{$i jstoken.pp}

+ 3 - 0
packages/fcl-js/namespaced/Js.Tree.pp

@@ -0,0 +1,3 @@
+unit Js.Tree;
+{$DEFINE FPC_DOTTEDUNITS}
+{$i jstree.pp}

+ 3 - 0
packages/fcl-js/namespaced/Js.TsToPas.pp

@@ -0,0 +1,3 @@
+unit Js.TsToPas;
+{$DEFINE FPC_DOTTEDUNITS}
+{$i tstopas.pp}

+ 3 - 0
packages/fcl-js/namespaced/Js.Writer.pp

@@ -0,0 +1,3 @@
+unit Js.Writer;
+{$DEFINE FPC_DOTTEDUNITS}
+{$i jswriter.pp}

+ 14 - 0
packages/fcl-js/namespaces.lst

@@ -0,0 +1,14 @@
+tests/tcsrcmap.pas=tests/Javascript.TcSrcMap.pas
+src/jsbase.pp=namespaced/Js.Base.pp
+src/jsminifier.pp=namespaced/Js.Minifier.pp
+src/jsparser.pp=namespaced/Js.Parser.pp
+src/jsscanner.pp=namespaced/Js.Scanner.pp
+src/jssrcmap.pas=namespaced/Js.SrcMap.pas
+src/jstoken.pp=namespaced/Js.Token.pp
+src/jstree.pp=namespaced/Js.Tree.pp
+src/jswriter.pp=namespaced/Js.Writer.pp
+src/tstopas.pp=namespaced/Js.TsToPas.pp
+{s*:src/}=namespaced/
+{i+:src/}
+{s*:tests/}=tests/
+{i+:tests/}

+ 2 - 0
packages/fcl-js/src/jsbase.pp

@@ -13,7 +13,9 @@
                                 
                                 
   **********************************************************************}
   **********************************************************************}
                                  
                                  
+{$IFNDEF FPC_DOTTEDUNITS}
 unit jsbase;
 unit jsbase;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 {$mode objfpc}{$H+}
 {$mode objfpc}{$H+}
 
 

+ 6 - 0
packages/fcl-js/src/jsminifier.pp

@@ -42,14 +42,20 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 SOFTWARE.
 }
 }
 
 
+{$IFNDEF FPC_DOTTEDUNITS}
 unit jsminifier;
 unit jsminifier;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 {$mode objfpc}{$H+}
 {$mode objfpc}{$H+}
 {$inline on}
 {$inline on}
 
 
 interface
 interface
 
 
+{$IFDEF FPC_DOTTEDUNITS}
+uses System.SysUtils,System.Classes,Fcl.Streams.Buffer;
+{$ELSE FPC_DOTTEDUNITS}
 uses sysutils,classes,bufstream;
 uses sysutils,classes,bufstream;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 
 
 Const
 Const

+ 78 - 67
packages/fcl-js/src/jsparser.pp

@@ -12,7 +12,9 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
                                 
                                 
   **********************************************************************}
   **********************************************************************}
+{$IFNDEF FPC_DOTTEDUNITS}
 unit jsparser;
 unit jsparser;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 { $define debugparser}
 { $define debugparser}
 {$mode objfpc}{$H+}
 {$mode objfpc}{$H+}
@@ -20,8 +22,13 @@ unit jsparser;
 
 
 interface
 interface
 
 
+{$IFDEF FPC_DOTTEDUNITS}
+uses
+  System.Classes, System.SysUtils, Js.Scanner, Js.Tree, Js.Token, Js.Base;
+{$ELSE FPC_DOTTEDUNITS}
 uses
 uses
   Classes, SysUtils, jsscanner, jstree, jstoken, jsbase;
   Classes, SysUtils, jsscanner, jstree, jstoken, jsbase;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 Const
 Const
    SEmptyLabel = '';
    SEmptyLabel = '';
@@ -36,7 +43,7 @@ Const
    MinGeneratorVersion = ecma2021;
    MinGeneratorVersion = ecma2021;
 
 
 Type
 Type
-  TECMAVersion = jsScanner.TECMAVersion;
+  TECMAVersion = {$IFDEF FPC_DOTTEDUNITS}Js.Scanner{$ELSE}jsscanner{$ENDIF}.TECMAVersion;
   TScopeType = (stFunction,stClass,stModule,stNamespace);
   TScopeType = (stFunction,stClass,stModule,stNamespace);
   TListType = (ltUnknown,ltTuple,ltTemplate);
   TListType = (ltUnknown,ltTuple,ltTemplate);
   TFunctionFlag = (ffAmbient,ffConstructor,ffGenerator);
   TFunctionFlag = (ffAmbient,ffConstructor,ffGenerator);
@@ -61,11 +68,11 @@ Type
     FScanner : TJSScanner;
     FScanner : TJSScanner;
     FPrevious,
     FPrevious,
     FCurrent : TJSToken;
     FCurrent : TJSToken;
-    FCurrentString : JSBase.TJSString;
+    FCurrentString : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
     FFreeScanner : Boolean;
     FFreeScanner : Boolean;
     FCurrentVars : TJSElementNodes;
     FCurrentVars : TJSElementNodes;
     FPeekToken: TJSToken;
     FPeekToken: TJSToken;
-    FPeekTokenString: JSBase.TJSString;
+    FPeekTokenString: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
     FLabelSets,
     FLabelSets,
     FCurrentLabelSet:TJSLabelSet;
     FCurrentLabelSet:TJSLabelSet;
     FLabels : TJSLabel;
     FLabels : TJSLabel;
@@ -75,11 +82,11 @@ Type
     procedure ClassDefToMembers(aClass: TJSClassDeclaration; aClassDef: TJSObjectTypeDef);
     procedure ClassDefToMembers(aClass: TJSClassDeclaration; aClassDef: TJSObjectTypeDef);
     function CurrentTokenIsValidIdentifier: Boolean;
     function CurrentTokenIsValidIdentifier: Boolean;
     function GetIsTypeScript: Boolean;
     function GetIsTypeScript: Boolean;
-    function  IdentifierIsLiteral(const aValue : jsbase.TJSString) : Boolean;
-    Procedure CheckIdentifierLiteral(const aValue : jsbase.TJSString);
-    function ConsumeIdentifierLiteral(const aValue: jsbase.TJSString): TJSToken;
+    function  IdentifierIsLiteral(const aValue : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString) : Boolean;
+    Procedure CheckIdentifierLiteral(const aValue : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString);
+    function ConsumeIdentifierLiteral(const aValue: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString): TJSToken;
     function CheckSemiColonInsert(aToken: TJSToken; Consume: Boolean): Boolean;
     function CheckSemiColonInsert(aToken: TJSToken; Consume: Boolean): Boolean;
-    function EnterLabel(const ALabelName: jsBase.TJSString): TJSLabel;
+    function EnterLabel(const ALabelName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString): TJSLabel;
     // Check that current token is aToken
     // Check that current token is aToken
     procedure Expect(aToken: TJSToken);
     procedure Expect(aToken: TJSToken);
     // Check that current token is aToken and goto next token.
     // Check that current token is aToken and goto next token.
@@ -87,14 +94,14 @@ Type
     procedure FreeCurrentLabelSet;
     procedure FreeCurrentLabelSet;
     function GetVersion: TECMAVersion;
     function GetVersion: TECMAVersion;
     procedure LeaveLabel;
     procedure LeaveLabel;
-    function LookupLabel(const ALabelName: jsBase.TJSString; Kind: TJSToken): TJSLabel;
+    function LookupLabel(const ALabelName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; Kind: TJSToken): TJSLabel;
     function ParseAdditiveExpression: TJSElement;
     function ParseAdditiveExpression: TJSElement;
     procedure ParseAliasElements(aElements: TJSAliasElements);
     procedure ParseAliasElements(aElements: TJSAliasElements);
     procedure ParseAmbientClassBody(aObj: TJSObjectTypeDef);
     procedure ParseAmbientClassBody(aObj: TJSObjectTypeDef);
     function ParseArguments: TJSarguments;
     function ParseArguments: TJSarguments;
     function ParseArrayLiteral: TJSElement;
     function ParseArrayLiteral: TJSElement;
     procedure ParseArrowFunctionTypeDef(aDef: TJSArrowFunctionTypeDef; aFirstParam: TJSTypedParam); overload;
     procedure ParseArrowFunctionTypeDef(aDef: TJSArrowFunctionTypeDef; aFirstParam: TJSTypedParam); overload;
-    function ParseArrowFunctionTypeDef(const  aArgName: jsBase.TJSString; aArgIsSpread: Boolean): TJSArrowFunctionTypeDef; overload;
+    function ParseArrowFunctionTypeDef(const  aArgName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aArgIsSpread: Boolean): TJSArrowFunctionTypeDef; overload;
     function ParseArrowFunctionTypeDef(aFirst: TJSObjectTypeDef; aArgIsSpread: Boolean): TJSArrowFunctionTypeDef;  overload;
     function ParseArrowFunctionTypeDef(aFirst: TJSObjectTypeDef; aArgIsSpread: Boolean): TJSArrowFunctionTypeDef;  overload;
     function ParseAssignmentExpression: TJSElement;
     function ParseAssignmentExpression: TJSElement;
     function ParseBitwiseAndExpression: TJSElement;
     function ParseBitwiseAndExpression: TJSElement;
@@ -123,7 +130,7 @@ Type
     function ParseFunctionStatement: TJSElement;
     function ParseFunctionStatement: TJSElement;
     function ParseFunctionBody: TJSFunctionBody;
     function ParseFunctionBody: TJSFunctionBody;
     procedure ParseGenericParamList(aList: TJSElementNodes);
     procedure ParseGenericParamList(aList: TJSElementNodes);
-    function ParseIdentifier(AcceptAsIdentifier: TJSTokens=[]): JSBase.TJSString;
+    function ParseIdentifier(AcceptAsIdentifier: TJSTokens=[]): {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
     function ParseIfStatement: TJSElement;
     function ParseIfStatement: TJSElement;
     function ParseImportStatement: TJSElement;
     function ParseImportStatement: TJSElement;
     function ParseIndexSignature: TJSObjectTypeElementDef;
     function ParseIndexSignature: TJSObjectTypeElementDef;
@@ -190,7 +197,7 @@ Type
     Procedure Error(const Msg : String);
     Procedure Error(const Msg : String);
     Procedure Error(const Fmt : String; Args : Array of const);
     Procedure Error(const Fmt : String; Args : Array of const);
     // Parse functions
     // Parse functions
-    Function IsIdentifier(const aIdentifier : jsBase.TJSString) : Boolean; inline;
+    Function IsIdentifier(const aIdentifier : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString) : Boolean; inline;
     function ParseSourceElements(ScopeType : TScopeType = stFunction; ParentisAmbient : Boolean = False): TJSSourceElements;
     function ParseSourceElements(ScopeType : TScopeType = stFunction; ParentisAmbient : Boolean = False): TJSSourceElements;
     Property FunctionDepth : Integer Read FFunctionDepth Write FFunctionDepth;
     Property FunctionDepth : Integer Read FFunctionDepth Write FFunctionDepth;
     Property NoIn : Boolean Read FNoIn Write FNoIn;
     Property NoIn : Boolean Read FNoIn Write FNoIn;
@@ -203,7 +210,7 @@ Type
     Function Parse : TJSElement;
     Function Parse : TJSElement;
     Function ParseProgram : TJSFunctionDeclarationStatement;
     Function ParseProgram : TJSFunctionDeclarationStatement;
     Function CurrentToken : TJSToken;
     Function CurrentToken : TJSToken;
-    Function CurrentTokenString : jsBase.TJSString;
+    Function CurrentTokenString : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
     Function GetNextToken : TJSToken;
     Function GetNextToken : TJSToken;
     Function PeekNextToken : TJSToken;
     Function PeekNextToken : TJSToken;
     Function IsEndOfLine : Boolean;
     Function IsEndOfLine : Boolean;
@@ -214,7 +221,11 @@ Type
 
 
 implementation
 implementation
 
 
+{$IFDEF FPC_DOTTEDUNITS}
+uses System.TypInfo;
+{$ELSE FPC_DOTTEDUNITS}
 uses typinfo;
 uses typinfo;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 Resourcestring
 Resourcestring
   SErrUnmatchedCurlyBrace    = 'Unmatched }';
   SErrUnmatchedCurlyBrace    = 'Unmatched }';
@@ -270,7 +281,7 @@ begin
   Result:=FCurrent;
   Result:=FCurrent;
 end;
 end;
 
 
-Function TJSParser.CurrentTokenString: JSBase.TJSString;
+Function TJSParser.CurrentTokenString: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
 begin
 begin
   Result:=FCurrentString;
   Result:=FCurrentString;
 end;
 end;
@@ -288,9 +299,9 @@ begin
   else
   else
     begin
     begin
     FCurrent:=FScanner.FetchToken;
     FCurrent:=FScanner.FetchToken;
-    FCurrentString:=JSBase.TJSString(FScanner.CurTokenString);
+    FCurrentString:={$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString(FScanner.CurTokenString);
     if (FCurrentString='') then
     if (FCurrentString='') then
-       FCurrentString:=JSBase.TJSString(TokenInfos[FCurrent]);
+       FCurrentString:={$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString(TokenInfos[FCurrent]);
     end;
     end;
   Result:=FCurrent;
   Result:=FCurrent;
   {$ifdef debugparser}Writeln('GetNextToken (',FScanner.CurLine,',',FScanner.CurColumn,'): ',GetEnumName(TypeInfo(TJSToken),Ord(FCurrent)), ' As string: ',FCurrentString);{$endif debugparser}
   {$ifdef debugparser}Writeln('GetNextToken (',FScanner.CurLine,',',FScanner.CurColumn,'): ',GetEnumName(TypeInfo(TJSToken),Ord(FCurrent)), ' As string: ',FCurrentString);{$endif debugparser}
@@ -301,7 +312,7 @@ begin
   If (FPeekToken=tjsUnknown) then
   If (FPeekToken=tjsUnknown) then
     begin
     begin
     FPeekToken:=FScanner.FetchToken;
     FPeekToken:=FScanner.FetchToken;
-    FPeekTokenString:=JSBase.TJSString(FScanner.CurTokenString);
+    FPeekTokenString:={$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString(FScanner.CurTokenString);
     end;
     end;
   {$ifdef debugparser}Writeln('PeekNextToken : ',GetEnumName(TypeInfo(TJSToken),Ord(FPeekToken)), ' As string: ',FPeekTokenString);{$endif debugparser}
   {$ifdef debugparser}Writeln('PeekNextToken : ',GetEnumName(TypeInfo(TJSToken),Ord(FPeekToken)), ' As string: ',FPeekTokenString);{$endif debugparser}
   Result:=FPeekToken;
   Result:=FPeekToken;
@@ -353,7 +364,7 @@ begin
   L.Free; // ??
   L.Free; // ??
 end;
 end;
 
 
-function TJSParser.LookupLabel(const ALabelName: jsBase.TJSString; Kind: TJSToken): TJSLabel;
+function TJSParser.LookupLabel(const ALabelName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; Kind: TJSToken): TJSLabel;
 
 
 Var
 Var
   L : TJSLabel;
   L : TJSLabel;
@@ -382,7 +393,7 @@ begin
     end;
     end;
 end;
 end;
 
 
-function TJSParser.EnterLabel(const ALabelName: jsBase.TJSString): TJSLabel;
+function TJSParser.EnterLabel(const ALabelName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString): TJSLabel;
 
 
 Var
 Var
   L : TJSLabel;
   L : TJSLabel;
@@ -475,7 +486,7 @@ begin
   Error(Format(Fmt,Args));
   Error(Format(Fmt,Args));
 end;
 end;
 
 
-function TJSParser.IsIdentifier(const aIdentifier: jsBase.TJSString): Boolean;
+function TJSParser.IsIdentifier(const aIdentifier: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString): Boolean;
 begin
 begin
   Result:=IdentifierIsLiteral(aIdentifier);
   Result:=IdentifierIsLiteral(aIdentifier);
 end;
 end;
@@ -514,7 +525,7 @@ begin
       Error(SerrTokenMismatch,[CurrenttokenString,TokenInfos[aToken]]);
       Error(SerrTokenMismatch,[CurrenttokenString,TokenInfos[aToken]]);
 end;
 end;
 
 
-function TJSParser.IdentifierIsLiteral(const aValue: jsbase.TJSString): Boolean;
+function TJSParser.IdentifierIsLiteral(const aValue: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString): Boolean;
 begin
 begin
   Result:=(CurrentToken=tjsIdentifier) and (CurrentTokenString=aValue);
   Result:=(CurrentToken=tjsIdentifier) and (CurrentTokenString=aValue);
 end;
 end;
@@ -525,13 +536,13 @@ begin
   Result:=FScanner.IsTypeScript;
   Result:=FScanner.IsTypeScript;
 end;
 end;
 
 
-procedure TJSParser.CheckIdentifierLiteral(const aValue: jsbase.TJSString);
+procedure TJSParser.CheckIdentifierLiteral(const aValue: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString);
 begin
 begin
   if Not IdentifierIsLiteral(aValue) then
   if Not IdentifierIsLiteral(aValue) then
     Error(SErrExpectedButFound,[aValue,CurrentTokenString]);
     Error(SErrExpectedButFound,[aValue,CurrentTokenString]);
 end;
 end;
 
 
-function TJSParser.ConsumeIdentifierLiteral(const aValue: jsbase.TJSString): TJSToken;
+function TJSParser.ConsumeIdentifierLiteral(const aValue: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString): TJSToken;
 begin
 begin
   CheckidentifierLiteral(aValue);
   CheckidentifierLiteral(aValue);
   Result:=GetNextToken;
   Result:=GetNextToken;
@@ -557,7 +568,7 @@ begin
     GetNextToken;
     GetNextToken;
 end;
 end;
 
 
-function TJSParser.ParseIdentifier (AcceptAsIdentifier : TJSTokens = []): JSBase.TJSString;
+function TJSParser.ParseIdentifier (AcceptAsIdentifier : TJSTokens = []): {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
 { On entry, on identifier,
 { On entry, on identifier,
   on exit, after identifier
   on exit, after identifier
 }
 }
@@ -593,7 +604,7 @@ begin
   PrevRShift:=FScanner.DisableRShift;
   PrevRShift:=FScanner.DisableRShift;
   Try
   Try
     FScanner.DisableRShift:=True;
     FScanner.DisableRShift:=True;
-    ParseTypeList(aList,jstoken.tjsGT,ltTemplate);
+    ParseTypeList(aList,{$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsGT,ltTemplate);
   Finally
   Finally
     FScanner.DisableRShift:=PrevRShift;
     FScanner.DisableRShift:=PrevRShift;
   end;
   end;
@@ -630,7 +641,7 @@ begin
   try
   try
     Result:=SigDecl;
     Result:=SigDecl;
     Consume(tjsSQuaredBraceOpen);
     Consume(tjsSQuaredBraceOpen);
-    if (CurrentToken in [TJSToken.tjsNumber,TJSToken.tjsString]) then
+    if (CurrentToken in [TJsToken.tjsNumber,TjsToken.tjsString]) then
       begin
       begin
       SigDecl.IndexName:=CurrentTokenString;
       SigDecl.IndexName:=CurrentTokenString;
       GetNextToken
       GetNextToken
@@ -700,7 +711,7 @@ end;
 Function TJSParser.CurrentTokenIsValidIdentifier : Boolean;
 Function TJSParser.CurrentTokenIsValidIdentifier : Boolean;
 
 
 Const
 Const
-   Valididents = [tjsIdentifier,jstoken.tjsString,jstoken.tjsnumber,tjsDelete,
+   Valididents = [tjsIdentifier,{$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsString,{$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsnumber,tjsDelete,
                   tjsWith,tjsThrow,tjsDefault,tjsAwait,tjscase,tjsdebugger,tjsCatch,
                   tjsWith,tjsThrow,tjsDefault,tjsAwait,tjscase,tjsdebugger,tjsCatch,
                   tjsextends,tjsexport,tjsImport,tjsEnum,tjsClass,tjsFor,tjsReturn,
                   tjsextends,tjsexport,tjsImport,tjsEnum,tjsClass,tjsFor,tjsReturn,
                   tjsDo,tjsFinally,tjsWhile,tjsIf,tjsYield,tjsvoid,tjsbreak, 
                   tjsDo,tjsFinally,tjsWhile,tjsIf,tjsYield,tjsvoid,tjsbreak, 
@@ -727,7 +738,7 @@ Procedure TJSParser.ParseObjectBody(aObj: TJSObjectTypeDef);
 
 
 
 
 var
 var
-  aName : jsBase.TJSString;
+  aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
   IsMinus, isReadOnly, isOptional : Boolean;
   IsMinus, isReadOnly, isOptional : Boolean;
   E : TJSObjectTypeElementDef;
   E : TJSObjectTypeElementDef;
   F : TJSMethodDeclaration ;
   F : TJSMethodDeclaration ;
@@ -898,7 +909,7 @@ begin
     end;
     end;
 end;
 end;
 
 
-function TJSParser.ParseArrowFunctionTypeDef(const aArgName: jsBase.TJSString; aArgIsSpread: Boolean): TJSArrowFunctionTypeDef;
+function TJSParser.ParseArrowFunctionTypeDef(const aArgName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aArgIsSpread: Boolean): TJSArrowFunctionTypeDef;
 
 
 var
 var
   P : TJSTypedParam;
   P : TJSTypedParam;
@@ -969,7 +980,7 @@ Procedure TJSParser.ParseArrowFunctionTypeDef(aDef : TJSArrowFunctionTypeDef; aF
 
 
 Var
 Var
   P : TJSTypedParam;
   P : TJSTypedParam;
-  aName : jsBase.TJSString;
+  aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
   IsSpread : Boolean;
   IsSpread : Boolean;
 
 
 begin
 begin
@@ -1010,7 +1021,7 @@ Function TJSParser.ParseTypeParenthesised (aOptions : TParseTypeOptions): TJSTyp
 
 
 Var
 Var
   aDef : TJSTypeDef;
   aDef : TJSTypeDef;
-  aArgName : jsbase.TJSString;
+  aArgName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
   isSpread : Boolean;
   isSpread : Boolean;
 
 
 begin
 begin
@@ -1063,7 +1074,7 @@ function TJSParser.ParseTypeSimple(aOptions : TParseTypeOptions): TJSTypeDef;
 
 
   Var
   Var
     NeedNext : Boolean;
     NeedNext : Boolean;
-    aName : jsbase.TJSString;
+    aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
 
 
   begin
   begin
     Result:=TJSTypeReference(CreateElement(TJSTypeReference));
     Result:=TJSTypeReference(CreateElement(TJSTypeReference));
@@ -1093,7 +1104,7 @@ function TJSParser.ParseTypeSimple(aOptions : TParseTypeOptions): TJSTypeDef;
 Var
 Var
   CurrT : TJSToken;
   CurrT : TJSToken;
   isInferred,IsReadOnly,IsTypeOf,IsKeyOf : Boolean;
   isInferred,IsReadOnly,IsTypeOf,IsKeyOf : Boolean;
-  aName : jsBase.TJSString;
+  aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
 
 
 begin
 begin
   Result:=Nil;
   Result:=Nil;
@@ -1119,7 +1130,7 @@ begin
         begin
         begin
         Consume(tjsImport);
         Consume(tjsImport);
         Consume(tjsBraceOpen);
         Consume(tjsBraceOpen);
-        Expect(tjsToken.tjsString);
+        Expect(TjsToken.tjsString);
         Result:=TJSImportTypeRef(CreateElement(TJSImportTypeRef));
         Result:=TJSImportTypeRef(CreateElement(TJSImportTypeRef));
         TJSImportTypeRef(Result).FileName:=CurrentTokenString;
         TJSImportTypeRef(Result).FileName:=CurrentTokenString;
         getNextToken;
         getNextToken;
@@ -1143,7 +1154,7 @@ begin
             TJSTypeFuncCall(Result).ArgType:=ParseTypeParenthesised(aOptions);
             TJSTypeFuncCall(Result).ArgType:=ParseTypeParenthesised(aOptions);
             end;
             end;
         end;
         end;
-      tjsTrue,tjsFalse,tjsToken.tjsNumber,tjsToken.tjsString :
+      tjsTrue,tjsFalse,TjsToken.tjsNumber,TjsToken.tjsString :
         if (ptoAllowLiteral in aOptions) then
         if (ptoAllowLiteral in aOptions) then
           begin
           begin
           Result:=TJSFixedValueReference(CreateElement(TJSFixedValueReference));
           Result:=TJSFixedValueReference(CreateElement(TJSFixedValueReference));
@@ -1426,7 +1437,7 @@ Var
   P : TJSTypedParam;
   P : TJSTypedParam;
   IsSpread : Boolean;
   IsSpread : Boolean;
   allowed : TJSTokens;
   allowed : TJSTokens;
-  aName : jsBase.TJSString;
+  aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
 
 
 begin
 begin
   allowed:=[tjsEllipsis, tjsIdentifier];
   allowed:=[tjsEllipsis, tjsIdentifier];
@@ -1473,7 +1484,7 @@ end;
 function TJSParser.ParseFunctionDeclaration(aFlags : TFunctionFlags) : TJSFunctionDeclarationStatement;
 function TJSParser.ParseFunctionDeclaration(aFlags : TFunctionFlags) : TJSFunctionDeclarationStatement;
 
 
 Var
 Var
-  Id : jsBase.TJSString;
+  Id : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
   D : TJSFuncDef;
   D : TJSFuncDef;
   isGenerator : Boolean;
   isGenerator : Boolean;
   TP : TJSElementNodes;
   TP : TJSElementNodes;
@@ -1641,7 +1652,7 @@ begin
       While CurrentToken=tjsComma do
       While CurrentToken=tjsComma do
          GetNextToken;
          GetNextToken;
       NeedAssign:=True;
       NeedAssign:=True;
-      If (CurrentToken in [tjsIdentifier,jstoken.tjsString,jstoken.tjsnumber]) then
+      If (CurrentToken in [tjsIdentifier,{$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsString,{$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsnumber]) then
          begin
          begin
          E:=N.Elements.AddElement;
          E:=N.Elements.AddElement;
          E.Name:=CurrentTokenString;
          E.Name:=CurrentTokenString;
@@ -1724,7 +1735,7 @@ end;
 function TJSParser.ParseRegularExpressionLiteral: TJSElement;
 function TJSParser.ParseRegularExpressionLiteral: TJSElement;
 
 
 Var
 Var
-  S,pa,fl : jsBase.TJSString;
+  S,pa,fl : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
   P : integer;
   P : integer;
   R : TJSRegularExpressionLiteral;
   R : TJSRegularExpressionLiteral;
 begin
 begin
@@ -1776,8 +1787,8 @@ begin
               L.Value.AsBoolean:=(CurrentToken=tjsTrue);
               L.Value.AsBoolean:=(CurrentToken=tjsTrue);
               GetNextToken;
               GetNextToken;
               end;
               end;
-    jstoken.tjsNumber : Result:=ParseNumericLiteral;
-    jstoken.tjsString : Result:=ParseStringLiteral;
+    {$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsNumber : Result:=ParseNumericLiteral;
+    {$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsString : Result:=ParseStringLiteral;
     tjsDiv,
     tjsDiv,
     tjsDivEq : Result:=ParseRegularExpressionLiteral
     tjsDivEq : Result:=ParseRegularExpressionLiteral
   else
   else
@@ -2731,7 +2742,7 @@ end;
 Procedure TJSParser.ParseAliasElements(aElements : TJSAliasElements);
 Procedure TJSParser.ParseAliasElements(aElements : TJSAliasElements);
 // Parse { N [as M] }. On entry, must be on {, on exit curtoken is token after }
 // Parse { N [as M] }. On entry, must be on {, on exit curtoken is token after }
 Var
 Var
-  aName,aAlias : jsbase.TJSString;
+  aName,aAlias : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
 begin
 begin
   Consume(tjsCurlyBraceOpen);
   Consume(tjsCurlyBraceOpen);
   if (CurrentToken<>tjsCurlyBraceClose) then
   if (CurrentToken<>tjsCurlyBraceClose) then
@@ -2799,7 +2810,7 @@ begin
   try
   try
     Result:=Imp;
     Result:=Imp;
     // Just module name
     // Just module name
-    if CurrentToken = jstoken.tjsString then
+    if CurrentToken = {$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsString then
       begin
       begin
       Imp.ModuleName:=CurrentTokenString;
       Imp.ModuleName:=CurrentTokenString;
       GetNextToken;
       GetNextToken;
@@ -2842,9 +2853,9 @@ begin
     if not IsAssigned then
     if not IsAssigned then
       begin
       begin
       ConsumeIdentifierLiteral('from');
       ConsumeIdentifierLiteral('from');
-      Expect(jstoken.tjsString);
+      Expect({$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsString);
       Imp.ModuleName:=CurrentTokenString;
       Imp.ModuleName:=CurrentTokenString;
-      Consume(jstoken.tjsString);
+      Consume({$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsString);
       end;
       end;
     Consume(tjsSemicolon,True);
     Consume(tjsSemicolon,True);
   except
   except
@@ -2956,7 +2967,7 @@ begin
             Exp.Declaration:=ParseAssignmentExpression;
             Exp.Declaration:=ParseAssignmentExpression;
         end;
         end;
         end;
         end;
-      jsToken.tjsAssign:
+      {$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsAssign:
       begin
       begin
       if IsTypeScript then
       if IsTypeScript then
         begin
         begin
@@ -3011,9 +3022,9 @@ begin
     if aExpectFrom and IdentifierIsLiteral('from') then
     if aExpectFrom and IdentifierIsLiteral('from') then
       begin
       begin
       ConsumeIdentifierLiteral('from');
       ConsumeIdentifierLiteral('from');
-      Expect(jstoken.tjsString);
+      Expect({$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsString);
       Exp.ModuleName:=CurrentTokenString;
       Exp.ModuleName:=CurrentTokenString;
-      Consume(jstoken.tjsString);
+      Consume({$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsString);
       end;
       end;
     Consume(tjsSemicolon,True);
     Consume(tjsSemicolon,True);
   except
   except
@@ -3194,7 +3205,7 @@ function TJSParser.ParseTryStatement : TJSElement;
 
 
 Var
 Var
   BO,BC,BF : TJSElement;
   BO,BC,BF : TJSElement;
-  Id : jstree.TJSString;
+  Id : {$IFDEF FPC_DOTTEDUNITS}Js.Tree{$ELSE}jsTree{$ENDIF}.TJSString;
   T : TJSTryStatement;
   T : TJSTryStatement;
 
 
 begin
 begin
@@ -3353,7 +3364,7 @@ Var
   Oni,olhs: Boolean;
   Oni,olhs: Boolean;
   F : TJSFunctionDeclarationStatement;
   F : TJSFunctionDeclarationStatement;
   TP : TJSElementNodes;
   TP : TJSElementNodes;
-  N : jsBase.TJSString;
+  N : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
 
 
 begin
 begin
   {$ifdef debugparser} Writeln('>>> ParseFunctionExpression');{$endif}
   {$ifdef debugparser} Writeln('>>> ParseFunctionExpression');{$endif}
@@ -3700,14 +3711,14 @@ function TJSParser.ParseSourceElements (ScopeType : TScopeType = stFunction; Par
 
 
 Const
 Const
   StatementTokens = [tjsNULL, tjsTRUE, tjsFALSE,
   StatementTokens = [tjsNULL, tjsTRUE, tjsFALSE,
-      tjsAWait, tjsTHIS, tjsIdentifier,jstoken.tjsSTRING,jstoken.tjsNUMBER,
+      tjsAWait, tjsTHIS, tjsIdentifier,{$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsSTRING,{$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsNUMBER,
       tjsBraceOpen,tjsCurlyBraceOpen,tjsSquaredBraceOpen,
       tjsBraceOpen,tjsCurlyBraceOpen,tjsSquaredBraceOpen,
       tjsLet, tjsConst, tjsDebugger, tjsImport, tjsExport,
       tjsLet, tjsConst, tjsDebugger, tjsImport, tjsExport,
       tjsNew,tjsDelete,tjsVoid,tjsTypeOf,
       tjsNew,tjsDelete,tjsVoid,tjsTypeOf,
       tjsPlusPlus,tjsMinusMinus,
       tjsPlusPlus,tjsMinusMinus,
       tjsPlus,tjsMinus,tjsNot,tjsNE,tjsSNE,tjsSemicolon,
       tjsPlus,tjsMinus,tjsNot,tjsNE,tjsSNE,tjsSemicolon,
-      tjsVAR,tjsIF,tjsDO,tjsWHILE,tjsFOR,jstoken.tjsCONTINUE,jstoken.tjsBREAK,jstoken.tjsReturn,
-      tjsWith,jstoken.tjsSWITCH,tjsThrow,TjsTry,tjsDIV,tjsDIVEQ, tjsEnum];
+      tjsVAR,tjsIF,tjsDO,tjsWHILE,tjsFOR,{$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsCONTINUE,{$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsBREAK,{$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsReturn,
+      tjsWith,{$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsSWITCH,tjsThrow,TjsTry,tjsDIV,tjsDIVEQ, tjsEnum];
 
 
 Var
 Var
   F : TJSFunctionDeclarationStatement;
   F : TJSFunctionDeclarationStatement;
@@ -3768,9 +3779,9 @@ begin
         if aSync then
         if aSync then
           GetNextToken;
           GetNextToken;
         Case CurrentToken of
         Case CurrentToken of
-        jstoken.tjsEOF:
+        {$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsEOF:
           done:=True;
           done:=True;
-        jstoken.tjsFunction:
+        {$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsFunction:
           begin
           begin
           If (PeekNextToken<>tjsBraceOpen) then
           If (PeekNextToken<>tjsBraceOpen) then
             begin
             begin
@@ -3788,20 +3799,20 @@ begin
             Result.Statements.AddNode(IsAmbient).Node:=E;
             Result.Statements.AddNode(IsAmbient).Node:=E;
             end;
             end;
           end;
           end;
-        jstoken.tjsClass:
+        {$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsClass:
           begin
           begin
           E:=Self.ParseClassStatement(isAmbient,isAbstract);
           E:=Self.ParseClassStatement(isAmbient,isAbstract);
           Result.Statements.AddNode(IsAmbient).Node:=E;
           Result.Statements.AddNode(IsAmbient).Node:=E;
           C:=TJSClassStatement(E).Decl;
           C:=TJSClassStatement(E).Decl;
           Result.Classes.AddNode(IsAmbient).Node:=C;
           Result.Classes.AddNode(IsAmbient).Node:=C;
           end;
           end;
-        jstoken.tjsEnum:
+        {$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsEnum:
           begin
           begin
           E:=Self.ParseEnumDeclarationStatement;
           E:=Self.ParseEnumDeclarationStatement;
           Result.Statements.AddNode(IsAmbient).Node:=E;
           Result.Statements.AddNode(IsAmbient).Node:=E;
           Result.Enums.AddNode(IsAmbient).Node:=TJSEnumStatement(E).EnumDecl;
           Result.Enums.AddNode(IsAmbient).Node:=TJSEnumStatement(E).EnumDecl;
           end;
           end;
-        jsToken.tjsMul:
+        {$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsMul:
           begin
           begin
           if (ScopeType=stClass) then
           if (ScopeType=stClass) then
             begin
             begin
@@ -3810,7 +3821,7 @@ begin
           else
           else
             DefaultParsing;
             DefaultParsing;
           end;
           end;
-        jsToken.tjsSQuaredBraceOpen:
+        {$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsSQuaredBraceOpen:
           begin
           begin
           if isTypeScript and (ScopeType=stClass) then
           if isTypeScript and (ScopeType=stClass) then
             begin
             begin
@@ -3891,7 +3902,7 @@ end;
 function TJSParser.ParseClassDeclaration(isAmbient: Boolean; IsAbstract: Boolean): TJSClassDeclaration;
 function TJSParser.ParseClassDeclaration(isAmbient: Boolean; IsAbstract: Boolean): TJSClassDeclaration;
 
 
 Var
 Var
-//  aName : jsBase.TJSString;
+//  aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
 //  aTypeDef : TJSTypeDef;
 //  aTypeDef : TJSTypeDef;
   aClassDef : TJSObjectTypeDef;
   aClassDef : TJSObjectTypeDef;
 
 
@@ -3979,7 +3990,7 @@ Procedure TJSParser.ParseAmbientClassBody(aObj: TJSObjectTypeDef);
     Result.Name:='any';
     Result.Name:='any';
   end;
   end;
   
   
-  Function CheckSpecial(aName : jsBase.TJSstring) : Boolean;
+  Function CheckSpecial(aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSstring) : Boolean;
   
   
   begin
   begin
     Result:=IsIdentifier(aName) and Not (PeekNextToken in [tjsConditional,tjsColon]);
     Result:=IsIdentifier(aName) and Not (PeekNextToken in [tjsConditional,tjsColon]);
@@ -3988,7 +3999,7 @@ Procedure TJSParser.ParseAmbientClassBody(aObj: TJSObjectTypeDef);
   end;
   end;
 
 
 var
 var
-  aName : jsBase.TJSString;
+  aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
   IsSet, IsGet, IsAbstract,isStatic, isReadOnly, isOptional : Boolean;
   IsSet, IsGet, IsAbstract,isStatic, isReadOnly, isOptional : Boolean;
   E : TJSObjectTypeElementDef;
   E : TJSObjectTypeElementDef;
   F : TJSMethodDeclaration ;
   F : TJSMethodDeclaration ;
@@ -4142,7 +4153,7 @@ function TJSParser.ParseClassExpression: TJSClassDeclaration;
 Var
 Var
   Oni,olhs: Boolean;
   Oni,olhs: Boolean;
   C : TJSClassDeclaration;
   C : TJSClassDeclaration;
-  aName : jsBase.TJSString;
+  aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
   aType : TJSTypeDef;
   aType : TJSTypeDef;
 
 
 begin
 begin
@@ -4186,7 +4197,7 @@ function TJSParser.ParseModuleDeclaration: TJSModuleDeclaration;
 // on exit, we're after closing }
 // on exit, we're after closing }
 
 
 Var
 Var
-  aName : jsBase.TJSString;
+  aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
 
 
 begin
 begin
   Consume(tjsIdentifier);
   Consume(tjsIdentifier);
@@ -4197,9 +4208,9 @@ begin
     end
     end
   else  
   else  
     begin
     begin
-    Expect(jstoken.tjsString);
+    Expect({$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsString);
     aname:=CurrentTokenString;
     aname:=CurrentTokenString;
-    Consume(jsToken.tjsString);
+    Consume({$IFDEF FPC_DOTTEDUNITS}Js.Token{$ELSE}jsToken{$ENDIF}.tjsString);
     end;
     end;
   Result:=TJSModuleDeclaration(CreateElement(TJSModuleDeclaration));
   Result:=TJSModuleDeclaration(CreateElement(TJSModuleDeclaration));
   try
   try
@@ -4231,7 +4242,7 @@ end;
 function TJSParser.ParseInterfaceDeclaration: TJSInterfaceDeclaration;
 function TJSParser.ParseInterfaceDeclaration: TJSInterfaceDeclaration;
 
 
 Var
 Var
-  aName : jsBase.TJSString;
+  aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
   PT : TJSElementNodes;
   PT : TJSElementNodes;
 
 
 begin
 begin
@@ -4288,7 +4299,7 @@ function TJSParser.ParseNamespaceDeclaration(IsAmbient : Boolean): TJSNamespaceD
 // on exit, we're after closing }
 // on exit, we're after closing }
 
 
 Var
 Var
-  aName : jsBase.TJSString;
+  aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
   IsGlobal : Boolean;
   IsGlobal : Boolean;
   
   
 begin
 begin

+ 6 - 0
packages/fcl-js/src/jsscanner.pp

@@ -15,11 +15,17 @@
 {$mode objfpc}
 {$mode objfpc}
 {$h+}
 {$h+}
 
 
+{$IFNDEF FPC_DOTTEDUNITS}
 unit JSScanner;
 unit JSScanner;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 interface
 interface
 
 
+{$IFDEF FPC_DOTTEDUNITS}
+uses System.SysUtils, System.Classes, Js.Token;
+{$ELSE FPC_DOTTEDUNITS}
 uses SysUtils, Classes, jstoken;
 uses SysUtils, Classes, jstoken;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 Type
 Type
   TECMAVersion = (ecma5,ecma2015,ecma2021);
   TECMAVersion = (ecma5,ecma2015,ecma2021);

+ 19 - 0
packages/fcl-js/src/jssrcmap.pas

@@ -15,7 +15,9 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 
   **********************************************************************}
   **********************************************************************}
+{$IFNDEF FPC_DOTTEDUNITS}
 unit JSSrcMap;
 unit JSSrcMap;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 {$mode objfpc}{$H+}
 {$mode objfpc}{$H+}
 
 
@@ -34,6 +36,22 @@ unit JSSrcMap;
 
 
 interface
 interface
 
 
+{$IFDEF FPC_DOTTEDUNITS}
+uses
+  {$ifdef pas2js}
+  JS,
+    {$ifdef nodejs}
+    Node.FS,
+    {$endif}
+  {$else}
+  System.Contnrs,
+  {$endif}
+  System.Classes, System.SysUtils, FpJson.Data
+  {$ifdef HasJsonParser}
+  , FpJson.Parser, FpJson.Scanner
+  {$endif}
+  ;
+{$ELSE FPC_DOTTEDUNITS}
 uses
 uses
   {$ifdef pas2js}
   {$ifdef pas2js}
   JS,
   JS,
@@ -48,6 +66,7 @@ uses
   , jsonparser, jsonscanner
   , jsonparser, jsonscanner
   {$endif}
   {$endif}
   ;
   ;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 const
 const
   Base64Chars = AnsiString('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/');
   Base64Chars = AnsiString('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/');

+ 2 - 0
packages/fcl-js/src/jstoken.pp

@@ -12,7 +12,9 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
                                 
                                 
   **********************************************************************}
   **********************************************************************}
+{$IFNDEF FPC_DOTTEDUNITS}
 unit jstoken;
 unit jstoken;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 {$mode objfpc}{$H+}
 {$mode objfpc}{$H+}
 
 

+ 23 - 15
packages/fcl-js/src/jstree.pp

@@ -12,15 +12,22 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
                                 
                                 
   **********************************************************************}
   **********************************************************************}
+{$IFNDEF FPC_DOTTEDUNITS}
 unit jstree;
 unit jstree;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 {$mode objfpc}{$H+}
 {$mode objfpc}{$H+}
 { $DEFINE NOCLASSES}
 { $DEFINE NOCLASSES}
 
 
 interface
 interface
 
 
+{$IFDEF FPC_DOTTEDUNITS}
+uses
+{$IFNDEF NOCLASSES}  System.Classes, {$ENDIF} System.SysUtils, Js.Base, Js.Token;
+{$ELSE FPC_DOTTEDUNITS}
 uses
 uses
 {$IFNDEF NOCLASSES}  Classes, {$ENDIF} SysUtils, jsbase, jstoken;
 {$IFNDEF NOCLASSES}  Classes, {$ENDIF} SysUtils, jsbase, jstoken;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 Type
 Type
 {$IFDEF NOCLASSES}
 {$IFDEF NOCLASSES}
@@ -105,6 +112,8 @@ Type
   end;
   end;
 
 
   { TJSLabel }
   { TJSLabel }
+  TJSString = {$IFDEF FPC_DOTTEDUNITS}Js.Base.{$ELSE}jsBase.{$ENDIF}TJSString; // beware of jstoken.tjsString
+  TJSTreeString = {$IFDEF FPC_DOTTEDUNITS}Js.Base.{$ELSE}jsBase.{$ENDIF}TJSString; // beware of jstoken.tjsString
 
 
   TJSLabel = Class(TJSObject)
   TJSLabel = Class(TJSObject)
   private
   private
@@ -112,10 +121,10 @@ Type
     FLocationLine: Integer;
     FLocationLine: Integer;
     FLocationPos: Integer;
     FLocationPos: Integer;
     FLocationSource: String;
     FLocationSource: String;
-    FName: jsBase.TJSString;
+    FName: TJSTreeString;
     FNext: TJSLabel;
     FNext: TJSLabel;
   Public
   Public
-    Property Name : jsBase.TJSString Read FName Write FName;
+    Property Name : TJSTreeString Read FName Write FName;
     Property LabelSet : TJSLabelSet Read FLabelSet Write FLabelSet;
     Property LabelSet : TJSLabelSet Read FLabelSet Write FLabelSet;
     Property LocationSource : String Read FLocationSource Write FLocationSource;
     Property LocationSource : String Read FLocationSource Write FLocationSource;
     Property LocationLine : Integer Read FLocationLine Write FLocationLine;
     Property LocationLine : Integer Read FLocationLine Write FLocationLine;
@@ -123,7 +132,6 @@ Type
     Property Next : TJSLabel Read FNext Write FNext;
     Property Next : TJSLabel Read FNext Write FNext;
   end;
   end;
 
 
-  TJSString = jsbase.TJSString; // beware of jstoken.tjsString
 
 
   { TJSFuncDef - part of TJSFunctionDeclarationStatement, e.g. 'function Name(Params)Body' }
   { TJSFuncDef - part of TJSFunctionDeclarationStatement, e.g. 'function Name(Params)Body' }
   TJSTypedParams = Class;
   TJSTypedParams = Class;
@@ -1194,13 +1202,13 @@ Type
     FIsInferred: Boolean;
     FIsInferred: Boolean;
     FIsOptional: Boolean;
     FIsOptional: Boolean;
     FIsSpread: Boolean;
     FIsSpread: Boolean;
-    FName: jsbase.TJSString;
+    FName: TJSTreeString;
     function GetTypeDef: TJSTypeDef;
     function GetTypeDef: TJSTypeDef;
   Public
   Public
     Procedure Assign(Source : TPersistent); override;
     Procedure Assign(Source : TPersistent); override;
     Destructor Destroy; override;
     Destructor Destroy; override;
     Property Type_ : TJSTypeDef read GetTypeDef;
     Property Type_ : TJSTypeDef read GetTypeDef;
-    Property Name : jsbase.TJSString Read FName Write FName;
+    Property Name : TJSTreeString Read FName Write FName;
     Property IsInferred : Boolean Read FIsInferred Write FIsInferred;
     Property IsInferred : Boolean Read FIsInferred Write FIsInferred;
     Property IsOptional : Boolean Read FIsOptional Write FIsOptional;
     Property IsOptional : Boolean Read FIsOptional Write FIsOptional;
     Property IsSpread : Boolean Read FIsSpread Write FIsSpread;
     Property IsSpread : Boolean Read FIsSpread Write FIsSpread;
@@ -1224,7 +1232,7 @@ Type
   Public
   Public
     Constructor Create; Reintroduce;
     Constructor Create; Reintroduce;
     Constructor CreateTransient;
     Constructor CreateTransient;
-    function AddParam(aName : jsBase.TJSString) : TJSTypedParam;
+    function AddParam(aName : TJSTreeString) : TJSTypedParam;
     Property Params[aIndex : Integer] : TJSTypedParam Read GetParams; default;
     Property Params[aIndex : Integer] : TJSTypedParam Read GetParams; default;
     Property Types[aIndex : Integer] : TJSElement Read GetTypes;
     Property Types[aIndex : Integer] : TJSElement Read GetTypes;
     Property Names[aIndex : Integer] : TJSString Read GetNames;
     Property Names[aIndex : Integer] : TJSString Read GetNames;
@@ -1385,14 +1393,14 @@ Type
   private
   private
     FIsConst: Boolean;
     FIsConst: Boolean;
     function GetElement(aIndex : Integer): TJSEnumElement;
     function GetElement(aIndex : Integer): TJSEnumElement;
-    function GetName(aIndex : Integer): jsBase.TJSString;
+    function GetName(aIndex : Integer): TJSTreeString;
     function GetNameCount: Integer;
     function GetNameCount: Integer;
   Public
   Public
     // names are TJSEnumElement.Name
     // names are TJSEnumElement.Name
-    Function AddName(aName : jsBase.TJSString) : TJSEnumElement;
+    Function AddName(aName : TJSTreeString) : TJSEnumElement;
     Property IsConst : Boolean Read FIsConst Write FIsConst;
     Property IsConst : Boolean Read FIsConst Write FIsConst;
     Property NameCount : Integer Read GetNameCount;
     Property NameCount : Integer Read GetNameCount;
-    Property Names[aIndex : Integer] : jsBase.TJSString Read GetName;
+    Property Names[aIndex : Integer] : TJSTreeString Read GetName;
     Property Elements[aIndex : Integer] : TJSEnumElement Read GetElement; default;
     Property Elements[aIndex : Integer] : TJSEnumElement Read GetElement; default;
   end;
   end;
   { TJSArrowFunctionTypeDef }
   { TJSArrowFunctionTypeDef }
@@ -1519,9 +1527,9 @@ Type
 
 
   TJSPropertyDeclaration = Class(TJSObjectTypeElementDef)
   TJSPropertyDeclaration = Class(TJSObjectTypeElementDef)
   private
   private
-    function GetFixedStringValue: jsBase.TJSString;
+    function GetFixedStringValue: TJSTreeString;
   Public
   Public
-    Property FixedStringValue : jsBase.TJSString Read GetFixedStringValue;
+    Property FixedStringValue : TJSTreeString Read GetFixedStringValue;
   end;
   end;
 
 
   { TJSClassConstDeclaration }
   { TJSClassConstDeclaration }
@@ -1993,7 +2001,7 @@ end;
 
 
 { TJSPropertyDeclaration }
 { TJSPropertyDeclaration }
 
 
-function TJSPropertyDeclaration.GetFixedStringValue: jsBase.TJSString;
+function TJSPropertyDeclaration.GetFixedStringValue: TJSTreeString;
 begin
 begin
   if ElementType is TJSFixedValueReference then
   if ElementType is TJSFixedValueReference then
     Result:=TJSFixedValueReference(ElementType).FixedValue.Value.AsString
     Result:=TJSFixedValueReference(ElementType).FixedValue.Value.AsString
@@ -2093,7 +2101,7 @@ end;
 
 
 { TJSEnumTypeDef }
 { TJSEnumTypeDef }
 
 
-function TJSEnumTypeDef.GetName(aIndex : Integer): jsBase.TJSString;
+function TJSEnumTypeDef.GetName(aIndex : Integer): TJSTreeString;
 begin
 begin
   Result:=GetElement(aIndex).Name;
   Result:=GetElement(aIndex).Name;
 end;
 end;
@@ -2108,7 +2116,7 @@ begin
   Result:=Values.Count;
   Result:=Values.Count;
 end;
 end;
 
 
-Function TJSEnumTypeDef.AddName(aName: jsBase.TJSString) : TJSEnumElement;
+Function TJSEnumTypeDef.AddName(aName: TJSTreeString) : TJSEnumElement;
 
 
 
 
 begin
 begin
@@ -2373,7 +2381,7 @@ begin
   Inherited Create(TJSTransientParamType);
   Inherited Create(TJSTransientParamType);
 end;
 end;
 
 
-function TJSTypedParams.AddParam(aName: jsBase.TJSString): TJSTypedParam;
+function TJSTypedParams.AddParam(aName: TJSTreeString): TJSTypedParam;
 begin
 begin
   Result:=add as TJSTypedParam;
   Result:=add as TJSTypedParam;
   Result.Name:=aName;
   Result.Name:=aName;

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

@@ -12,7 +12,9 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
                                 
                                 
   **********************************************************************}
   **********************************************************************}
+{$IFNDEF FPC_DOTTEDUNITS}
 unit jswriter;
 unit jswriter;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 {$i fcl-js.inc}
 {$i fcl-js.inc}
 
 
@@ -20,11 +22,19 @@ unit jswriter;
 
 
 interface
 interface
 
 
+{$IFDEF FPC_DOTTEDUNITS}
+uses
+  {$ifdef pas2js}
+  JS,
+  {$endif}
+  System.SysUtils, System.Classes, Js.Base, Js.Tree;
+{$ELSE FPC_DOTTEDUNITS}
 uses
 uses
   {$ifdef pas2js}
   {$ifdef pas2js}
   JS,
   JS,
   {$endif}
   {$endif}
   SysUtils, Classes, jsbase, jstree;
   SysUtils, Classes, jsbase, jstree;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 Type
 Type
   {$ifdef pas2js}
   {$ifdef pas2js}

+ 49 - 38
packages/fcl-js/src/tstopas.pp

@@ -12,14 +12,21 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 
  **********************************************************************}
  **********************************************************************}
+{$IFNDEF FPC_DOTTEDUNITS}
 unit tstopas;
 unit tstopas;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 {$mode objfpc}{$H+}
 {$mode objfpc}{$H+}
 
 
 interface
 interface
 
 
+{$IFDEF FPC_DOTTEDUNITS}
+uses
+  System.Classes, System.SysUtils, System.Contnrs, Js.Base, Js.Tree, Js.Scanner, Js.Parser,Pascal.CodeGenerator;
+{$ELSE FPC_DOTTEDUNITS}
 uses
 uses
   Classes, SysUtils, contnrs, jsbase, jstree, jsscanner, jsparser,pascodegen;
   Classes, SysUtils, contnrs, jsbase, jstree, jsscanner, jsparser,pascodegen;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 Type
 Type
   ETSToPas = Class(Exception);
   ETSToPas = Class(Exception);
@@ -33,7 +40,7 @@ Type
     FOriginalName: TJSString;
     FOriginalName: TJSString;
     FPasName: String;
     FPasName: String;
   Public
   Public
-    Constructor Create(const aOriginalName : jsBase.TJSString; const APasName : String);
+    Constructor Create(const aOriginalName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; const APasName : String);
     Destructor destroy; override;
     Destructor destroy; override;
     Property PasName : String read FPasName;
     Property PasName : String read FPasName;
     Property OriginalName : TJSString Read FOriginalName;
     Property OriginalName : TJSString Read FOriginalName;
@@ -70,13 +77,13 @@ Type
     Procedure PushScope(aScope : TJSSourceElements; aForwards : TStringList);
     Procedure PushScope(aScope : TJSSourceElements; aForwards : TStringList);
     Procedure PopScope(aScope : TJSSourceElements; aForwards : TStringList);
     Procedure PopScope(aScope : TJSSourceElements; aForwards : TStringList);
     function ResolveTypeRef(D: TJSTypeDef): TJSTypeDef;
     function ResolveTypeRef(D: TJSTypeDef): TJSTypeDef;
-    function GetTypeName(const aTypeName: jsBase.TJSString; ForTypeDef: Boolean; UsePascal : Boolean): String;
+    function GetTypeName(const aTypeName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; ForTypeDef: Boolean; UsePascal : Boolean): String;
     Function FindInNodes(aNodes: TJSElementNodes; const aName: String): TJSTypeDeclaration;
     Function FindInNodes(aNodes: TJSElementNodes; const aName: String): TJSTypeDeclaration;
     Function FindInScope(aScope: TJSSourceElements; const aName: String): TJSTypeDef;
     Function FindInScope(aScope: TJSSourceElements; const aName: String): TJSTypeDef;
     Function FindTypeDef(const aName : String) : TJSTypeDef;
     Function FindTypeDef(const aName : String) : TJSTypeDef;
-    Function FindTypeAlias(const aName : jsbase.TJSString) : String;
+    Function FindTypeAlias(const aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString) : String;
     Procedure AddToTypeMap(const aName : UTF8String; const aPasName : String);
     Procedure AddToTypeMap(const aName : UTF8String; const aPasName : String);
-    Procedure AddToTypeMap(const aName : jsbase.TJSString; const aPasName : String);
+    Procedure AddToTypeMap(const aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; const aPasName : String);
     Procedure AddToTypeMap(aType : TJSElement);
     Procedure AddToTypeMap(aType : TJSElement);
     Procedure RemoveFromTypeMap(aType : TJSElement);
     Procedure RemoveFromTypeMap(aType : TJSElement);
     Property TypeMap : TFPObjectHashTable Read FTypeMap;
     Property TypeMap : TFPObjectHashTable Read FTypeMap;
@@ -163,7 +170,7 @@ Type
     Procedure PushNameScope;
     Procedure PushNameScope;
     Procedure PopNameScope;
     Procedure PopNameScope;
     function NameScopeHas(const aName : string) : Boolean;
     function NameScopeHas(const aName : string) : Boolean;
-    procedure AddToNameScope(const aName : String; aData : jsbase.TJSString);
+    procedure AddToNameScope(const aName : String; aData : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString);
     Procedure Parse; virtual;
     Procedure Parse; virtual;
     Procedure WritePascal; virtual;
     Procedure WritePascal; virtual;
     Function NeedsTypeMap(El : TJSElement) : Boolean;
     Function NeedsTypeMap(El : TJSElement) : Boolean;
@@ -177,19 +184,19 @@ Type
     procedure ProcessDefinitions; virtual;
     procedure ProcessDefinitions; virtual;
     Function ExportNode(aNode : TJSElementNode) : Boolean;
     Function ExportNode(aNode : TJSElementNode) : Boolean;
     function CheckUnionTypeDefinition(D: TJSTypeDef): TJSUnionTypeDef;
     function CheckUnionTypeDefinition(D: TJSTypeDef): TJSUnionTypeDef;
-    function CreatePasName(const aOriginal : jsBase.TJSString; const aName: String): TPasData;virtual;
+    function CreatePasName(const aOriginal : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; const aName: String): TPasData;virtual;
     function TypeNeedsTypeName(aType: TJSElement; IgnoreData : Boolean; IsResultType : Boolean = False): Boolean;
     function TypeNeedsTypeName(aType: TJSElement; IgnoreData : Boolean; IsResultType : Boolean = False): Boolean;
     procedure AllocatePasNames(FD: TJSFuncDef; const aPrefix: String='');
     procedure AllocatePasNames(FD: TJSFuncDef; const aPrefix: String='');
     procedure AllocatePasNames(aList: TJSSourceElements; const ParentName: String=''); virtual;
     procedure AllocatePasNames(aList: TJSSourceElements; const ParentName: String=''); virtual;
     procedure AllocatePasNames(aList: TJSElementNodes; Const ParentName: String=''); virtual;
     procedure AllocatePasNames(aList: TJSElementNodes; Const ParentName: String=''); virtual;
     Function AllocatePasName(D: TJSElement; Const ParentName: String='') : TPasData;virtual;
     Function AllocatePasName(D: TJSElement; Const ParentName: String='') : TPasData;virtual;
     procedure EnsureUniqueNames(ML: TJSSourceElements);virtual;
     procedure EnsureUniqueNames(ML: TJSSourceElements);virtual;
-    function GetExternalMemberName(const aName: jsBase.TJSString): string;
+    function GetExternalMemberName(const aName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString): string;
     function GetName(ADef: TJSElement): String;virtual;
     function GetName(ADef: TJSElement): String;virtual;
     function GetName(ADef: TJSTypedParam): String;virtual;
     function GetName(ADef: TJSTypedParam): String;virtual;
     function GetName(ADef: TJSFuncDef): String;virtual;
     function GetName(ADef: TJSFuncDef): String;virtual;
     function HaveConsts(aList: TJSSourceElements): Boolean;virtual;
     function HaveConsts(aList: TJSSourceElements): Boolean;virtual;
-    function GetTypeName(Const aTypeName: JSBase.TJSString; ForTypeDef: Boolean=False): String;virtual;
+    function GetTypeName(Const aTypeName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; ForTypeDef: Boolean=False): String;virtual;
     function GetTypeName(aTypeDef: TJSTypeDef; ForTypeDef: Boolean=False): String;virtual;
     function GetTypeName(aTypeDef: TJSTypeDef; ForTypeDef: Boolean=False): String;virtual;
     // Functions
     // Functions
     // Overload handling
     // Overload handling
@@ -257,16 +264,16 @@ Type
     function GetTupleTypeAsString(aTypeDef: TJSTupleTypeDef; asPascal, asSubType: Boolean): String;
     function GetTupleTypeAsString(aTypeDef: TJSTupleTypeDef; asPascal, asSubType: Boolean): String;
     // Write types
     // Write types
     procedure WriteTypeDefs(Types: TJSElementNodes); virtual;
     procedure WriteTypeDefs(Types: TJSElementNodes); virtual;
-    procedure WriteObjectTypeMembers(const aPasName: String; const aOrigName: jsBase.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSObjectTypeDef);
-    procedure WriteObjectTypedef(const aPasName: String; const aOrigName : jsBase.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSObjectTypeDef); virtual;
-    procedure WriteAliasTypeDef(const aPasName: string; const aOrgName: jsBase.TJSString; aTypeParams: TJSElementNodes;  aTypeDef: TJSTypeReference); virtual;
-    procedure WriteUnionTypeDef(const aPasName: string; const aOrgName: jsBase.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSUnionTypeDef); virtual;
-    procedure WriteTupleTypeDef(const aPasName: string; const aOrgName: jsBase.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSTupleTypeDef); virtual;
-    procedure WriteIntersectionTypeDef(const aPasName: string; const aOrgName: jsBase.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSIntersectionTypeDef); virtual;
-    procedure WriteArrayTypeDef(const aPasName: string; const aOrgName: jsBase.TJSString; aTypeParams: TJSElementNodes;  aTypeDef: TJSArrayTypeDef); virtual;
-    procedure WriteEnumTypeDef(const aPasName: string; const aOrgName: jsBase.TJSString; aTypeParams: TJSElementNodes;  aTypeDef: TJSEnumTypeDef); virtual;
-    function  WriteFunctionTypeDef(const aPasName: string; const aOrgName: jsBase.TJSString; aTypeParams: TJSElementNodes; aDef: TJSFuncDef): Boolean; virtual;
-    procedure WriteTypeDef(const aPasName: string; const aOrgName: jsBase.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSTypeDef); virtual;
+    procedure WriteObjectTypeMembers(const aPasName: String; const aOrigName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSObjectTypeDef);
+    procedure WriteObjectTypedef(const aPasName: String; const aOrigName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSObjectTypeDef); virtual;
+    procedure WriteAliasTypeDef(const aPasName: string; const aOrgName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes;  aTypeDef: TJSTypeReference); virtual;
+    procedure WriteUnionTypeDef(const aPasName: string; const aOrgName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSUnionTypeDef); virtual;
+    procedure WriteTupleTypeDef(const aPasName: string; const aOrgName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSTupleTypeDef); virtual;
+    procedure WriteIntersectionTypeDef(const aPasName: string; const aOrgName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSIntersectionTypeDef); virtual;
+    procedure WriteArrayTypeDef(const aPasName: string; const aOrgName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes;  aTypeDef: TJSArrayTypeDef); virtual;
+    procedure WriteEnumTypeDef(const aPasName: string; const aOrgName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes;  aTypeDef: TJSEnumTypeDef); virtual;
+    function  WriteFunctionTypeDef(const aPasName: string; const aOrgName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes; aDef: TJSFuncDef): Boolean; virtual;
+    procedure WriteTypeDef(const aPasName: string; const aOrgName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSTypeDef); virtual;
     // Indirect type handling
     // Indirect type handling
     Function HasIndirectTypeDefs(aParams: TJStypedParams): Boolean;
     Function HasIndirectTypeDefs(aParams: TJStypedParams): Boolean;
     Function HasIndirectTypeDefs(aElements: TJSElementNodes): Boolean;
     Function HasIndirectTypeDefs(aElements: TJSElementNodes): Boolean;
@@ -316,7 +323,11 @@ Type
 
 
 implementation
 implementation
 
 
+{$IFDEF FPC_DOTTEDUNITS}
+uses System.TypInfo, System.StrUtils;
+{$ELSE FPC_DOTTEDUNITS}
 uses typinfo, strutils;
 uses typinfo, strutils;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 Resourcestring
 Resourcestring
   SErrorCannotPopNilScope = 'Cannot pop nil scope';
   SErrorCannotPopNilScope = 'Cannot pop nil scope';
@@ -519,7 +530,7 @@ begin
     Result:=D;
     Result:=D;
 end;
 end;
 
 
-function TTSContext.GetTypeName(const aTypeName: jsBase.TJSString; ForTypeDef: Boolean; UsePascal: Boolean): String;
+function TTSContext.GetTypeName(const aTypeName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; ForTypeDef: Boolean; UsePascal: Boolean): String;
 
 
   Function UsePascalType(Const aPascalType : string) : String;
   Function UsePascalType(Const aPascalType : string) : String;
 
 
@@ -628,7 +639,7 @@ begin
     end;
     end;
 end;
 end;
 
 
-function TTSContext.FindTypeAlias(const aName: jsbase.TJSString): String;
+function TTSContext.FindTypeAlias(const aName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString): String;
 
 
 Var
 Var
   S : UTF8String;
   S : UTF8String;
@@ -710,7 +721,7 @@ begin
   FTypeMap.Add(aName,FConverter.CreatePasName(UTF8Decode(aName),aPasName));
   FTypeMap.Add(aName,FConverter.CreatePasName(UTF8Decode(aName),aPasName));
 end;
 end;
 
 
-procedure TTSContext.AddToTypeMap(const aName: jsbase.TJSString; const aPasName: String);
+procedure TTSContext.AddToTypeMap(const aName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; const aPasName: String);
 begin
 begin
   AddToTypeMap(UTF8Encode(aName),aPasName);
   AddToTypeMap(UTF8Encode(aName),aPasName);
 end;
 end;
@@ -729,7 +740,7 @@ end;
 
 
 { TPasData }
 { TPasData }
 
 
-constructor TPasData.Create(const aOriginalName : jsBase.TJSString; const APasName : String);
+constructor TPasData.Create(const aOriginalName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; const APasName : String);
 begin
 begin
   FOriginalName:=aOriginalName;
   FOriginalName:=aOriginalName;
   FPasName:=APasName;
   FPasName:=APasName;
@@ -850,7 +861,7 @@ begin
   end;
   end;
 end;
 end;
 
 
-function TTypescriptToPas.GetExternalMemberName(const aName : jsBase.TJSString) : string;
+function TTypescriptToPas.GetExternalMemberName(const aName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString) : string;
 
 
 begin
 begin
   if FCurrentNameSpace<>'' then
   if FCurrentNameSpace<>'' then
@@ -897,7 +908,7 @@ begin
     end;
     end;
 end;
 end;
 
 
-function TTypescriptToPas.GetTypeName(const aTypeName: jsBase.TJSString; ForTypeDef: Boolean): String;
+function TTypescriptToPas.GetTypeName(const aTypeName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; ForTypeDef: Boolean): String;
 
 
 
 
 begin
 begin
@@ -923,7 +934,7 @@ end;
 function TTypescriptToPas.GetTypeName(aTypeDef : TJSTypeDef; ForTypeDef : Boolean = False): String;
 function TTypescriptToPas.GetTypeName(aTypeDef : TJSTypeDef; ForTypeDef : Boolean = False): String;
 
 
 Var
 Var
-  S : jsbase.TJSString;
+  S : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
 
 
 begin
 begin
   if (aTypeDef.Data is TPasData) then
   if (aTypeDef.Data is TPasData) then
@@ -1010,7 +1021,7 @@ function TTypescriptToPas.GetGenericParams(aTypeParams: TJSElementNodes) : Strin
 
 
 Var
 Var
   I : Integer;
   I : Integer;
-  aName: jsBase.TJSString;
+  aName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
   N : TJSTypeDef;
   N : TJSTypeDef;
 
 
 begin
 begin
@@ -1050,7 +1061,7 @@ begin
     Result:=UTF8Encode(aTypeDef.Name);
     Result:=UTF8Encode(aTypeDef.Name);
 end;
 end;
 
 
-procedure TTypescriptToPas.WriteAliasTypeDef(const aPasName : string; const aOrgName : jsBase.TJSString; aTypeParams: TJSElementNodes; aTypeDef : TJSTypeReference);
+procedure TTypescriptToPas.WriteAliasTypeDef(const aPasName : string; const aOrgName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes; aTypeDef : TJSTypeReference);
 
 
 Var
 Var
   TN, gen, genparams: String;
   TN, gen, genparams: String;
@@ -1141,7 +1152,7 @@ begin
     Result:=Assigned(FScopeNameList[FScopeIdx].Find(aName));
     Result:=Assigned(FScopeNameList[FScopeIdx].Find(aName));
 end;
 end;
 
 
-procedure TTypescriptToPas.AddToNameScope(const aName: String; aData: jsbase.TJSString);
+procedure TTypescriptToPas.AddToNameScope(const aName: String; aData: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString);
 begin
 begin
   if FScopeIdx>=0 then
   if FScopeIdx>=0 then
     FScopeNameList[FScopeIdx].Add(aName,UTF8Encode(aData));
     FScopeNameList[FScopeIdx].Add(aName,UTF8Encode(aData));
@@ -1377,7 +1388,7 @@ begin
   Result:='SysUtils, JS'
   Result:='SysUtils, JS'
 end;
 end;
 
 
-function TTypescriptToPas.CreatePasName(const aOriginal: jsBase.TJSString; const aName: String): TPasData;
+function TTypescriptToPas.CreatePasName(const aOriginal: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; const aName: String): TPasData;
 
 
 
 
 begin
 begin
@@ -1908,7 +1919,7 @@ begin
     Result:='('+Result+')';
     Result:='('+Result+')';
 end;
 end;
 
 
-Procedure TTypescriptToPas.WriteUnionTypeDef(const aPasName : string; const aOrgName : jsBase.TJSString; aTypeParams: TJSElementNodes;aTypeDef : TJSUnionTypeDef);
+Procedure TTypescriptToPas.WriteUnionTypeDef(const aPasName : string; const aOrgName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes;aTypeDef : TJSUnionTypeDef);
 
 
 var
 var
   TN, gen, genparams, tcomment: String;
   TN, gen, genparams, tcomment: String;
@@ -1957,7 +1968,7 @@ begin
   else
   else
     raise ETSToPas.CreateFmt(SErrUnsupportedTupleElementType, [aTypeDef.Values[0].Node.ClassName]);
     raise ETSToPas.CreateFmt(SErrUnsupportedTupleElementType, [aTypeDef.Values[0].Node.ClassName]);
 end;
 end;
-procedure TTypescriptToPas.WriteTupleTypeDef(const aPasName: string; const aOrgName: jsBase.TJSString;
+procedure TTypescriptToPas.WriteTupleTypeDef(const aPasName: string; const aOrgName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
   aTypeParams: TJSElementNodes; aTypeDef: TJSTupleTypeDef);
   aTypeParams: TJSElementNodes; aTypeDef: TJSTupleTypeDef);
 
 
 var
 var
@@ -1973,7 +1984,7 @@ begin
 end;
 end;
 
 
 
 
-Procedure TTypescriptToPas.WriteIntersectionTypeDef(const aPasName : string; const aOrgName : jsBase.TJSString; aTypeParams: TJSElementNodes;aTypeDef : TJSIntersectionTypeDef);
+Procedure TTypescriptToPas.WriteIntersectionTypeDef(const aPasName : string; const aOrgName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes;aTypeDef : TJSIntersectionTypeDef);
 
 
 var
 var
   TN, gen, genparams: String;
   TN, gen, genparams: String;
@@ -1986,7 +1997,7 @@ begin
   AddLn('%s%s%s = %s; // %s',[gen,aPasName,genparams,TN,GetTypeAsString(aTypeDef,False,false)]);
   AddLn('%s%s%s = %s; // %s',[gen,aPasName,genparams,TN,GetTypeAsString(aTypeDef,False,false)]);
 end;
 end;
 
 
-Procedure TTypescriptToPas.WriteArrayTypeDef(const aPasName : string; const aOrgName : jsBase.TJSString; aTypeParams: TJSElementNodes;aTypeDef : TJSArrayTypeDef);
+Procedure TTypescriptToPas.WriteArrayTypeDef(const aPasName : string; const aOrgName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes;aTypeDef : TJSArrayTypeDef);
 
 
 var
 var
   arr,gen, genparams: String;
   arr,gen, genparams: String;
@@ -1999,7 +2010,7 @@ begin
   AddLn('%s%s%s = %s;',[gen,aPasName,genparams,arr]);
   AddLn('%s%s%s = %s;',[gen,aPasName,genparams,arr]);
 end;
 end;
 
 
-procedure TTypescriptToPas.WriteEnumTypeDef(const aPasName: string; const aOrgName: jsBase.TJSString; aTypeParams: TJSElementNodes;
+procedure TTypescriptToPas.WriteEnumTypeDef(const aPasName: string; const aOrgName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes;
   aTypeDef: TJSEnumTypeDef);
   aTypeDef: TJSEnumTypeDef);
 var
 var
  arr,gen, genparams: String;
  arr,gen, genparams: String;
@@ -2013,7 +2024,7 @@ begin
 end;
 end;
 
 
 
 
-Procedure TTypescriptToPas.WriteTypeDef(const aPasName : string; const aOrgName : jsBase.TJSString; aTypeParams: TJSElementNodes; aTypeDef : TJSTypeDef);
+Procedure TTypescriptToPas.WriteTypeDef(const aPasName : string; const aOrgName : {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes; aTypeDef : TJSTypeDef);
 
 
 begin
 begin
   if NameScopeHas(aPasName) then
   if NameScopeHas(aPasName) then
@@ -2630,7 +2641,7 @@ begin
     exit;
     exit;
 end;
 end;
 
 
-procedure TTypescriptToPas.WriteObjectTypeMembers(const aPasName: String; const aOrigName: jsBase.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSObjectTypeDef);
+procedure TTypescriptToPas.WriteObjectTypeMembers(const aPasName: String; const aOrigName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes; aTypeDef: TJSObjectTypeDef);
 
 
 Var
 Var
   I : Integer;
   I : Integer;
@@ -2685,7 +2696,7 @@ begin
       end;
       end;
 end;
 end;
 
 
-procedure TTypescriptToPas.WriteObjectTypedef(const aPasName: String; const aOrigName: jsBase.TJSString;
+procedure TTypescriptToPas.WriteObjectTypedef(const aPasName: String; const aOrigName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString;
   aTypeParams: TJSElementNodes; aTypeDef: TJSObjectTypeDef);
   aTypeParams: TJSElementNodes; aTypeDef: TJSObjectTypeDef);
 
 
 Var
 Var
@@ -2918,7 +2929,7 @@ begin
   end;
   end;
 end;
 end;
 
 
-function TTypescriptToPas.WriteFunctionTypeDef(const aPasName: string; const aOrgName: jsBase.TJSString; aTypeParams: TJSElementNodes; aDef: TJSFuncDef): Boolean;
+function TTypescriptToPas.WriteFunctionTypeDef(const aPasName: string; const aOrgName: {$IFDEF FPC_DOTTEDUNITS}Js.Base{$ELSE}jsBase{$ENDIF}.TJSString; aTypeParams: TJSElementNodes; aDef: TJSFuncDef): Boolean;
 
 
 Var
 Var
   FN,RT,Args : String;
   FN,RT,Args : String;

+ 7 - 0
packages/fcl-js/tests/tcsrcmap.pas

@@ -1,11 +1,18 @@
+{$IFNDEF FPC_DOTTEDUNITS}
 unit TCSrcMap;
 unit TCSrcMap;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 {$mode objfpc}{$H+}
 {$mode objfpc}{$H+}
 
 
 interface
 interface
 
 
+{$IFDEF FPC_DOTTEDUNITS}
+uses
+  System.Classes, System.SysUtils, FPCUnit.Reports.LaTeX, FPCUnit.Registry, FPJSON.Fpjson, Jssrcmap;
+{$ELSE FPC_DOTTEDUNITS}
 uses
 uses
   Classes, SysUtils, fpcunit, testregistry, fpjson, JSSrcMap;
   Classes, SysUtils, fpcunit, testregistry, fpjson, JSSrcMap;
+{$ENDIF FPC_DOTTEDUNITS}
 
 
 type
 type