branch: externals/matlab-mode
commit f5fbb92ef800f0fcdcbe4602a0f3d96ffd37ba4b
Author: John Ciolfi <john.ciolfi...@gmail.com>
Commit: John Ciolfi <john.ciolfi...@gmail.com>

    genBuiltinsHashTable.m: updated to get all namespaces items, skip internal 
items
---
 contributing/genBuiltinsHashTable.m | 102 +++++++++++++++++++++++++-----------
 1 file changed, 70 insertions(+), 32 deletions(-)

diff --git a/contributing/genBuiltinsHashTable.m 
b/contributing/genBuiltinsHashTable.m
index 846873d86e..0317a584d3 100644
--- a/contributing/genBuiltinsHashTable.m
+++ b/contributing/genBuiltinsHashTable.m
@@ -15,25 +15,40 @@
 % You should have received a copy of the GNU General Public License
 % along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-function genBuiltinsHashTable(outFile)
-% Generate in outFile a lisp hash-table of all functions to have 
font-lock-builtin-face
+function genBuiltinsHashTable
+% Generate a lisp hash-table file containing of all functions to have 
font-lock-builtin-face
 %
-% Leverage emacsdocomplete to locate all functions in a MATLAB installation. 
The install
-% should be the latest release with all products.
+% Leverage emacsdocomplete to locate all functions in a MATLAB installation. 
The install should be
+% the latest release with all products.
 %
-% Running
-%   genBuiltinsHashTable('fcns.el')
-% will create fcns.el that should be placed in ../matlab-ts-mode--buildins.el.
+% 1. Create /tmp/builtins-ht.el
 %
-% When running this, the MATLAB path should not include user directories.  You 
can use
-% restoredefaultpath to fix up things and then add the 
Emacs-MATLAB-Mode/toolbox direcotry to the
-% path.
+%      matlab -nodesktop
+%      >> run /path/to/Emacs-MATLAB-Mode/contributing/genBuiltinsHashTable.m
+%      <snip>
+%      Created: /tmp/builtins-ht.el
+%      >> quit
 %
-% The MATLAB-only functions are documented here:
-% https://www.mathworks.com/help/matlab/referencelist.html
+%    This will restore the MATLAB path to the default path and then add the 
path to
+%    emacsdocomplete. This is so we don't capture non-builtin items. Thus, 
after running, you should
+%    quit MATLAB.
 %
-% Note, we can't use the system find on *.m, *.p, *.mex* because some 
functions such as sin do not
-% have a file on disk.
+% 2. Place the contents of /tmp/builtins-ht.el in 
../matlab-ts-mode--builtins.el
+%
+% 3. rm /tmp/builtins-he.el
+%
+% Other implementation options:
+% - The MATLAB-only functions are documented here in
+%   https://www.mathworks.com/help/matlab/referencelist.html, but this is very 
incomplete so we
+%   can't use it.
+% - We can't use the system find on *.m, *.p, *.mex* because some functions 
such as sin do not have
+%   a file on disk.
+
+    restoredefaultpath
+    emacsToolbox = [fileparts(fileparts(mfilename('fullpath'))), filesep, 
'toolbox'];
+    addpath(emacsToolbox);
+
+    outFile = [tempdir, 'builtins-ht.el'];
 
     ht = ''; % lisp hash-table string representation
     nEntries = 0;
@@ -57,6 +72,7 @@ function genBuiltinsHashTable(outFile)
           '\".<property|enumeration>\"")', newline];
 
     writelines(ht, outFile, LineEnding = '\n');
+    fprintf(1, "Created: %s\n", outFile);
 end
 
 function [ht, nEntries] = getHashTableEntries(fcnStart, ht, nEntries)
@@ -76,7 +92,10 @@ function [ht, nEntries] = getHashTableEntries(fcnStart, ht, 
nEntries)
             continue
         end
 
-        % A function, class, or namespace.
+        % c is of format:
+        %    ("<THING>" . "<OPTIONAL_DESCRIPTION>(<ENTRY_TYPE>)")
+        % where THING is a function, class, namespace, etc.
+
         % We have items that are demo launchers, e.g.
         %   toolbox\simulink\simulink\keymodels\vdp.m
         %   toolbox\vdynblks\vdynsolution\vdynblksBrakingStart.m
@@ -84,12 +103,12 @@ function [ht, nEntries] = getHashTableEntries(fcnStart, 
ht, nEntries)
         % path location. However, these are commands that come with MATLAB, so 
we'll treat
         % them as such.
         m = regexp(c, ...
-                   ['^[ \t]*\("',...
-                    '([^"]+)', ...                                  % capture 
fcn (no quotes)
+                   ['^[ \t]*\("', ...
+                    '([^"]+)', ...                                 % capture 
THING (no quotes)
                     '"[ \t]+\.[ \t]+"', ...
-                     '(.*)', ...                                    % capture 
optional description
-                     '\(', ...
-                    '(', ['mFile|pFile|mex|function|method|', ...   % capture 
entryType
+                    '(.*)', ...                                    % capture 
OPTIONAL_DESCRIPTION
+                    '\(', ...
+                    '(', ['mFile|pFile|mex|function|method|', ...  % capture 
ENTRY_TYPE
                           'property|enumeration|', ...
                           'class|namespace|', ...
                           'keyword|variable|pathItem|mlappFile|mlxFile|', ...
@@ -97,33 +116,50 @@ function [ht, nEntries] = getHashTableEntries(fcnStart, 
ht, nEntries)
                     '\)"\)$'], ...
                    'tokens');
 
-        % Enhancement: it would be nice to hide items that aren't documented, 
etc. but it's not
-        % clear how to do that.
-
         if ~isempty(m)
-            fcn = m{1}{1};
-            if isequal(fcn, mfilename)
+            thing = m{1}{1};
+            if isequal(thing, mfilename)
                 continue; % skip ourself
             end
-            desc = strtrim(m{1}{2});
+
             entryType = m{1}{3};
+
             switch entryType
               case {'mFile', 'pFile', 'mex', 'function', 'method'}
+                desc = strtrim(m{1}{2});
                 if ~isempty(desc)
-                    desc = [' ;;', desc];
+                    desc = [' ;;', desc]; %#ok<AGROW>
                 end
-                ht = [ht, '           "', fcn, '" t', desc, newline];
+                ht = [ht, '           "', thing, '" t', desc, newline]; 
%#ok<AGROW>
                 nEntries = nEntries + 1;
+                if strcmp(entryType, 'mFile')
+                    % Consider mFile = matlab (toolbox/matlab/general/matlab.m)
+                    % We also have matlab.<namespace>, so also look for that.
+                    entryType = 'namespace';
+                end
+            end
+
+            switch entryType
+              case {'pFile', 'mex', 'function', 'method'}
+                % handled above
+              case {'namespace'}
+                % Ignore items under foo.bar.internal namespaces. These can 
appear/disappear and
+                % should only be used by code provided by MathWorks.
+                if isempty(regexp(thing, '\.internal$', 'once'))
+                    for fcnStart = 'a' : 'z'
+                        [ht, nEntries] = getHashTableEntries([thing, '.', 
fcnStart], ht, nEntries);
+                    end
+                end
               case {'property', 'enumeration'}
-                ht = [ht, '           "', fcn, '" ''', entryType, newline];
+                ht = [ht, '           "', thing, '" ''', entryType, newline]; 
%#ok<AGROW>
                 nEntries = nEntries + 1;
-              case {'class', 'namespace', ...
+              case {'class', ...
                     'keyword', 'variable', 'pathItem', 'mlappFile', 'mlxFile', 
...
                     'mdlFile', 'slxFile', 'sscFile', 'sfxFile'}
                 % 'class' and 'namespace' likely have items in them. Though 
variables, models,
                 % etc. can hide namespaces. For example, simulink.slx is a 
model and we have
-                % simulink namspace giving items like simulink.compiler.genapp.
-                [ht, nEntries] = getHashTableEntries([fcn, '.'], ht, nEntries);
+                % simulink namespace giving items like 
simulink.compiler.genapp.
+                [ht, nEntries] = getHashTableEntries([thing, '.'], ht, 
nEntries);
               otherwise
                 error(['assert - unhandled entryType: ', entryType]);
             end
@@ -134,3 +170,5 @@ function [ht, nEntries] = getHashTableEntries(fcnStart, ht, 
nEntries)
 
     disp(['nEntries = ', num2str(nEntries)]);
 end
+
+% LocalWords:  emacsdocomplete builtins keymodels vdynblks vdynsolution mlapp 
mlx ssc sfx genapp

Reply via email to