Jelajahi Sumber

Moved types to Common so they can be used in Frontend and Backend

Franco Castellacci 9 tahun lalu
induk
melakukan
301a636fc0
3 mengubah file dengan 56 tambahan dan 24 penghapusan
  1. 11 0
      lib/Common/Common.h
  2. 44 11
      lib/Parser/Parse.cpp
  3. 1 13
      lib/Parser/ptree.h

+ 11 - 0
lib/Common/Common.h

@@ -35,6 +35,17 @@ namespace Js
 {
     typedef int32 PropertyId;
     typedef uint32 ModuleID;
+    enum class TypeHint : byte
+    {
+        Unknown = 0,
+        Object = 1,
+        String = 2,
+        Int = 3,
+        Float = 4,
+        Bool = 5,
+        Array = 6,
+        Function = 7
+    };
 }
 
 #define IsTrueOrFalse(value)     ((value) ? _u("True") : _u("False"))

+ 44 - 11
lib/Parser/Parse.cpp

@@ -676,7 +676,7 @@ void Parser::InitNode(OpCode nop,ParseNodePtr pnode) {
     pnode->notEscapedUse = false;
     pnode->isInList = false;
     pnode->isCallApplyTargetLoad = false;
-    pnode->typeHint = JsType::Unknown;
+    pnode->typeHint = Js::TypeHint::Unknown;
 }
 
 // Create nodes using Arena
@@ -3235,17 +3235,24 @@ LFunction :
     {
         m_pscan->SetScanState(Scanner_t::ScanState::ScanStateTypeAnnotationMiddle);
         m_pscan->Scan();
-        switch (m_token.tk)
+
+        if (buildAST) 
         {
-        case tkTypeInt:
-            pnode->typeHint = JsType::Int;
-            break;
-        case tkTypeFloat:
-            pnode->typeHint = JsType::Float;
-            break;
-        case tkTypeBool:
-            pnode->typeHint = JsType::Bool;
-            break;
+            switch (m_token.tk)
+            {
+            case tkTypeInt:
+                pnode->typeHint = Js::TypeHint::Int;
+                break;
+            case tkTypeFloat:
+                pnode->typeHint = Js::TypeHint::Float;
+                break;
+            case tkTypeBool:
+                pnode->typeHint = Js::TypeHint::Bool;
+                break;
+            case tkTypeObject:
+                pnode->typeHint = Js::TypeHint::Object;
+                break;
+            }
         }
         m_pscan->Scan(); //Leave the scanner pointing to the next token
     }
@@ -6307,7 +6314,33 @@ void Parser::ParseFncFormals(ParseNodePtr pnodeFnc, ParseNodePtr pnodeParentFnc,
                 }
 
                 m_pscan->Scan();
+                //FCASTE: Process type annotation on param here
+                //FCASTE: after parsing a term, check if there is a type annotation and parse it
+                if (CONFIG_FLAG(TypeAnnotations) && m_token.tk == tkTypeAnnBegin)
+                {
+                    m_pscan->SetScanState(Scanner_t::ScanState::ScanStateTypeAnnotationMiddle);
+                    m_pscan->Scan();
 
+                    if (buildAST)
+                    {
+                        switch (m_token.tk)
+                        {
+                        case tkTypeInt:
+                            pnodeT->typeHint = Js::TypeHint::Int;
+                            break;
+                        case tkTypeFloat:
+                            pnodeT->typeHint = Js::TypeHint::Float;
+                            break;
+                        case tkTypeBool:
+                            pnodeT->typeHint = Js::TypeHint::Bool;
+                            break;
+                        case tkTypeObject:
+                            pnodeT->typeHint = Js::TypeHint::Object;
+                            break;
+                        }
+                    }
+                    m_pscan->Scan(); //Leave the scanner pointing to the next token
+                }
                 if (seenRestParameter && m_token.tk != tkRParen && m_token.tk != tkAsg)
                 {
                     Error(ERRRestLastArg);

+ 1 - 13
lib/Parser/ptree.h

@@ -600,18 +600,6 @@ struct PnFinally : PnStmt
     ParseNodePtr pnodeBody;
 };
 
-enum class JsType : byte 
-{
-    Unknown,
-    Object,
-    String,
-    Int,
-    Float,
-    Bool,
-    Array,
-    Function
-};
-
 struct ParseNode
 {
     OpCode nop;
@@ -624,7 +612,7 @@ struct ParseNode
     bool notEscapedUse;         // Use by byte code generator.  Currently, only used by child of knopComma
     bool isInList;
     bool isCallApplyTargetLoad;
-    JsType typeHint;
+    Js::TypeHint typeHint;
 #ifdef EDIT_AND_CONTINUE
     ParseNodePtr parent;
 #endif