Add function list export feature
"notepad++.exe -export=functionList -lcpp c:\funcListTests\whatever.cpp" will open whatever.cpp as cpp file, then parse this file to write the funcLst result on disk, then exit Notepad++. The result will write into c:\funcListTests\whatever.cpp.result.pull/3279/merge
parent
3fbd537371
commit
1d58c1d3d3
|
@ -297,6 +297,9 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin
|
||||||
|
|
||||||
// Make this call later to take effect
|
// Make this call later to take effect
|
||||||
::SendMessage(_hSelf, NPPM_INTERNAL_SETWORDCHARS, 0, 0);
|
::SendMessage(_hSelf, NPPM_INTERNAL_SETWORDCHARS, 0, 0);
|
||||||
|
|
||||||
|
if (pNppParams->doFunctionListExport())
|
||||||
|
::SendMessage(_hSelf, NPPM_INTERNAL_EXPORTFUNCLISTANDQUIT, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -469,6 +469,18 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case NPPM_INTERNAL_EXPORTFUNCLISTANDQUIT:
|
||||||
|
{
|
||||||
|
checkMenuItem(IDM_VIEW_FUNC_LIST, true);
|
||||||
|
_toolBar.setCheck(IDM_VIEW_FUNC_LIST, true);
|
||||||
|
launchFunctionList();
|
||||||
|
_pFuncList->setClosed(false);
|
||||||
|
_pFuncList->serialize();
|
||||||
|
|
||||||
|
::PostMessage(_pPublicInterface->getHSelf(), WM_COMMAND, IDM_FILE_EXIT, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case NPPM_DISABLEAUTOUPDATE:
|
case NPPM_DISABLEAUTOUPDATE:
|
||||||
{
|
{
|
||||||
NppGUI & nppGUI = const_cast<NppGUI &>(pNppParam->getNppGUI());
|
NppGUI & nppGUI = const_cast<NppGUI &>(pNppParam->getNppGUI());
|
||||||
|
|
|
@ -247,7 +247,7 @@ BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wsprintf(str2display, TEXT("\"%s\" cannot be opened:\nFolder \"%s\" doesn't exist."), longFileName, longFileDir.c_str());
|
wsprintf(str2display, TEXT("\"%s\" cannot be opened:\nFolder \"%s\" doesn't exist."), longFileName, longFileDir.c_str());
|
||||||
::MessageBox(_pPublicInterface->getHSelf(), str2display, TEXT("Cannot opened"), MB_OK);
|
::MessageBox(_pPublicInterface->getHSelf(), str2display, TEXT("Cannot open file"), MB_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isCreateFileSuccessful)
|
if (!isCreateFileSuccessful)
|
||||||
|
|
|
@ -1470,10 +1470,16 @@ public:
|
||||||
|
|
||||||
void setWorkingDir(const TCHAR * newPath);
|
void setWorkingDir(const TCHAR * newPath);
|
||||||
|
|
||||||
void setStartWithLocFileName(generic_string locPath)
|
void setStartWithLocFileName(generic_string locPath) {
|
||||||
{
|
|
||||||
_startWithLocFileName = locPath;
|
_startWithLocFileName = locPath;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
void setFunctionListExportBoolean(bool doIt) {
|
||||||
|
_doFunctionListExport = doIt;
|
||||||
|
};
|
||||||
|
bool doFunctionListExport() const {
|
||||||
|
return _doFunctionListExport;
|
||||||
|
};
|
||||||
|
|
||||||
bool loadSession(Session & session, const TCHAR *sessionFileName);
|
bool loadSession(Session & session, const TCHAR *sessionFileName);
|
||||||
int langTypeToCommandID(LangType lt) const;
|
int langTypeToCommandID(LangType lt) const;
|
||||||
|
@ -1659,6 +1665,7 @@ private:
|
||||||
|
|
||||||
LocalizationSwitcher _localizationSwitcher;
|
LocalizationSwitcher _localizationSwitcher;
|
||||||
generic_string _startWithLocFileName;
|
generic_string _startWithLocFileName;
|
||||||
|
bool _doFunctionListExport = false;
|
||||||
|
|
||||||
ThemeSwitcher _themeSwitcher;
|
ThemeSwitcher _themeSwitcher;
|
||||||
|
|
||||||
|
@ -1722,17 +1729,11 @@ private:
|
||||||
void feedFindHistoryParameters(TiXmlNode *node);
|
void feedFindHistoryParameters(TiXmlNode *node);
|
||||||
void feedProjectPanelsParameters(TiXmlNode *node);
|
void feedProjectPanelsParameters(TiXmlNode *node);
|
||||||
void feedFileBrowserParameters(TiXmlNode *node);
|
void feedFileBrowserParameters(TiXmlNode *node);
|
||||||
|
|
||||||
bool feedStylerArray(TiXmlNode *node);
|
bool feedStylerArray(TiXmlNode *node);
|
||||||
void getAllWordStyles(TCHAR *lexerName, TiXmlNode *lexerNode);
|
|
||||||
|
|
||||||
bool feedUserLang(TiXmlNode *node);
|
bool feedUserLang(TiXmlNode *node);
|
||||||
|
|
||||||
int getIndexFromKeywordListName(const TCHAR *name);
|
|
||||||
void feedUserStyles(TiXmlNode *node);
|
void feedUserStyles(TiXmlNode *node);
|
||||||
void feedUserKeywordList(TiXmlNode *node);
|
void feedUserKeywordList(TiXmlNode *node);
|
||||||
void feedUserSettings(TiXmlNode *node);
|
void feedUserSettings(TiXmlNode *node);
|
||||||
|
|
||||||
void feedShortcut(TiXmlNode *node);
|
void feedShortcut(TiXmlNode *node);
|
||||||
void feedMacros(TiXmlNode *node);
|
void feedMacros(TiXmlNode *node);
|
||||||
void feedUserCmds(TiXmlNode *node);
|
void feedUserCmds(TiXmlNode *node);
|
||||||
|
|
|
@ -224,6 +224,56 @@ void FunctionListPanel::sortOrUnsort()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FunctionListPanel::serialize(const generic_string & outputFilename)
|
||||||
|
{
|
||||||
|
generic_string fname;
|
||||||
|
if (outputFilename.empty()) // if outputFilename is not given, get the current file path by adding the file extension
|
||||||
|
{
|
||||||
|
Buffer* currentBuf = (*_ppEditView)->getCurrentBuffer();
|
||||||
|
const TCHAR *fullFilePath = currentBuf->getFullPathName();
|
||||||
|
|
||||||
|
// Export function list from an existing file
|
||||||
|
bool exportFuncntionList = (NppParameters::getInstance())->doFunctionListExport();
|
||||||
|
if (exportFuncntionList && ::PathFileExists(fullFilePath))
|
||||||
|
{
|
||||||
|
fname = fullFilePath;
|
||||||
|
fname += TEXT(".result");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fname = outputFilename;
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE * f = generic_fopen(fname.c_str(), TEXT("w+"));
|
||||||
|
if (!f)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (const auto & info : _funcinfos)
|
||||||
|
{
|
||||||
|
generic_string entryName;
|
||||||
|
if (info._pos2 != -1)
|
||||||
|
{
|
||||||
|
entryName = info._data2;
|
||||||
|
entryName += TEXT("=>");
|
||||||
|
}
|
||||||
|
entryName += info._data;
|
||||||
|
entryName += TEXT("\n");
|
||||||
|
|
||||||
|
WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance();
|
||||||
|
UINT cp = static_cast<UINT>((*_ppEditView)->execute(SCI_GETCODEPAGE));
|
||||||
|
const char *textA = wmc->wchar2char(entryName.c_str(), cp);
|
||||||
|
string entryNameA = textA;
|
||||||
|
|
||||||
|
fwrite(entryNameA.c_str(), sizeof(entryNameA.c_str()[0]), entryNameA.length(), f);
|
||||||
|
}
|
||||||
|
fflush(f);
|
||||||
|
fclose(f);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void FunctionListPanel::reload()
|
void FunctionListPanel::reload()
|
||||||
{
|
{
|
||||||
// clean up
|
// clean up
|
||||||
|
@ -240,50 +290,55 @@ void FunctionListPanel::reload()
|
||||||
::SendMessage(_hSearchEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(TEXT("")));
|
::SendMessage(_hSearchEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(TEXT("")));
|
||||||
setSort(false);
|
setSort(false);
|
||||||
|
|
||||||
vector<foundInfo> fi;
|
_funcinfos.clear();
|
||||||
|
|
||||||
const TCHAR *fn = ((*_ppEditView)->getCurrentBuffer())->getFileName();
|
Buffer* currentBuf = (*_ppEditView)->getCurrentBuffer();
|
||||||
LangType langID = ((*_ppEditView)->getCurrentBuffer())->getLangType();
|
const TCHAR *fn = currentBuf->getFileName();
|
||||||
|
LangType langID = currentBuf->getLangType();
|
||||||
if (langID == L_JAVASCRIPT)
|
if (langID == L_JAVASCRIPT)
|
||||||
langID = L_JS;
|
langID = L_JS;
|
||||||
|
|
||||||
const TCHAR *udln = NULL;
|
const TCHAR *udln = NULL;
|
||||||
if (langID == L_USER)
|
if (langID == L_USER)
|
||||||
{
|
{
|
||||||
udln = ((*_ppEditView)->getCurrentBuffer())->getUserDefineLangName();
|
udln = currentBuf->getUserDefineLangName();
|
||||||
}
|
}
|
||||||
|
|
||||||
TCHAR *ext = ::PathFindExtension(fn);
|
TCHAR *ext = ::PathFindExtension(fn);
|
||||||
|
|
||||||
if (_funcParserMgr.parse(fi, AssociationInfo(-1, langID, ext, udln)))
|
bool parsedOK = _funcParserMgr.parse(_funcinfos, AssociationInfo(-1, langID, ext, udln));
|
||||||
|
if (parsedOK)
|
||||||
{
|
{
|
||||||
_treeView.addItem(fn, NULL, INDEX_ROOT, TEXT("-1"));
|
_treeView.addItem(fn, NULL, INDEX_ROOT, TEXT("-1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0, len = fi.size(); i < len; ++i)
|
for (size_t i = 0, len = _funcinfos.size(); i < len; ++i)
|
||||||
{
|
{
|
||||||
// no 2 level
|
// no 2 level
|
||||||
bool b = false;
|
bool b = false;
|
||||||
if (b)
|
if (b)
|
||||||
{
|
{
|
||||||
generic_string entryName = TEXT("");
|
generic_string entryName = TEXT("");
|
||||||
if (fi[i]._pos2 != -1)
|
if (_funcinfos[i]._pos2 != -1)
|
||||||
{
|
{
|
||||||
entryName = fi[i]._data2;
|
entryName = _funcinfos[i]._data2;
|
||||||
entryName += TEXT("=>");
|
entryName += TEXT("=>");
|
||||||
}
|
}
|
||||||
entryName += fi[i]._data;
|
entryName += _funcinfos[i]._data;
|
||||||
addEntry(NULL, entryName.c_str(), fi[i]._pos);
|
addEntry(NULL, entryName.c_str(), _funcinfos[i]._pos);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
addEntry(fi[i]._data2.c_str(), fi[i]._data.c_str(), fi[i]._pos);
|
addEntry(_funcinfos[i]._data2.c_str(), _funcinfos[i]._data.c_str(), _funcinfos[i]._pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HTREEITEM root = _treeView.getRoot();
|
HTREEITEM root = _treeView.getRoot();
|
||||||
const TCHAR *fullFilePath = ((*_ppEditView)->getCurrentBuffer())->getFullPathName();
|
|
||||||
if (root)
|
if (root)
|
||||||
{
|
{
|
||||||
|
Buffer* currentBuf = (*_ppEditView)->getCurrentBuffer();
|
||||||
|
const TCHAR *fullFilePath = currentBuf->getFullPathName();
|
||||||
_treeView.setItemParam(root, fullFilePath);
|
_treeView.setItemParam(root, fullFilePath);
|
||||||
TreeParams *previousParams = getFromStateArray(fullFilePath);
|
TreeParams *previousParams = getFromStateArray(fullFilePath);
|
||||||
if (!previousParams)
|
if (!previousParams)
|
||||||
|
|
|
@ -25,15 +25,9 @@
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#ifndef FUNCLISTPANEL_H
|
|
||||||
#define FUNCLISTPANEL_H
|
|
||||||
|
|
||||||
//#include <windows.h>
|
|
||||||
#ifndef DOCKINGDLGINTERFACE_H
|
|
||||||
#include "DockingDlgInterface.h"
|
#include "DockingDlgInterface.h"
|
||||||
#endif //DOCKINGDLGINTERFACE_H
|
|
||||||
|
|
||||||
#include "functionListPanel_rc.h"
|
#include "functionListPanel_rc.h"
|
||||||
#include "functionParser.h"
|
#include "functionParser.h"
|
||||||
#include "TreeView.h"
|
#include "TreeView.h"
|
||||||
|
@ -118,6 +112,7 @@ public:
|
||||||
// functionalities
|
// functionalities
|
||||||
void sortOrUnsort();
|
void sortOrUnsort();
|
||||||
void reload();
|
void reload();
|
||||||
|
bool serialize(const generic_string & outputFilename = TEXT(""));
|
||||||
void addEntry(const TCHAR *node, const TCHAR *displayText, size_t pos);
|
void addEntry(const TCHAR *node, const TCHAR *displayText, size_t pos);
|
||||||
void removeAllEntries();
|
void removeAllEntries();
|
||||||
void removeEntry();
|
void removeEntry();
|
||||||
|
@ -138,6 +133,8 @@ private:
|
||||||
generic_string _sortTipStr;
|
generic_string _sortTipStr;
|
||||||
generic_string _reloadTipStr;
|
generic_string _reloadTipStr;
|
||||||
|
|
||||||
|
std::vector<foundInfo> _funcinfos;
|
||||||
|
|
||||||
ScintillaEditView **_ppEditView;
|
ScintillaEditView **_ppEditView;
|
||||||
FunctionParsersManager _funcParserMgr;
|
FunctionParsersManager _funcParserMgr;
|
||||||
std::vector<FuncInfo> _funcInfos;
|
std::vector<FuncInfo> _funcInfos;
|
||||||
|
@ -154,4 +151,4 @@ private:
|
||||||
bool shouldSort();
|
bool shouldSort();
|
||||||
void setSort(bool isEnabled);
|
void setSort(bool isEnabled);
|
||||||
};
|
};
|
||||||
#endif // FUNCLISTPANEL_H
|
|
||||||
|
|
|
@ -323,6 +323,7 @@
|
||||||
|
|
||||||
#define IDM_VIEW_FILESWITCHER_PANEL (IDM_VIEW + 70)
|
#define IDM_VIEW_FILESWITCHER_PANEL (IDM_VIEW + 70)
|
||||||
#define IDM_VIEW_SWITCHTO_OTHER_VIEW (IDM_VIEW + 72)
|
#define IDM_VIEW_SWITCHTO_OTHER_VIEW (IDM_VIEW + 72)
|
||||||
|
#define IDM_EXPORT_FUNC_LIST_AND_QUIT (IDM_VIEW + 73)
|
||||||
|
|
||||||
#define IDM_VIEW_DOC_MAP (IDM_VIEW + 80)
|
#define IDM_VIEW_DOC_MAP (IDM_VIEW + 80)
|
||||||
|
|
||||||
|
|
|
@ -417,6 +417,7 @@
|
||||||
#define NPPM_INTERNAL_FINDKEYCONFLICTS (NOTEPADPLUS_USER_INTERNAL + 43)
|
#define NPPM_INTERNAL_FINDKEYCONFLICTS (NOTEPADPLUS_USER_INTERNAL + 43)
|
||||||
#define NPPM_INTERNAL_SCROLLBEYONDLASTLINE (NOTEPADPLUS_USER_INTERNAL + 44)
|
#define NPPM_INTERNAL_SCROLLBEYONDLASTLINE (NOTEPADPLUS_USER_INTERNAL + 44)
|
||||||
#define NPPM_INTERNAL_SETWORDCHARS (NOTEPADPLUS_USER_INTERNAL + 45)
|
#define NPPM_INTERNAL_SETWORDCHARS (NOTEPADPLUS_USER_INTERNAL + 45)
|
||||||
|
#define NPPM_INTERNAL_EXPORTFUNCLISTANDQUIT (NOTEPADPLUS_USER_INTERNAL + 46)
|
||||||
|
|
||||||
//wParam: 0
|
//wParam: 0
|
||||||
//lParam: document new index
|
//lParam: document new index
|
||||||
|
|
|
@ -306,6 +306,8 @@ const TCHAR FLAG_HELP[] = TEXT("--help");
|
||||||
const TCHAR FLAG_ALWAYS_ON_TOP[] = TEXT("-alwaysOnTop");
|
const TCHAR FLAG_ALWAYS_ON_TOP[] = TEXT("-alwaysOnTop");
|
||||||
const TCHAR FLAG_OPENSESSIONFILE[] = TEXT("-openSession");
|
const TCHAR FLAG_OPENSESSIONFILE[] = TEXT("-openSession");
|
||||||
const TCHAR FLAG_RECURSIVE[] = TEXT("-r");
|
const TCHAR FLAG_RECURSIVE[] = TEXT("-r");
|
||||||
|
const TCHAR FLAG_FUNCLSTEXPORT[] = TEXT("-export=functionList");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void doException(Notepad_plus_Window & notepad_plus_plus)
|
void doException(Notepad_plus_Window & notepad_plus_plus)
|
||||||
|
@ -352,6 +354,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
|
||||||
bool isParamePresent;
|
bool isParamePresent;
|
||||||
bool showHelp = isInList(FLAG_HELP, params);
|
bool showHelp = isInList(FLAG_HELP, params);
|
||||||
bool isMultiInst = isInList(FLAG_MULTI_INSTANCE, params);
|
bool isMultiInst = isInList(FLAG_MULTI_INSTANCE, params);
|
||||||
|
bool doFunctionListExport = isInList(FLAG_FUNCLSTEXPORT, params);
|
||||||
|
|
||||||
CmdLineParams cmdLineParams;
|
CmdLineParams cmdLineParams;
|
||||||
cmdLineParams._isNoTab = isInList(FLAG_NOTABBAR, params);
|
cmdLineParams._isNoTab = isInList(FLAG_NOTABBAR, params);
|
||||||
|
@ -377,6 +380,15 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
|
||||||
::MessageBox(NULL, COMMAND_ARG_HELP, TEXT("Notepad++ Command Argument Help"), MB_OK);
|
::MessageBox(NULL, COMMAND_ARG_HELP, TEXT("Notepad++ Command Argument Help"), MB_OK);
|
||||||
|
|
||||||
NppParameters *pNppParameters = NppParameters::getInstance();
|
NppParameters *pNppParameters = NppParameters::getInstance();
|
||||||
|
NppGUI & nppGui = const_cast<NppGUI &>(pNppParameters->getNppGUI());
|
||||||
|
bool doUpdate = nppGui._autoUpdateOpt._doAutoUpdate;
|
||||||
|
|
||||||
|
if (doFunctionListExport) // export functionlist feature will serialize fuctionlist on the disk, then exit Notepad++. So it's important to not launch into existing instance, and keep it silent.
|
||||||
|
{
|
||||||
|
isMultiInst = true;
|
||||||
|
doUpdate = false;
|
||||||
|
cmdLineParams._isNoSession = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (cmdLineParams._localizationPath != TEXT(""))
|
if (cmdLineParams._localizationPath != TEXT(""))
|
||||||
{
|
{
|
||||||
|
@ -384,6 +396,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
|
||||||
}
|
}
|
||||||
pNppParameters->load();
|
pNppParameters->load();
|
||||||
|
|
||||||
|
pNppParameters->setFunctionListExportBoolean(doFunctionListExport);
|
||||||
|
|
||||||
// override the settings if notepad style is present
|
// override the settings if notepad style is present
|
||||||
if (pNppParameters->asNotepadStyle())
|
if (pNppParameters->asNotepadStyle())
|
||||||
{
|
{
|
||||||
|
@ -470,8 +484,6 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
|
||||||
|
|
||||||
Notepad_plus_Window notepad_plus_plus;
|
Notepad_plus_Window notepad_plus_plus;
|
||||||
|
|
||||||
NppGUI & nppGui = const_cast<NppGUI &>(pNppParameters->getNppGUI());
|
|
||||||
|
|
||||||
generic_string updaterDir = pNppParameters->getNppPath();
|
generic_string updaterDir = pNppParameters->getNppPath();
|
||||||
updaterDir += TEXT("\\updater\\");
|
updaterDir += TEXT("\\updater\\");
|
||||||
|
|
||||||
|
@ -482,8 +494,6 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
|
||||||
|
|
||||||
bool isUpExist = nppGui._doesExistUpdater = (::PathFileExists(updaterFullPath.c_str()) == TRUE);
|
bool isUpExist = nppGui._doesExistUpdater = (::PathFileExists(updaterFullPath.c_str()) == TRUE);
|
||||||
|
|
||||||
bool doUpdate = nppGui._autoUpdateOpt._doAutoUpdate;
|
|
||||||
|
|
||||||
if (doUpdate) // check more detail
|
if (doUpdate) // check more detail
|
||||||
{
|
{
|
||||||
Date today(0);
|
Date today(0);
|
||||||
|
|
Loading…
Reference in New Issue