int PHPOutlineTree::GetImageId(PHPEntityBase::Ptr_t entry) { BitmapLoader* bmpLoader = clGetManager()->GetStdIcons(); if(entry->Is(kEntityTypeFunction)) { PHPEntityFunction* func = entry->Cast<PHPEntityFunction>(); if(func->HasFlag(kFunc_Private)) return bmpLoader->GetImageIndex(BitmapLoader::kFunctionPrivate); else if(func->HasFlag(kFunc_Protected)) return bmpLoader->GetImageIndex(BitmapLoader::kFunctionProtected); else // public return bmpLoader->GetImageIndex(BitmapLoader::kFunctionPublic); } else if(entry->Is(kEntityTypeVariable)) { PHPEntityVariable* var = entry->Cast<PHPEntityVariable>(); if(!var->IsMember() && !var->IsConst()) { // A global variale return bmpLoader->GetImageIndex(BitmapLoader::kMemberPublic); } else if(var->IsMember()) { if(var->HasFlag(kVar_Const)) return bmpLoader->GetImageIndex(BitmapLoader::kConstant); // constant // Member if(var->HasFlag(kVar_Private)) return bmpLoader->GetImageIndex(BitmapLoader::kMemberPrivate); else if(var->HasFlag(kVar_Protected)) return bmpLoader->GetImageIndex(BitmapLoader::kMemberProtected); else return bmpLoader->GetImageIndex(BitmapLoader::kMemberPublic); } else if(var->IsConst()) { // Constant return bmpLoader->GetImageIndex(BitmapLoader::kConstant); } else { return bmpLoader->GetImageIndex(BitmapLoader::kMemberPublic); } } else if(entry->Is(kEntityTypeNamespace)) { // Namespace return bmpLoader->GetImageIndex(BitmapLoader::kNamespace); } else if(entry->Is(kEntityTypeClass)) { return bmpLoader->GetImageIndex(BitmapLoader::kClass); } return wxNOT_FOUND; // Unknown }
int PHPFileLayoutTree::GetImageId(PHPEntityBase::Ptr_t entry) { if(entry->Is(kEntityTypeFunction)) { PHPEntityFunction* func = entry->Cast<PHPEntityFunction>(); if(func->HasFlag(kFunc_Private)) return 1; else if(func->HasFlag(kFunc_Protected)) return 2; else // public return 3; } else if(entry->Is(kEntityTypeVariable)) { PHPEntityVariable* var = entry->Cast<PHPEntityVariable>(); if(!var->IsMember() && !var->IsConst()) { // A global variale return 6; } else if(var->IsMember()) { if(var->HasFlag(kVar_Const)) return 9; // constant // Member if(var->HasFlag(kVar_Private)) return 4; else if(var->HasFlag(kVar_Protected)) return 5; else return 6; } else if(var->IsConst()) { // Constant return 9; } else { return 6; } } else if(entry->Is(kEntityTypeNamespace)) { // Namespace return 7; } else if(entry->Is(kEntityTypeClass)) { return 8; } return -1; // Unknown }
TagEntryPtr PHPCodeCompletion::DoPHPEntityToTagEntry(PHPEntityBase::Ptr_t entry) { TagEntryPtr t(new TagEntry()); // wxString name = entry->Is(kEntityTypeNamespace) ? entry->GetFullName() : entry->GetShortName(); wxString name = entry->GetShortName(); if(entry->Is(kEntityTypeVariable) && entry->Cast<PHPEntityVariable>()->IsMember() && name.StartsWith(wxT("$")) && !entry->Cast<PHPEntityVariable>()->IsStatic()) { name.Remove(0, 1); } else if((entry->Is(kEntityTypeClass) || entry->Is(kEntityTypeNamespace)) && name.StartsWith("\\")) { name.Remove(0, 1); } t->SetName(name); t->SetParent(entry->Parent() ? entry->Parent()->GetFullName() : ""); t->SetPattern(t->GetName()); // Set the document comment wxString comment, docComment; docComment = entry->GetDocComment(); if(docComment.IsEmpty() == false) { docComment.Trim().Trim(false); // The Doc comment comment << docComment << wxT("\n<hr>"); // HLine } wxFileName fn(entry->GetFilename()); fn.MakeRelativeTo(PHPWorkspace::Get()->GetFilename().GetPath()); comment << fn.GetFullName() << wxT(" : ") << entry->GetLine(); t->SetComment(comment); // Access if(entry->Is(kEntityTypeVariable)) { PHPEntityVariable* var = entry->Cast<PHPEntityVariable>(); // visibility if(var->IsPrivate()) t->SetAccess(wxT("private")); else if(var->IsProtected()) t->SetAccess(wxT("protected")); else t->SetAccess(wxT("public")); // type (affects icon) if(var->IsConst() || var->IsDefine()) { t->SetKind("macro"); } else { t->SetKind("variable"); } t->SetReturnValue(""); } else if(entry->Is(kEntityTypeFunction) || entry->Is(kEntityTypeFunctionAlias)) { PHPEntityFunction* func = NULL; if(entry->Is(kEntityTypeFunctionAlias)) { func = entry->Cast<PHPEntityFunctionAlias>()->GetFunc()->Cast<PHPEntityFunction>(); } else { func = entry->Cast<PHPEntityFunction>(); } if(func->HasFlag(kFunc_Private)) { t->SetAccess(wxT("private")); } else if(func->HasFlag(kFunc_Protected)) { t->SetAccess("protected"); } else { t->SetAccess(wxT("public")); } t->SetSignature(func->GetSignature()); t->SetPattern(func->GetShortName() + func->GetSignature()); t->SetKind("function"); } else if(entry->Is(kEntityTypeClass)) { t->SetAccess(wxT("public")); t->SetKind("class"); } else if(entry->Is(kEntityTypeNamespace)) { t->SetAccess("public"); t->SetKind("namespace"); } else if(entry->Is(kEntityTypeKeyword)) { t->SetAccess("public"); t->SetKind("cpp_keyword"); } t->SetFlags(TagEntry::Tag_No_Signature_Format); return t; }
TagEntryPtr PHPCodeCompletion::DoPHPEntityToTagEntry(PHPEntityBase::Ptr_t entry) { TagEntryPtr t(new TagEntry()); // wxString name = entry->Is(kEntityTypeNamespace) ? entry->GetFullName() : entry->GetShortName(); wxString name = entry->GetShortName(); if(entry->Is(kEntityTypeVariable) && entry->Cast<PHPEntityVariable>()->IsMember() && name.StartsWith(wxT("$")) && !entry->Cast<PHPEntityVariable>()->IsStatic()) { name.Remove(0, 1); } else if((entry->Is(kEntityTypeClass) || entry->Is(kEntityTypeNamespace)) && name.StartsWith("\\")) { name.Remove(0, 1); } t->SetName(name); t->SetParent(entry->Parent() ? entry->Parent()->GetFullName() : ""); t->SetPattern(t->GetName()); t->SetComment(entry->GetDocComment()); // Access if(entry->Is(kEntityTypeVariable)) { PHPEntityVariable* var = entry->Cast<PHPEntityVariable>(); // visibility if(var->IsPrivate()) t->SetAccess(wxT("private")); else if(var->IsProtected()) t->SetAccess(wxT("protected")); else t->SetAccess(wxT("public")); // type (affects icon) if(var->IsConst() || var->IsDefine()) { t->SetKind("macro"); } else { t->SetKind("variable"); } t->SetReturnValue(""); } else if(entry->Is(kEntityTypeFunction)) { PHPEntityFunction* func = entry->Cast<PHPEntityFunction>(); if(func->HasFlag(kFunc_Private)) { t->SetAccess(wxT("private")); } else if(func->HasFlag(kFunc_Protected)) { t->SetAccess("protected"); } else { t->SetAccess(wxT("public")); } t->SetSignature(func->GetSignature()); t->SetPattern(func->GetShortName() + func->GetSignature()); t->SetKind("function"); } else if(entry->Is(kEntityTypeClass)) { t->SetAccess(wxT("public")); t->SetKind("class"); } else if(entry->Is(kEntityTypeNamespace)) { t->SetAccess("public"); t->SetKind("namespace"); } t->SetFlags(TagEntry::Tag_No_Signature_Format); return t; }
void PHPSourceFile::Parse(int exitDepth) { int retDepth = exitDepth; phpLexerToken token; while(NextToken(token)) { switch(token.type) { case '=': m_lookBackTokens.clear(); break; case '{': m_lookBackTokens.clear(); break; case '}': m_lookBackTokens.clear(); if(m_depth == retDepth) { return; } break; case ';': m_lookBackTokens.clear(); break; case kPHP_T_VARIABLE: if(!CurrentScope()->Is(kEntityTypeClass)) { // A global variable OnVariable(token); } break; case kPHP_T_CATCH: // found 'catch (...)' OnCatch(); break; case kPHP_T_PUBLIC: case kPHP_T_PRIVATE: case kPHP_T_PROTECTED: { int visibility = token.type; PHPEntityClass* cls = CurrentScope()->Cast<PHPEntityClass>(); if(cls) { /// keep the current token m_lookBackTokens.push_back(token); // Now we have a small problem here: // public can be a start for a member or a function // we let the lexer run forward until it finds kPHP_T_VARIABLE (for variable) // or kPHP_T_IDENTIFIER int what = ReadUntilFoundOneOf(kPHP_T_VARIABLE, kPHP_T_FUNCTION, token); if(what == kPHP_T_VARIABLE) { // A variable PHPEntityBase::Ptr_t member(new PHPEntityVariable()); member->SetFilename(m_filename.GetFullPath()); PHPEntityVariable* var = member->Cast<PHPEntityVariable>(); var->SetVisibility(visibility); var->SetFullName(token.text); size_t flags = LookBackForVariablesFlags(); var->SetFlag(kVar_Member); var->SetFlag(kVar_Const, flags & kVar_Const); var->SetFlag(kVar_Static, flags & kVar_Static); var->SetLine(token.lineNumber); CurrentScope()->AddChild(member); if(!ConsumeUntil(';')) return; } else if(what == kPHP_T_FUNCTION) { // A function... OnFunction(); m_lookBackTokens.clear(); } } break; } case kPHP_T_DEFINE: // Define statement OnDefine(token); break; case kPHP_T_CONST: if(ReadUntilFound(kPHP_T_IDENTIFIER, token)) { // constant PHPEntityBase::Ptr_t member(new PHPEntityVariable()); member->SetFilename(m_filename.GetFullPath()); PHPEntityVariable* var = member->Cast<PHPEntityVariable>(); var->SetFullName(token.text); var->SetLine(token.lineNumber); var->SetFlag(kVar_Member); var->SetFlag(kVar_Const); CurrentScope()->AddChild(member); if(!ConsumeUntil(';')) return; } break; case kPHP_T_REQUIRE: case kPHP_T_REQUIRE_ONCE: case kPHP_T_INCLUDE: case kPHP_T_INCLUDE_ONCE: // Handle include files m_lookBackTokens.clear(); break; case kPHP_T_USE: // Found outer 'use' statement - construct the alias table if(Class()) { // inside a class, this means that this is a 'use <trait>;' OnUseTrait(); } else { // alias table OnUse(); } m_lookBackTokens.clear(); break; case kPHP_T_CLASS: case kPHP_T_INTERFACE: case kPHP_T_TRAIT: // Found class OnClass(token); m_lookBackTokens.clear(); break; case kPHP_T_NAMESPACE: // Found a namespace OnNamespace(); m_lookBackTokens.clear(); break; case kPHP_T_FUNCTION: // Found function OnFunction(); m_lookBackTokens.clear(); break; default: // Keep the token break; } } PhaseTwo(); }