OSDN Git Service

Fix the following PHP syntax highlighting issues: (#782)
[winmerge-jp/winmerge-jp.git] / Externals / crystaledit / editlib / parsers / php.cpp
index 7ab3dda..6782c74 100644 (file)
 #define new DEBUG_NEW
 #endif
 
+// PHP Keywords
+// (See https://www.php.net/manual/en/reserved.keywords.php)
 static const TCHAR * s_apszPhpKeywordList[] =
   {
+    _T ("__halt_compiler"),
+    _T ("abstract"),
+    _T ("and"),
     _T ("array"),
     _T ("as"),
     _T ("break"),
+    _T ("callable"),        // as of PHP 5.4
     _T ("case"),
-    _T ("cfunction"),
+    _T ("catch"),
+    _T ("cfunction"),       // Only PHP4
     _T ("class"),
+    _T ("clone"),
     _T ("const"),
     _T ("continue"),
     _T ("declare"),
@@ -48,65 +56,192 @@ static const TCHAR * s_apszPhpKeywordList[] =
     _T ("endswitch"),
     _T ("endwhile"),
     _T ("eval"),
-    _T ("exception"),
     _T ("exit"),
     _T ("extends"),
+    _T ("final"),
+    _T ("finally"),         // as of PHP 5.5
+    _T ("fn"),              // as of PHP 7.4
     _T ("for"),
     _T ("foreach"),
+    _T ("from"),            // as of PHP 7.0. This is part of "yield from".
     _T ("function"),
     _T ("global"),
+    _T ("goto"),            // as of PHP 5.3
     _T ("if"),
+    _T ("implements"),
     _T ("include"),
     _T ("include_once"),
+    _T ("instanceof"),
+    _T ("insteadof"),       // as of PHP 5.4
+    _T ("interface"),
     _T ("isset"),
     _T ("list"),
+    _T ("match"),           // as of PHP 8.0
+    _T ("namespace"),       // as of PHP 5.3
     _T ("new"),
-    _T ("old_function"),
-    _T ("php_user_filter"),
+    _T ("old_function"),    // Only PHP4
+    _T ("or"),
     _T ("print"),
+    _T ("private"),
+    _T ("protected"),
+    _T ("public"),
     _T ("require"),
     _T ("require_once"),
     _T ("return"),
     _T ("static"),
     _T ("switch"),
+    _T ("throw"),
+    _T ("trait"),           // as of PHP 5.4
+    _T ("try"),
     _T ("unset"),
     _T ("use"),
     _T ("var"),
     _T ("while"),
+    _T ("xor"),
+    _T ("yield"),           // as of PHP 5.5
   };
 
-static const TCHAR * s_apszPhp1KeywordList[] =
-  {
-    _T ("AND"),
-    _T ("OR"),
-    _T ("XOR"),
-  };
-
-static const TCHAR * s_apszPhp2KeywordList[] =
+// Compile-time constants
+// (See https://www.php.net/manual/en/reserved.keywords.php)
+static const TCHAR * s_apszCompileTimeConstantList[] =
   {
     _T ("__CLASS__"),
+    _T ("__DIR__"),     // as of PHP 5.3
     _T ("__FILE__"),
     _T ("__FUNCTION__"),
     _T ("__LINE__"),
     _T ("__METHOD__"),
+    _T ("__NAMESPACE__"), // as of PHP 5.3
+    _T ("__TRAIT__"),     // as of PHP 5.4
+  };
+
+// Predefined Classes
+// (See https://www.php.net/manual/en/reserved.classes.php)
+static const TCHAR * s_apszPredefinedClassList[] =
+  {
+    _T ("__PHP_Incomplete_Class"),
+    _T ("ArithmeticError"),         // as of PHP 7.0.0
+    _T ("AssertionError"),          // as of PHP 7.0.0
+    _T ("Closure"),                 // as of PHP 5.3.0
+    _T ("Directory"),
+    _T ("DivisionByZeroError"),     // as of PHP 7.0.0
+    _T ("Error"),                   // as of PHP 7.0.0
+    _T ("ErrorException"),          // as of PHP 5.1.0
+    _T ("Exception"),               // as of PHP 5.0.0
+    _T ("Generator"),               // as of PHP 5.5.0
+    _T ("parent"),
+    _T ("ParseError"),              // as of PHP 7.0.0
+    _T ("php_user_filter"),         // as of PHP 5.0.0
+    _T ("self"),
+//  _T ("static"),                  // This is also defined as a PHP keyword, so comment it out.
+    _T ("stdClass"),
+    _T ("Throwable"),               // as of PHP 7.0.0
+    _T ("TypeError"),               // as of PHP 7.0.0
+
+  };
+
+// Predefined Constants
+// (See https://www.php.net/manual/en/reserved.constants.php)
+static const TCHAR * s_apszPredefinedConstantList[] =
+  {
+    _T ("__COMPILER_HALT_OFFSET__"),        // as of PHP 5.1.0
+    _T ("DEFAULT_INCLUDE_PATH"),
+    _T ("E_ALL"),
+    _T ("E_COMPILE_ERROR"),
+    _T ("E_COMPILE_WARNING"),
+    _T ("E_CORE_ERROR"),
+    _T ("E_CORE_WARNING"),
+    _T ("E_DEPRECATED"),                    // as of PHP 5.3.0
+    _T ("E_ERROR"),
+    _T ("E_NOTICE"),
+    _T ("E_PARSE"),
+    _T ("E_RECOVERABLE_ERROR"),             // as of PHP 5.2.0
+    _T ("E_STRICT"),
+    _T ("E_USER_DEPRECATED"),               // as of PHP 5.3.0
+    _T ("E_USER_ERROR"),
+    _T ("E_USER_NOTICE"),
+    _T ("E_USER_WARNING"),
+    _T ("E_WARNING"),
+    _T ("false"),
+    _T ("null"),
+    _T ("PEAR_EXTENSION_DIR"),
+    _T ("PEAR_INSTALL_DIR"),
+    _T ("PHP_BINARY"),
+    _T ("PHP_BINDIR"),
+    _T ("PHP_CONFIG_FILE_PATH"),
+    _T ("PHP_CONFIG_FILE_SCAN_DIR"),
+    _T ("PHP_DATADIR"),
+    _T ("PHP_DEBUG"),                       // as of PHP 5.2.7
+    _T ("PHP_EOL"),                         // as of PHP 5.0.2
+    _T ("PHP_EXTENSION_DIR"),
+    _T ("PHP_EXTRA_VERSION"),               // as of PHP 5.2.7
+    _T ("PHP_FD_SETSIZE"),                  // as of PHP 7.1.0
+    _T ("PHP_FLOAT_DIG"),                   // as of PHP 7.2.0
+    _T ("PHP_FLOAT_EPSILON"),               // as of PHP 7.2.0
+    _T ("PHP_FLOAT_MAX"),                   // as of PHP 7.2.0
+    _T ("PHP_FLOAT_MIN"),                   // as of PHP 7.2.0
+    _T ("PHP_INT_MAX"),                     // as of PHP 5.0.5
+    _T ("PHP_INT_MIN"),                     // as of PHP 7.0.0
+    _T ("PHP_INT_SIZE"),                    // as of PHP 5.0.5
+    _T ("PHP_LIBDIR"),
+    _T ("PHP_LOCALSTATEDIR"),
+    _T ("PHP_MAJOR_VERSION"),               // as of PHP 5.2.7
+    _T ("PHP_MANDIR"),
+    _T ("PHP_MAXPATHLEN"),                  // as of PHP 5.3.0
+    _T ("PHP_MINOR_VERSION"),               // as of PHP 5.2.7
+    _T ("PHP_OS"),
+    _T ("PHP_OS_FAMILY"),                   // as of PHP 7.2.0
+    _T ("PHP_PREFIX"),
+    _T ("PHP_RELEASE_VERSION"),             // as of PHP 5.2.7
+    _T ("PHP_SAPI"),
+    _T ("PHP_SHLIB_SUFFIX"),
+    _T ("PHP_SYSCONFDIR"),
+    _T ("PHP_VERSION"),
+    _T ("PHP_VERSION_ID"),                  // as of PHP 5.2.7
+    _T ("PHP_WINDOWS_EVENT_CTRL_BREAK"),    // as of PHP 7.4.0
+    _T ("PHP_WINDOWS_EVENT_CTRL_C"),        // as of PHP 7.4.0
+    _T ("PHP_ZTS"),                         // as of PHP 5.2.7
+    _T ("true"),
+  };
+
+// Reserved words
+// (See https://www.php.net/manual/en/reserved.other-reserved-words.php)
+static const TCHAR * s_apszReservedWordList[] =
+  {
+    _T ("bool"),        // as of PHP 7
+//  _T ("false"),       // as of PHP 7.  This is also defined as a predefined constant, so comment it out.
+    _T ("float"),       // as of PHP 7
+    _T ("int"),         // as of PHP 7
+    _T ("iterable"),    // as of PHP 7.1
+    _T ("mixed"),       // as of PHP 7
+//  _T ("null"),        // as of PHP 7.  This is also defined as a predefined constant, so comment it out.
+    _T ("numeric"),     // as of PHP 7
+    _T ("object"),      // as of PHP 7.2
+    _T ("resource"),    // as of PHP 7
+    _T ("string"),      // as of PHP 7
+//  _T ("true"),        // as of PHP 7.  This is also defined as a predefined constant, so comment it out.
+    _T ("void"),        // as of PHP 7.1
   };
 
 static bool
 IsPhpKeyword (const TCHAR *pszChars, int nLength)
 {
-  return ISXKEYWORDI (s_apszPhpKeywordList, pszChars, nLength);
+  return ISXKEYWORDI (s_apszPhpKeywordList, pszChars, nLength) ||
+         ISXKEYWORDI (s_apszReservedWordList, pszChars, nLength);
 }
 
 static bool
 IsPhp1Keyword (const TCHAR *pszChars, int nLength)
 {
-  return ISXKEYWORDI (s_apszPhp1KeywordList, pszChars, nLength);
+  return false;
 }
 
 static bool
 IsPhp2Keyword (const TCHAR *pszChars, int nLength)
 {
-  return ISXKEYWORDI (s_apszPhp2KeywordList, pszChars, nLength);
+  return ISXKEYWORDI (s_apszCompileTimeConstantList, pszChars, nLength) ||
+         ISXKEYWORDI (s_apszPredefinedClassList, pszChars, nLength) ||
+         ISXKEYWORDI (s_apszPredefinedConstantList, pszChars, nLength);
 }
 
 unsigned
@@ -119,7 +254,7 @@ unsigned
 CrystalLineParser::ParseLinePhpLanguage (unsigned dwCookie, const TCHAR *pszChars, int nLength, TEXTBLOCK * pBuf, int &nActualItems)
 {
   if (nLength == 0)
-    return dwCookie & (COOKIE_EXT_COMMENT);
+    return dwCookie & (COOKIE_EXT_COMMENT | COOKIE_STRING | COOKIE_CHAR);
 
   const TCHAR *pszCommentBegin = nullptr;
   const TCHAR *pszCommentEnd = nullptr;
@@ -312,16 +447,10 @@ out:
                     {
                       DEFINE_BLOCK (nIdentBegin, COLORINDEX_FUNCNAME);
                     }
-                  else
-                    {
-                      goto next;
-                    }
                 }
               bRedefineBlock = true;
               bDecIndex = true;
               nIdentBegin = -1;
-next:
-              ;
             }
 
           //  Preprocessor start: $
@@ -345,46 +474,7 @@ next:
         }
     }
 
-  if (nIdentBegin >= 0 && (dwCookie & COOKIE_PREPROCESSOR))
-    {
-      if (IsHtmlKeyword (pszChars + nIdentBegin, I - nIdentBegin) && (pszChars[nIdentBegin - 1] == _T ('<') || pszChars[nIdentBegin - 1] == _T ('/')))
-        {
-          DEFINE_BLOCK (nIdentBegin, COLORINDEX_KEYWORD);
-        }
-      else if (IsHtmlUser1Keyword (pszChars + nIdentBegin, I - nIdentBegin))
-        {
-          DEFINE_BLOCK (nIdentBegin, COLORINDEX_USER1);
-        }
-      else if (IsHtmlUser2Keyword (pszChars + nIdentBegin, I - nIdentBegin))
-        {
-          DEFINE_BLOCK (nIdentBegin, COLORINDEX_USER2);
-        }
-      else if (IsXNumber (pszChars + nIdentBegin, I - nIdentBegin))
-        {
-          DEFINE_BLOCK (nIdentBegin, COLORINDEX_NUMBER);
-        }
-      else
-        {
-          bool bFunction = false;
-
-          for (int j = I; j < nLength; j++)
-            {
-              if (!xisspace (pszChars[j]))
-                {
-                  if (pszChars[j] == '(')
-                    {
-                      bFunction = true;
-                    }
-                  break;
-                }
-            }
-          if (bFunction)
-            {
-              DEFINE_BLOCK (nIdentBegin, COLORINDEX_FUNCNAME);
-            }
-        }
-    }
-  else if (nIdentBegin >= 0 && (dwCookie & COOKIE_EXT_USER1))
+  if (nIdentBegin >= 0)
     {
       if (IsPhpKeyword (pszChars + nIdentBegin, I - nIdentBegin))
         {
@@ -424,6 +514,6 @@ next:
         }
     }
 
-  dwCookie &= (COOKIE_EXT_COMMENT | COOKIE_STRING);
+  dwCookie &= (COOKIE_EXT_COMMENT | COOKIE_STRING | COOKIE_CHAR);
   return dwCookie;
 }