///////////////////////////////////////////////////////////////////////////
// File: java.cpp
// Version: 1.1.0.4
// Updated: 19-Jul-1998
//
// Copyright: Ferdinand Prantl, portions by Stcherbatchenko Andrei
// E-mail: prantl@ff.cuni.cz
//
// Java syntax highlighing definition
//
// You are free to use or modify this code to the following restrictions:
// - Acknowledge me somewhere in your about box, simple "Parts of code by.."
// will be enough. If you can't (or don't want to), contact me personally.
// - LEAVE THIS HEADER INTACT
////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "VisualJavaView.h"
#include "VisualJavaDoc.h"
#include "JavaDeclManager.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// C++ keywords (MSVC5.0 + POET5.0)
static LPTSTR s_apszJavaKeywordList[] =
{
_T ("abstract"),
_T ("default"),
_T ("goto"),
_T ("null"),
_T ("synchronized"),
_T ("boolean"),
_T ("do"),
_T ("if"),
_T ("package"),
_T ("this"),
_T ("break"),
_T ("double"),
_T ("implements"),
_T ("private"),
_T ("threadsafe"),
_T ("byte"),
_T ("else"),
_T ("import"),
_T ("protected"),
_T ("throw"),
_T ("byvalue"),
_T ("extends"),
_T ("instanceof"),
_T ("public"),
_T ("transient"),
_T ("case"),
_T ("false"),
_T ("int"),
_T ("return"),
_T ("true"),
_T ("catch"),
_T ("final"),
_T ("interface"),
_T ("short"),
_T ("try"),
_T ("char"),
_T ("finally"),
_T ("long"),
_T ("static"),
_T ("void"),
_T ("class"),
_T ("float"),
_T ("native"),
_T ("super"),
_T ("while"),
_T ("const"),
_T ("for"),
_T ("new"),
_T ("switch"),
_T ("continue"),
NULL
};
static LPCTSTR m_szpBeginWizCode = _T("{{...Dynamic_Coding_Update");
static LPCTSTR m_szpEndWizCode = _T("...}}Dynamic_Coding_Update");
static BOOL IsBeginWizardCodeSeg(LPCTSTR szpLine,int nLen)
{
int nLen1 = lstrlen(m_szpBeginWizCode);
//MessageBox(0,"Debugg break",0,MB_OK);
for(int I=0;I<nLen;I++)
{
if(I<nLen1&&(szpLine[I] == m_szpBeginWizCode[I]))
{
//MessageBox(0,CString(szpLine[I]),0,MB_OK);
continue;
}
else
if(I==nLen1&&!__iscsym(szpLine[I]))
{
return TRUE;
}
else
{
/*CString str;
str.Format("%d",nLen);
MessageBox(0,"Debug returned on:"+CString(szpLine[I])+":"+str,0,MB_OK);*/
return FALSE;
}
}//MessageBox(0,"Debugging",0,MB_OK);
return(I == nLen1);
}
static BOOL IsEndWizardCodeSeg(LPCTSTR szpLine,int nLen)
{
int nLen1 = lstrlen(m_szpEndWizCode);
for(int I=0; I<nLen; I++)
{
if(I<nLen1&&(szpLine[I] == m_szpEndWizCode[I]))
{
continue;
}
else
if(I==nLen1&&!__iscsym(szpLine[I]))
{
return TRUE;
}
else
return FALSE;
}return (I== nLen1);
}
static BOOL IsXKeyword (LPTSTR apszKeywords[], LPCTSTR pszChars, int nLength)
{
for (int L = 0; apszKeywords[L] != NULL; L++)
{
if (_tcsncmp (apszKeywords[L], pszChars, nLength) == 0
&& apszKeywords[L][nLength] == 0)
return TRUE;
}
return FALSE;
}
static BOOL IsJavaKeyword (LPCTSTR pszChars, int nLength)
{
return IsXKeyword (s_apszJavaKeywordList, pszChars, nLength);
}
static BOOL IsJavaNumber (LPCTSTR pszChars, int nLength)
{
if (nLength > 2 && pszChars[0] == '0' && pszChars[1] == 'x')
{
for (int I = 2; I < nLength; I++)
{
if (_istdigit (pszChars[I]) || (pszChars[I] >= 'A' && pszChars[I] <= 'F') ||
(pszChars[I] >= 'a' && pszChars[I] <= 'f'))
continue;
return FALSE;
}
return TRUE;
}
if (!_istdigit (pszChars[0]))
return FALSE;
for (int I = 1; I < nLength; I++)
{
if (!_istdigit (pszChars[I]) && pszChars[I] != '+' &&
pszChars[I] != '-' && pszChars[I] != '.' && pszChars[I] != 'e' &&
pszChars[I] != 'E')
return FALSE;
}
return TRUE;
}
#define DEFINE_BLOCK(pos, colorindex) \
ASSERT((pos) >= 0 && (pos) <= nLength);\
if (pBuf != NULL)\
{\
if (nActualItems == 0 || pBuf[nActualItems - 1].m_nCharPos <= (pos)){\
pBuf[nActualItems].m_nCharPos = (pos);\
pBuf[nActualItems].m_nColorIndex = (colorindex);\
nActualItems ++;}\
}
#define COOKIE_COMMENT 0x0001
#define COOKIE_PREPROCESSOR 0x0002
#define COOKIE_EXT_COMMENT 0x0004
#define COOKIE_STRING 0x0008
#define COOKIE_CHAR 0x0010
#define COOKIE_WIZARD_CODE 0x0020
#define COOKIE_COLAPSIBLE 0x0040
#define COOKIE_ROOTNODE 0x0080
#define COOKIE_COLAPSED 0x0100
DWORD CVisualJavaView::ParseLineJava(DWORD dwCookie, int nLineIndex,
CCrystalTextView::TEXTBLOCK * pBuf, int &nActualItems)
{
int nLength = GetLineLength(nLineIndex);
if(nLength <= 0)
{
if((dwCookie & COOKIE_WIZARD_CODE) != 0)
return dwCookie;
else
return dwCookie & COOKIE_EXT_COMMENT;
}
//turn off all colapsing attributes from above line
dwCookie = (dwCookie & ~COOKIE_COLAPSIBLE);
//dwCookie = (dwCookie & ~COOKIE_ROOTNODE);
//dwCookie = (dwCookie & ~COOKIE_COLAPSED);
LPCTSTR pszChars = GetLineChars (nLineIndex);
BOOL bFirstChar = (dwCookie & ~COOKIE_EXT_COMMENT) == 0;
BOOL bRedefineBlock = TRUE;
BOOL bWasCommentStart = FALSE;
BOOL bDecIndex = FALSE;
int nIdentBegin = -1;
for(int I = 0;; I++)
{
if(bRedefineBlock)
{
int nPos = I;
if(bDecIndex)
nPos--;
if(dwCookie & (COOKIE_COMMENT | COOKIE_EXT_COMMENT))
{
DEFINE_BLOCK(nPos,COLORINDEX_COMMENT);
}
else
if(dwCookie & COOKIE_WIZARD_CODE)
{
DEFINE_BLOCK(nPos,COLORINDEX_WIZARDCODE);
}
else
if(dwCookie & (COOKIE_CHAR | COOKIE_STRING))
{
DEFINE_BLOCK (nPos, COLORINDEX_STRING);
}
else
if(dwCookie & COOKIE_PREPROCESSOR)
{
DEFINE_BLOCK (nPos, COLORINDEX_PREPROCESSOR);
}
else
{
if(xisalnum(pszChars[nPos]) || pszChars[nPos] == '.' && nPos > 0 && (!xisalpha (pszChars[nPos - 1]) && !xisalpha (pszChars[nPos + 1])))
{
DEFINE_BLOCK(nPos,COLORINDEX_NORMALTEXT);
}
else
{
DEFINE_BLOCK(nPos,COLORINDEX_OPERATOR);
bRedefineBlock = TRUE;
bDecIndex = TRUE;
goto out;
}
}
bRedefineBlock = FALSE;
bDecIndex = FALSE;
}
out:
if(I == nLength)
break;
if(dwCookie & COOKIE_COMMENT)
{
DEFINE_BLOCK(I,COLORINDEX_COMMENT);
dwCookie |= COOKIE_COMMENT;
break;
}
// String constant "...."
if(dwCookie & COOKIE_STRING)
{
if(pszChars[I] == '"' && (I == 0 || I == 1 && pszChars[I - 1] != '\\' || I >= 2 && (pszChars[I - 1] != '\\' || pszChars[I - 1] == '\\' && pszChars[I - 2] == '\\')))
{
dwCookie &= ~COOKIE_STRING;
bRedefineBlock = TRUE;
}
continue;
}
// Char constant '..'
if(dwCookie & COOKIE_CHAR)
{
if(pszChars[I] == '\'' && (I == 0 || I == 1 && pszChars[I - 1] != '\\' || I >= 2 && (pszChars[I - 1] != '\\' || pszChars[I - 1] == '\\' && pszChars[I - 2] == '\\')))
{
dwCookie &= ~COOKIE_CHAR;
bRedefineBlock = TRUE;
}
continue;
}
// Extended comment /*....*/
if(dwCookie & COOKIE_EXT_COMMENT)
{
// if (I > 0 && pszChars[I] == '/' && pszChars[I - 1] == '*')
if((I > 1 && pszChars[I] == '/' && pszChars[I - 1] == '*' /*&& pszChars[I - 2] != '/'*/ && !bWasCommentStart) || (I == 1 && pszChars[I] == '/' && pszChars[I - 1] == '*'))
{
dwCookie &= ~COOKIE_EXT_COMMENT;
bRedefineBlock = TRUE;
}
bWasCommentStart = FALSE;
continue;
}
if(I > 0 && pszChars[I] == '/' && pszChars[I - 1] == '/')
{
DEFINE_BLOCK (I - 1, COLORINDEX_COMMENT);
//dwCookie |= COOKIE_COMMENT;
if((dwCookie & COOKIE_WIZARD_CODE) == 0)
dwCookie =0;
//start of wizard code segment
if((I+1<nLength)&&pszChars[I+1] == '{')
{
if(IsBeginWizardCodeSeg(pszChars+I+1,nLength-I-1))
{
DEFINE_BLOCK (nLength, COLORINDEX_COMMENT);
dwCookie = COOKIE_WIZARD_CODE;
}
}
else
if((dwCookie & COOKIE_WIZARD_CODE)&&((I+1<nLength)&&pszChars[I+1] == '.'))
{
if(IsEndWizardCodeSeg(pszChars+I+1,nLength-I-1))
dwCookie &= ~COOKIE_WIZARD_CODE;
}
break;
}
// Preprocessor directive #....
if(dwCookie & COOKIE_PREPROCESSOR)
{
if(I > 0 && pszChars[I] == '*' && pszChars[I - 1] == '/')
{
DEFINE_BLOCK (I - 1, COLORINDEX_COMMENT);
dwCookie |= COOKIE_EXT_COMMENT;
}
continue;
}
// Normal text
if(pszChars[I] == '"')
{
/**if((dwCookie & COOKIE_WIZARD_CODE) != 0)
{
}
else**/
{
DEFINE_BLOCK (I, COLORINDEX_STRING);
dwCookie |= COOKIE_STRING;
}
continue;
}
if(pszChars[I] == '\'')
{
// if (I + 1 < nLength && pszChars[I + 1] == '\'' || I + 2 < nLength && pszChars[I + 1] != '\\' && pszChars[I + 2] == '\'' || I + 3 < nLength && pszChars[I + 1] == '\\' && pszChars[I + 3] == '\'')
if(!I || !xisalnum (pszChars[I - 1]))
{
/**
if((dwCookie & COOKIE_WIZARD_CODE) != 0)
{
}
else
**/
{
DEFINE_BLOCK (I, COLORINDEX_STRING);
dwCookie |= COOKIE_CHAR;
}
continue;
}
}
if(I > 0 && pszChars[I] == '*' && pszChars[I - 1] == '/')
{
DEFINE_BLOCK (I - 1, COLORINDEX_COMMENT);
dwCookie |= COOKIE_EXT_COMMENT;
bWasCommentStart = TRUE;
continue;
}
//for colapsible coding
if((pszChars[I] == '{')/*&&((dwCookie & COOKIE_COLAPSIBLE) == 0)*/)
{
dwCookie |= COOKIE_COLAPSIBLE;
/**
DWORD dwTempCookie =0;
CJavaTextBuffer* pTemp = (CJavaTextBuffer*)m_pTextBuffer;
if(pTemp->getDeclMgr()->PointInBlockDecl(I,nLineIndex, dwTempCookie))
{
dwCookie |= COOKIE_COLAPSIBLE;
dwCookie |= dwTempCookie;
}
else
if(m_bEnableColapsingAllBlocks)//'{'
dwCookie |= COOKIE_COLAPSIBLE;
//else//function|class|interface
**/
}
bWasCommentStart = FALSE;
if(bFirstChar)
{
if(pszChars[I] == '#')
{
if((dwCookie & COOKIE_WIZARD_CODE) != 0)
{
}
else
{
DEFINE_BLOCK(I,COLORINDEX_PREPROCESSOR);
dwCookie |= COOKIE_PREPROCESSOR;
}
continue;
}
if(!isspace (pszChars[I]))
bFirstChar = FALSE;
}
if(pBuf == NULL)
continue; // We don't need to extract keywords,
// for faster parsing skip the rest of loop
if(xisalnum(pszChars[I]) || pszChars[I] == '.' && I > 0 && (!xisalpha(pszChars[I - 1]) && !xisalpha (pszChars[I + 1])))
{
if(nIdentBegin == -1)
nIdentBegin = I;
}
else
{
if(nIdentBegin >= 0)
{
if(IsJavaKeyword (pszChars + nIdentBegin, I - nIdentBegin))
{
if((dwCookie & COOKIE_WIZARD_CODE)!=0)
{
}
else
{
DEFINE_BLOCK (nIdentBegin, COLORINDEX_KEYWORD);
}
}
else
if(IsJavaNumber (pszChars + nIdentBegin, I - nIdentBegin))
{
if((dwCookie & COOKIE_WIZARD_CODE)!=0)
{
}
else
{
DEFINE_BLOCK (nIdentBegin, COLORINDEX_NUMBER);
}
}
else
{
bool bFunction = FALSE;
for(int j = I; j < nLength; j++)
{
if(!isspace (pszChars[j]))
{
if(pszChars[j] == '(')
{
bFunction = TRUE;
}
break;
}
}
if(bFunction)
{
if((dwCookie & COOKIE_WIZARD_CODE)!=0)
{
}
else
{
//ASSERT(FALSE);
//DEFINE_BLOCK (nIdentBegin, COLORINDEX_FUNCNAME);
}
}
}
bRedefineBlock = TRUE;
bDecIndex = TRUE;
nIdentBegin = -1;
}
}
}
if(nIdentBegin >= 0)
{
if(IsJavaKeyword (pszChars + nIdentBegin, I - nIdentBegin))
{
if((dwCookie & COOKIE_WIZARD_CODE)!=0)
{
}
else
{
DEFINE_BLOCK (nIdentBegin, COLORINDEX_KEYWORD);
}
}
else
if(IsJavaNumber (pszChars + nIdentBegin, I - nIdentBegin))
{
if((dwCookie & COOKIE_WIZARD_CODE)!=0)
{
}
else
{
DEFINE_BLOCK (nIdentBegin, COLORINDEX_NUMBER);
}
}
else
{
bool bFunction = FALSE;
for(int j = I; j < nLength; j++)
{
if(!isspace (pszChars[j]))
{
if(pszChars[j] == '(')
{
bFunction = TRUE;
}
break;
}
}
if(bFunction)
{
if((dwCookie & COOKIE_WIZARD_CODE)!=0)
{
}
else
{
//ASSERT(FALSE);
//DEFINE_BLOCK (nIdentBegin, COLORINDEX_FUNCNAME);
}
}
}
}
if(((dwCookie & COOKIE_WIZARD_CODE) == 0)&&
((dwCookie & COOKIE_COLAPSIBLE) == 0))
{
if(pszChars[nLength - 1] != '\\')
dwCookie &= COOKIE_EXT_COMMENT;
}
return dwCookie;
}