Finished adding support for Google protobuf protocol and gRPC files.

Sat, 18 Nov 2017 18:27:25 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 18 Nov 2017 18:27:25 +0100
changeset 5977
8a0ec75b0f73
parent 5976
549918576245
child 5978
cf64d523f233

Finished adding support for Google protobuf protocol and gRPC files.

APIs/Python3/eric6.api file | annotate | diff | comparison | revisions
APIs/Python3/eric6.bas file | annotate | diff | comparison | revisions
Documentation/Help/source.qch file | annotate | diff | comparison | revisions
Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Utilities.ClassBrowsers.ClbrBaseClasses.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Utilities.ClassBrowsers.__init__.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Utilities.ClassBrowsers.idlclbr.html file | annotate | diff | comparison | revisions
Documentation/Source/eric6.Utilities.ClassBrowsers.protoclbr.html file | annotate | diff | comparison | revisions
Documentation/Source/index-eric6.Utilities.ClassBrowsers.html file | annotate | diff | comparison | revisions
UI/BrowserModel.py file | annotate | diff | comparison | revisions
Utilities/ClassBrowsers/ClbrBaseClasses.py file | annotate | diff | comparison | revisions
Utilities/ClassBrowsers/__init__.py file | annotate | diff | comparison | revisions
Utilities/ClassBrowsers/idlclbr.py file | annotate | diff | comparison | revisions
Utilities/ClassBrowsers/protoclbr.py file | annotate | diff | comparison | revisions
changelog file | annotate | diff | comparison | revisions
eric6.e4p file | annotate | diff | comparison | revisions
--- a/APIs/Python3/eric6.api	Sat Nov 18 12:35:13 2017 +0100
+++ b/APIs/Python3/eric6.api	Sat Nov 18 18:27:25 2017 +0100
@@ -9032,6 +9032,7 @@
 eric6.Utilities.ClassBrowsers.ClbrBaseClasses.ClbrVisibilityMixinBase.setProtected?4()
 eric6.Utilities.ClassBrowsers.ClbrBaseClasses.ClbrVisibilityMixinBase.setPublic?4()
 eric6.Utilities.ClassBrowsers.ClbrBaseClasses.Coding?1(module, file, lineno, coding)
+eric6.Utilities.ClassBrowsers.ClbrBaseClasses.Enum?1(module, name, file, lineno)
 eric6.Utilities.ClassBrowsers.ClbrBaseClasses.Function.Class?7
 eric6.Utilities.ClassBrowsers.ClbrBaseClasses.Function.General?7
 eric6.Utilities.ClassBrowsers.ClbrBaseClasses.Function.Static?7
@@ -9041,6 +9042,7 @@
 eric6.Utilities.ClassBrowsers.ClbrBaseClasses._ClbrBase?2(module, name, file, lineno)
 eric6.Utilities.ClassBrowsers.IDL_SOURCE?7
 eric6.Utilities.ClassBrowsers.JS_SOURCE?7
+eric6.Utilities.ClassBrowsers.PROTO_SOURCE?7
 eric6.Utilities.ClassBrowsers.PTL_SOURCE?7
 eric6.Utilities.ClassBrowsers.PY_SOURCE?7
 eric6.Utilities.ClassBrowsers.RB_SOURCE?7
@@ -9071,6 +9073,17 @@
 eric6.Utilities.ClassBrowsers.jsclbr.Visitor?1(src, module, filename)
 eric6.Utilities.ClassBrowsers.jsclbr._modules?8
 eric6.Utilities.ClassBrowsers.jsclbr.readmodule_ex?4(module, path=None)
+eric6.Utilities.ClassBrowsers.protoclbr.Enum?1(module, name, file, lineno)
+eric6.Utilities.ClassBrowsers.protoclbr.Message?1(module, name, file, lineno)
+eric6.Utilities.ClassBrowsers.protoclbr.SUPPORTED_TYPES?7
+eric6.Utilities.ClassBrowsers.protoclbr.Service?1(module, name, file, lineno)
+eric6.Utilities.ClassBrowsers.protoclbr.ServiceMethod?1(name, file, lineno, signature, returns)
+eric6.Utilities.ClassBrowsers.protoclbr.VisibilityMixin?1()
+eric6.Utilities.ClassBrowsers.protoclbr._commentsub?8
+eric6.Utilities.ClassBrowsers.protoclbr._getnext?8
+eric6.Utilities.ClassBrowsers.protoclbr._modules?8
+eric6.Utilities.ClassBrowsers.protoclbr._normalize?8
+eric6.Utilities.ClassBrowsers.protoclbr.readmodule_ex?4(module, path=None)
 eric6.Utilities.ClassBrowsers.pyclbr.Attribute?1(module, name, file, lineno)
 eric6.Utilities.ClassBrowsers.pyclbr.Class?1(module, name, superClasses, file, lineno)
 eric6.Utilities.ClassBrowsers.pyclbr.Function?1(module, name, file, lineno, signature='', separator=', ', modifierType=ClbrBaseClasses.Function.General, annotation="")
--- a/APIs/Python3/eric6.bas	Sat Nov 18 12:35:13 2017 +0100
+++ b/APIs/Python3/eric6.bas	Sat Nov 18 18:27:25 2017 +0100
@@ -244,6 +244,7 @@
 EmailDialog QDialog Ui_EmailDialog
 EmailPage ConfigurationPageBase Ui_EmailPage
 EmptyNetworkReply QNetworkReply
+Enum ClbrBaseClasses.Enum VisibilityMixin
 EricAccessHandler SchemeAccessHandler
 EricSchemeHandler QWebEngineUrlSchemeHandler
 EricSchemeReply QIODevice
@@ -519,6 +520,7 @@
 MarkdownProvider MarkupBase
 MasterPasswordEntryDialog QDialog Ui_MasterPasswordEntryDialog
 MercurialPage ConfigurationPageBase Ui_MercurialPage
+Message ClbrBaseClasses.Module VisibilityMixin
 MessageBoxWizard QObject
 MessageBoxWizardDialog QDialog Ui_MessageBoxWizardDialog
 MimeTypesPage ConfigurationPageBase Ui_MimeTypesPage
@@ -700,6 +702,8 @@
 SearchWidget QWidget Ui_SearchWidget
 SecurityPage ConfigurationPageBase Ui_SecurityPage
 SendRefererWhitelistDialog QDialog Ui_SendRefererWhitelistDialog
+Service ClbrBaseClasses.Class VisibilityMixin
+ServiceMethod ClbrBaseClasses.Function VisibilityMixin
 SessionManager QObject
 SessionManagerDialog QDialog Ui_SessionManagerDialog
 SessionReader XMLStreamReaderBase
Binary file Documentation/Help/source.qch has changed
--- a/Documentation/Help/source.qhp	Sat Nov 18 12:35:13 2017 +0100
+++ b/Documentation/Help/source.qhp	Sat Nov 18 18:27:25 2017 +0100
@@ -1046,6 +1046,7 @@
               <section title="eric6.Utilities.ClassBrowsers.__init__" ref="eric6.Utilities.ClassBrowsers.__init__.html" />
               <section title="eric6.Utilities.ClassBrowsers.idlclbr" ref="eric6.Utilities.ClassBrowsers.idlclbr.html" />
               <section title="eric6.Utilities.ClassBrowsers.jsclbr" ref="eric6.Utilities.ClassBrowsers.jsclbr.html" />
+              <section title="eric6.Utilities.ClassBrowsers.protoclbr" ref="eric6.Utilities.ClassBrowsers.protoclbr.html" />
               <section title="eric6.Utilities.ClassBrowsers.pyclbr" ref="eric6.Utilities.ClassBrowsers.pyclbr.html" />
               <section title="eric6.Utilities.ClassBrowsers.rbclbr" ref="eric6.Utilities.ClassBrowsers.rbclbr.html" />
             </section>
@@ -5498,6 +5499,10 @@
       <keyword name="EmptyNetworkReply (Module)" id="EmptyNetworkReply (Module)" ref="eric6.Helpviewer.Network.EmptyNetworkReply.html" />
       <keyword name="EmptyNetworkReply.abort" id="EmptyNetworkReply.abort" ref="eric6.Helpviewer.Network.EmptyNetworkReply.html#EmptyNetworkReply.abort" />
       <keyword name="EmptyNetworkReply.readData" id="EmptyNetworkReply.readData" ref="eric6.Helpviewer.Network.EmptyNetworkReply.html#EmptyNetworkReply.readData" />
+      <keyword name="Enum" id="Enum" ref="eric6.Utilities.ClassBrowsers.ClbrBaseClasses.html#Enum" />
+      <keyword name="Enum" id="Enum" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Enum" />
+      <keyword name="Enum (Constructor)" id="Enum (Constructor)" ref="eric6.Utilities.ClassBrowsers.ClbrBaseClasses.html#Enum.__init__" />
+      <keyword name="Enum (Constructor)" id="Enum (Constructor)" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Enum.__init__" />
       <keyword name="EricAccessHandler" id="EricAccessHandler" ref="eric6.Helpviewer.Network.EricAccessHandler.html#EricAccessHandler" />
       <keyword name="EricAccessHandler (Module)" id="EricAccessHandler (Module)" ref="eric6.Helpviewer.Network.EricAccessHandler.html" />
       <keyword name="EricAccessHandler.__createHomePage" id="EricAccessHandler.__createHomePage" ref="eric6.Helpviewer.Network.EricAccessHandler.html#EricAccessHandler.__createHomePage" />
@@ -9776,6 +9781,8 @@
       <keyword name="MercurialPage (Module)" id="MercurialPage (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html" />
       <keyword name="MercurialPage.on_configButton_clicked" id="MercurialPage.on_configButton_clicked" ref="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html#MercurialPage.on_configButton_clicked" />
       <keyword name="MercurialPage.save" id="MercurialPage.save" ref="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html#MercurialPage.save" />
+      <keyword name="Message" id="Message" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Message" />
+      <keyword name="Message (Constructor)" id="Message (Constructor)" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Message.__init__" />
       <keyword name="MessageBoxWizard" id="MessageBoxWizard" ref="eric6.Plugins.PluginWizardQMessageBox.html#MessageBoxWizard" />
       <keyword name="MessageBoxWizard (Constructor)" id="MessageBoxWizard (Constructor)" ref="eric6.Plugins.PluginWizardQMessageBox.html#MessageBoxWizard.__init__" />
       <keyword name="MessageBoxWizard (Package)" id="MessageBoxWizard (Package)" ref="index-eric6.Plugins.WizardPlugins.MessageBoxWizard.html" />
@@ -12618,6 +12625,10 @@
       <keyword name="SendRefererWhitelistDialog.accept" id="SendRefererWhitelistDialog.accept" ref="eric6.WebBrowser.Network.SendRefererWhitelistDialog.html#SendRefererWhitelistDialog.accept" />
       <keyword name="SendRefererWhitelistDialog.on_addButton_clicked" id="SendRefererWhitelistDialog.on_addButton_clicked" ref="eric6.Helpviewer.Network.SendRefererWhitelistDialog.html#SendRefererWhitelistDialog.on_addButton_clicked" />
       <keyword name="SendRefererWhitelistDialog.on_addButton_clicked" id="SendRefererWhitelistDialog.on_addButton_clicked" ref="eric6.WebBrowser.Network.SendRefererWhitelistDialog.html#SendRefererWhitelistDialog.on_addButton_clicked" />
+      <keyword name="Service" id="Service" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Service" />
+      <keyword name="Service (Constructor)" id="Service (Constructor)" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Service.__init__" />
+      <keyword name="ServiceMethod" id="ServiceMethod" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#ServiceMethod" />
+      <keyword name="ServiceMethod (Constructor)" id="ServiceMethod (Constructor)" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#ServiceMethod.__init__" />
       <keyword name="Session (Package)" id="Session (Package)" ref="index-eric6.WebBrowser.Session.html" />
       <keyword name="SessionManager" id="SessionManager" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager" />
       <keyword name="SessionManager (Constructor)" id="SessionManager (Constructor)" ref="eric6.WebBrowser.Session.SessionManager.html#SessionManager.__init__" />
@@ -15945,10 +15956,12 @@
       <keyword name="VisibilityBase.setPublic" id="VisibilityBase.setPublic" ref="eric6.Utilities.ModuleParser.html#VisibilityBase.setPublic" />
       <keyword name="VisibilityMixin" id="VisibilityMixin" ref="eric6.Utilities.ClassBrowsers.idlclbr.html#VisibilityMixin" />
       <keyword name="VisibilityMixin" id="VisibilityMixin" ref="eric6.Utilities.ClassBrowsers.jsclbr.html#VisibilityMixin" />
+      <keyword name="VisibilityMixin" id="VisibilityMixin" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#VisibilityMixin" />
       <keyword name="VisibilityMixin" id="VisibilityMixin" ref="eric6.Utilities.ClassBrowsers.pyclbr.html#VisibilityMixin" />
       <keyword name="VisibilityMixin" id="VisibilityMixin" ref="eric6.Utilities.ClassBrowsers.rbclbr.html#VisibilityMixin" />
       <keyword name="VisibilityMixin (Constructor)" id="VisibilityMixin (Constructor)" ref="eric6.Utilities.ClassBrowsers.idlclbr.html#VisibilityMixin.__init__" />
       <keyword name="VisibilityMixin (Constructor)" id="VisibilityMixin (Constructor)" ref="eric6.Utilities.ClassBrowsers.jsclbr.html#VisibilityMixin.__init__" />
+      <keyword name="VisibilityMixin (Constructor)" id="VisibilityMixin (Constructor)" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#VisibilityMixin.__init__" />
       <keyword name="VisibilityMixin (Constructor)" id="VisibilityMixin (Constructor)" ref="eric6.Utilities.ClassBrowsers.pyclbr.html#VisibilityMixin.__init__" />
       <keyword name="VisibilityMixin (Constructor)" id="VisibilityMixin (Constructor)" ref="eric6.Utilities.ClassBrowsers.rbclbr.html#VisibilityMixin.__init__" />
       <keyword name="Visitor" id="Visitor" ref="eric6.Utilities.ClassBrowsers.jsclbr.html#Visitor" />
@@ -17364,6 +17377,7 @@
       <keyword name="printerr" id="printerr" ref="eric6.DebugClients.Python.DebugBase.html#printerr" />
       <keyword name="process_options" id="process_options" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.pycodestyle.html#process_options" />
       <keyword name="process_tokens" id="process_tokens" ref="eric6.Plugins.CheckerPlugins.Tabnanny.Tabnanny.html#process_tokens" />
+      <keyword name="protoclbr (Module)" id="protoclbr (Module)" ref="eric6.Utilities.ClassBrowsers.protoclbr.html" />
       <keyword name="proxyAuthenticationRequired" id="proxyAuthenticationRequired" ref="eric6.E5Network.E5NetworkProxyFactory.html#proxyAuthenticationRequired" />
       <keyword name="purge (Module)" id="purge (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.purge.html" />
       <keyword name="pushView" id="pushView" ref="eric6.WebBrowser.WebInspector.html#pushView" />
@@ -17405,6 +17419,7 @@
       <keyword name="readmodule" id="readmodule" ref="eric6.Utilities.ClassBrowsers.__init__.html#readmodule" />
       <keyword name="readmodule_ex" id="readmodule_ex" ref="eric6.Utilities.ClassBrowsers.idlclbr.html#readmodule_ex" />
       <keyword name="readmodule_ex" id="readmodule_ex" ref="eric6.Utilities.ClassBrowsers.jsclbr.html#readmodule_ex" />
+      <keyword name="readmodule_ex" id="readmodule_ex" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#readmodule_ex" />
       <keyword name="readmodule_ex" id="readmodule_ex" ref="eric6.Utilities.ClassBrowsers.pyclbr.html#readmodule_ex" />
       <keyword name="readmodule_ex" id="readmodule_ex" ref="eric6.Utilities.ClassBrowsers.rbclbr.html#readmodule_ex" />
       <keyword name="rebase (Module)" id="rebase (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.RebaseExtension.rebase.html" />
@@ -18409,6 +18424,7 @@
       <file>eric6.Utilities.ClassBrowsers.__init__.html</file>
       <file>eric6.Utilities.ClassBrowsers.idlclbr.html</file>
       <file>eric6.Utilities.ClassBrowsers.jsclbr.html</file>
+      <file>eric6.Utilities.ClassBrowsers.protoclbr.html</file>
       <file>eric6.Utilities.ClassBrowsers.pyclbr.html</file>
       <file>eric6.Utilities.ClassBrowsers.rbclbr.html</file>
       <file>eric6.Utilities.FtpUtilities.html</file>
--- a/Documentation/Source/eric6.Utilities.ClassBrowsers.ClbrBaseClasses.html	Sat Nov 18 12:35:13 2017 +0100
+++ b/Documentation/Source/eric6.Utilities.ClassBrowsers.ClbrBaseClasses.html	Sat Nov 18 18:27:25 2017 +0100
@@ -45,6 +45,9 @@
 <td><a href="#Coding">Coding</a></td>
 <td>Class to represent a source coding.</td>
 </tr><tr>
+<td><a href="#Enum">Enum</a></td>
+<td>Class to represent an enum definition.</td>
+</tr><tr>
 <td><a href="#Function">Function</a></td>
 <td>Class to represent a function or method.</td>
 </tr><tr>
@@ -95,18 +98,18 @@
 <p>
         Constructor
 </p><dl>
-<dt><i>module</i></dt>
+<dt><i>module</i> (str)</dt>
 <dd>
-name of the module containing this class
-</dd><dt><i>name</i></dt>
+name of the module containing this attribute
+</dd><dt><i>name</i> (str)</dt>
 <dd>
-name of this class
-</dd><dt><i>file</i></dt>
+name of this attribute
+</dd><dt><i>file</i> (str)</dt>
 <dd>
 filename containing this attribute
-</dd><dt><i>lineno</i></dt>
+</dd><dt><i>lineno</i> (int)</dt>
 <dd>
-linenumber of the class definition
+line number of the attribute definition
 </dd>
 </dl><a NAME="Attribute.addAssignment" ID="Attribute.addAssignment"></a>
 <h4>Attribute.addAssignment</h4>
@@ -114,10 +117,9 @@
 <p>
         Public method to add another assignment line number.
 </p><dl>
-<dt><i>lineno</i></dt>
+<dt><i>lineno</i> (int)</dt>
 <dd>
-linenumber of the additional attribute assignment
-            (integer)
+line number of the additional attribute assignment
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
@@ -154,21 +156,21 @@
 <p>
         Constructor
 </p><dl>
-<dt><i>module</i></dt>
+<dt><i>module</i> (str)</dt>
 <dd>
 name of the module containing this class
-</dd><dt><i>name</i></dt>
+</dd><dt><i>name</i> (str)</dt>
 <dd>
 name of this class
-</dd><dt><i>superClasses</i></dt>
+</dd><dt><i>superClasses</i> (list of str)</dt>
 <dd>
 list of class names this class is inherited from
-</dd><dt><i>file</i></dt>
+</dd><dt><i>file</i> (str)</dt>
 <dd>
 filename containing this class
-</dd><dt><i>lineno</i></dt>
+</dd><dt><i>lineno</i> (int)</dt>
 <dd>
-linenumber of the class definition
+line number of the class definition
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
@@ -226,18 +228,18 @@
 <p>
         Constructor
 </p><dl>
-<dt><i>module</i></dt>
+<dt><i>module</i> (str)</dt>
 <dd>
-name of the module containing this class
-</dd><dt><i>name</i></dt>
+name of the module containing this object
+</dd><dt><i>name</i> (str)</dt>
 <dd>
-name of this class
-</dd><dt><i>file</i></dt>
+name of this object
+</dd><dt><i>file</i> (str)</dt>
 <dd>
 filename containing this object
-</dd><dt><i>lineno</i></dt>
+</dd><dt><i>lineno</i> (int)</dt>
 <dd>
-linenumber of the class definition
+linenumber of the object definition
 </dd>
 </dl><a NAME="ClbrBase._addattribute" ID="ClbrBase._addattribute"></a>
 <h4>ClbrBase._addattribute</h4>
@@ -245,9 +247,9 @@
 <p>
         Protected method to add information about attributes.
 </p><dl>
-<dt><i>attr</i></dt>
+<dt><i>attr</i> (Attribute)</dt>
 <dd>
-Attribute object to be added (Attribute)
+Attribute object to be added
 </dd>
 </dl><a NAME="ClbrBase._addclass" ID="ClbrBase._addclass"></a>
 <h4>ClbrBase._addclass</h4>
@@ -255,12 +257,12 @@
 <p>
         Protected method method to add a nested class to this class.
 </p><dl>
-<dt><i>name</i></dt>
+<dt><i>name</i> (str)</dt>
 <dd>
 name of the class
-</dd><dt><i>_class</i></dt>
+</dd><dt><i>_class</i> (Class)</dt>
 <dd>
-Class object to be added (Class)
+Class object to be added
 </dd>
 </dl><a NAME="ClbrBase._addglobal" ID="ClbrBase._addglobal"></a>
 <h4>ClbrBase._addglobal</h4>
@@ -268,9 +270,9 @@
 <p>
         Protected method to add information about global variables.
 </p><dl>
-<dt><i>attr</i></dt>
+<dt><i>attr</i> (Attribute)</dt>
 <dd>
-Attribute object to be added (Attribute)
+Attribute object to be added
 </dd>
 </dl><a NAME="ClbrBase._addmethod" ID="ClbrBase._addmethod"></a>
 <h4>ClbrBase._addmethod</h4>
@@ -278,10 +280,10 @@
 <p>
         Protected method to add information about a method.
 </p><dl>
-<dt><i>name</i></dt>
+<dt><i>name</i> (str)</dt>
 <dd>
-name of method to be added (string)
-</dd><dt><i>function</i></dt>
+name of method to be added
+</dd><dt><i>function</i> (Function)</dt>
 <dd>
 Function object to be added
 </dd>
@@ -291,14 +293,19 @@
 <p>
         Protected method to retrieve an attribute by name.
 </p><dl>
-<dt><i>name</i></dt>
+<dt><i>name</i> (str)</dt>
 <dd>
-name of the attribute (string)
+name of the attribute
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
 <dd>
-the named attribute or None
+the named attribute
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+Attribute or None
 </dd>
 </dl><a NAME="ClbrBase._getglobal" ID="ClbrBase._getglobal"></a>
 <h4>ClbrBase._getglobal</h4>
@@ -306,14 +313,19 @@
 <p>
         Protected method to retrieve a global variable by name.
 </p><dl>
-<dt><i>name</i></dt>
+<dt><i>name</i> (str)</dt>
 <dd>
-name of the global variable (string)
+name of the global variable
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
 <dd>
-the named global variable or None
+the named global variable
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+Attribute or None
 </dd>
 </dl><a NAME="ClbrBase._getmethod" ID="ClbrBase._getmethod"></a>
 <h4>ClbrBase._getmethod</h4>
@@ -321,14 +333,19 @@
 <p>
         Protected method to retrieve a method by name.
 </p><dl>
-<dt><i>name</i></dt>
+<dt><i>name</i> (str)</dt>
 <dd>
 name of the method (string)
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
 <dd>
-the named method or None
+the named method
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+Function or None
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
@@ -382,7 +399,12 @@
 </p><dl>
 <dt>Returns:</dt>
 <dd>
-flag indicating Private visibility (boolean)
+flag indicating Private visibility
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
 </dd>
 </dl><a NAME="ClbrVisibilityMixinBase.isProtected" ID="ClbrVisibilityMixinBase.isProtected"></a>
 <h4>ClbrVisibilityMixinBase.isProtected</h4>
@@ -392,7 +414,12 @@
 </p><dl>
 <dt>Returns:</dt>
 <dd>
-flag indicating Protected visibility (boolean)
+flag indicating Protected visibility
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
 </dd>
 </dl><a NAME="ClbrVisibilityMixinBase.isPublic" ID="ClbrVisibilityMixinBase.isPublic"></a>
 <h4>ClbrVisibilityMixinBase.isPublic</h4>
@@ -402,7 +429,12 @@
 </p><dl>
 <dt>Returns:</dt>
 <dd>
-flag indicating Public visibility (boolean)
+flag indicating Public visibility
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+bool
 </dd>
 </dl><a NAME="ClbrVisibilityMixinBase.setPrivate" ID="ClbrVisibilityMixinBase.setPrivate"></a>
 <h4>ClbrVisibilityMixinBase.setPrivate</h4>
@@ -454,22 +486,70 @@
 <p>
         Constructor
 </p><dl>
-<dt><i>module</i></dt>
+<dt><i>module</i> (str)</dt>
 <dd>
-name of the module containing this module
-</dd><dt><i>file</i></dt>
+name of the module containing this coding statement
+</dd><dt><i>file</i> (str)</dt>
 <dd>
-filename containing this module
-</dd><dt><i>lineno</i></dt>
+filename containing this coding statement
+</dd><dt><i>lineno</i> (int)</dt>
 <dd>
-linenumber of the module definition
-</dd><dt><i>coding</i></dt>
+line number of the coding definition
+</dd><dt><i>coding</i> (str)</dt>
 <dd>
 character coding of the source file
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr /><hr />
+<a NAME="Enum" ID="Enum"></a>
+<h2>Enum</h2>
+<p>
+    Class to represent an enum definition.
+</p>
+<h3>Derived from</h3>
+ClbrBase
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#Enum.__init__">Enum</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="Enum.__init__" ID="Enum.__init__"></a>
+<h4>Enum (Constructor)</h4>
+<b>Enum</b>(<i>module, name, file, lineno</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>module</i> (str)</dt>
+<dd>
+name of the module containing this enum
+</dd><dt><i>name</i> (str)</dt>
+<dd>
+name of this enum
+</dd><dt><i>file</i> (str)</dt>
+<dd>
+filename containing this enum
+</dd><dt><i>lineno</i> (int)</dt>
+<dd>
+line number of the enum definition
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
 <a NAME="Function" ID="Function"></a>
 <h2>Function</h2>
 <p>
@@ -502,30 +582,30 @@
 <p>
         Constructor
 </p><dl>
-<dt><i>module</i></dt>
+<dt><i>module</i> (str)</dt>
 <dd>
 name of the module containing this function
-</dd><dt><i>name</i></dt>
+</dd><dt><i>name</i> (str)</dt>
 <dd>
 name of this function
-</dd><dt><i>file</i></dt>
+</dd><dt><i>file</i> (str)</dt>
 <dd>
-filename containing this class
-</dd><dt><i>lineno</i></dt>
+filename containing this function
+</dd><dt><i>lineno</i> (int)</dt>
 <dd>
-linenumber of the class definition
-</dd><dt><i>signature</i></dt>
+line number of the function definition
+</dd><dt><i>signature</i> (str)</dt>
 <dd>
-parameterlist of the method
-</dd><dt><i>separator</i></dt>
+parameter list of the function
+</dd><dt><i>separator</i> (str)</dt>
 <dd>
-string separating the parameters
-</dd><dt><i>modifierType</i></dt>
+string separating the parameters of the function
+</dd><dt><i>modifierType</i> (int)</dt>
 <dd>
 type of the function
-</dd><dt><i>annotation</i></dt>
+</dd><dt><i>annotation</i> (str)</dt>
 <dd>
-return annotation
+function return annotation
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
@@ -562,18 +642,18 @@
 <p>
         Constructor
 </p><dl>
-<dt><i>module</i></dt>
+<dt><i>module</i> (str)</dt>
 <dd>
 name of the module containing this module
-</dd><dt><i>name</i></dt>
+</dd><dt><i>name</i> (str)</dt>
 <dd>
 name of this module
-</dd><dt><i>file</i></dt>
+</dd><dt><i>file</i> (str)</dt>
 <dd>
 filename containing this module
-</dd><dt><i>lineno</i></dt>
+</dd><dt><i>lineno</i> (int)</dt>
 <dd>
-linenumber of the module definition
+line number of the module definition
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
@@ -613,18 +693,18 @@
 <p>
         Constructor
 </p><dl>
-<dt><i>module</i></dt>
+<dt><i>module</i> (str)</dt>
 <dd>
-name of the module containing this class
-</dd><dt><i>name</i></dt>
+name of the module containing this object
+</dd><dt><i>name</i> (str)</dt>
 <dd>
-name of this class
-</dd><dt><i>file</i></dt>
+name of this object
+</dd><dt><i>file</i> (str)</dt>
 <dd>
 filename containing this object
-</dd><dt><i>lineno</i></dt>
+</dd><dt><i>lineno</i> (int)</dt>
 <dd>
-linenumber of the class definition
+linenumber of the object definition
 </dd>
 </dl><a NAME="_ClbrBase.setEndLine" ID="_ClbrBase.setEndLine"></a>
 <h4>_ClbrBase.setEndLine</h4>
@@ -632,9 +712,9 @@
 <p>
         Public method to set the ending line number.
 </p><dl>
-<dt><i>endLineNo</i></dt>
+<dt><i>endLineNo</i> (int)</dt>
 <dd>
-number of the last line (integer)
+number of the last line
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
--- a/Documentation/Source/eric6.Utilities.ClassBrowsers.__init__.html	Sat Nov 18 12:35:13 2017 +0100
+++ b/Documentation/Source/eric6.Utilities.ClassBrowsers.__init__.html	Sat Nov 18 18:27:25 2017 +0100
@@ -28,13 +28,16 @@
 </p><p>
 <ul>
 <li>CORBA IDL</li>
-<li>Python</li>
+<li>JavaScript</li>
+<li>ProtoBuf</li>
+<li>Python 2</li>
+<li>Python 3</li>
 <li>Ruby</li>
 </ul>
 </p>
 <h3>Global Attributes</h3>
 <table>
-<tr><td>IDL_SOURCE</td></tr><tr><td>JS_SOURCE</td></tr><tr><td>PTL_SOURCE</td></tr><tr><td>PY_SOURCE</td></tr><tr><td>RB_SOURCE</td></tr><tr><td>SUPPORTED_TYPES</td></tr><tr><td>__extensions</td></tr>
+<tr><td>IDL_SOURCE</td></tr><tr><td>JS_SOURCE</td></tr><tr><td>PROTO_SOURCE</td></tr><tr><td>PTL_SOURCE</td></tr><tr><td>PY_SOURCE</td></tr><tr><td>RB_SOURCE</td></tr><tr><td>SUPPORTED_TYPES</td></tr><tr><td>__extensions</td></tr>
 </table>
 <h3>Classes</h3>
 <table>
@@ -57,20 +60,20 @@
 <p>
     Module function to extend the Python module finding mechanism.
 </p><p>
-    This function searches for files in the given path. If the filename
-    doesn't have an extension or an extension of .py, the normal search
-    implemented in the imp module is used. For all other supported files
-    only path is searched.
+    This function searches for files in the given list of paths. If the
+    file name doesn't have an extension or an extension of .py, the normal
+    Python search implemented in the imp module is used. For all other
+    supported files only the paths list is searched.
 </p><dl>
-<dt><i>name</i></dt>
+<dt><i>name</i> (str)</dt>
 <dd>
-filename or modulename to search for (string)
-</dd><dt><i>path</i></dt>
+file name or module name to search for
+</dd><dt><i>path</i> (list of str)</dt>
 <dd>
-search path (list of strings)
-</dd><dt><i>isPyFile</i></dt>
+search paths
+</dd><dt><i>isPyFile</i> (bool)</dt>
 <dd>
-flag indicating a Python file (boolean)
+flag indicating a Python file
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
@@ -79,6 +82,11 @@
         is a tuple of file suffix, file mode and file type)
 </dd>
 </dl><dl>
+<dt>Return Type:</dt>
+<dd>
+tuple
+</dd>
+</dl><dl>
 <dt>Raises <b>ImportError</b>:</dt>
 <dd>
 The file or module wasn't found.
@@ -96,21 +104,26 @@
     The real work of parsing the source file is delegated to the individual
     file parsers.
 </p><dl>
-<dt><i>module</i></dt>
+<dt><i>module</i> (str)</dt>
 <dd>
-name of the source file (string)
-</dd><dt><i>path</i></dt>
+name of the source file
+</dd><dt><i>path</i> (list of str)</dt>
 <dd>
-path the file should be searched in (list of strings)
-</dd><dt><i>isPyFile</i></dt>
+list of paths the file should be searched in
+</dd><dt><i>isPyFile</i> (bool)</dt>
 <dd>
-flag indicating a Python file (boolean)
+flag indicating a Python file
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
 <dd>
 the resulting dictionary
 </dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+dict
+</dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
--- a/Documentation/Source/eric6.Utilities.ClassBrowsers.idlclbr.html	Sat Nov 18 12:35:13 2017 +0100
+++ b/Documentation/Source/eric6.Utilities.ClassBrowsers.idlclbr.html	Sat Nov 18 18:27:25 2017 +0100
@@ -93,18 +93,18 @@
 <p>
         Constructor
 </p><dl>
-<dt><i>module</i></dt>
+<dt><i>module</i> (str)</dt>
 <dd>
-name of the module containing this class
-</dd><dt><i>name</i></dt>
+name of the module containing this attribute
+</dd><dt><i>name</i> (str)</dt>
 <dd>
-name of this class
-</dd><dt><i>file</i></dt>
+name of this attribute
+</dd><dt><i>file</i> (str)</dt>
 <dd>
 filename containing this attribute
-</dd><dt><i>lineno</i></dt>
+</dd><dt><i>lineno</i> (int)</dt>
 <dd>
-linenumber of the class definition
+line number of the attribute definition
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
@@ -141,22 +141,22 @@
 <p>
         Constructor
 </p><dl>
-<dt><i>module</i></dt>
+<dt><i>module</i> (str)</dt>
 <dd>
 name of the module containing this function
-</dd><dt><i>name</i></dt>
+</dd><dt><i>name</i> (str)</dt>
 <dd>
 name of this function
-</dd><dt><i>file</i></dt>
+</dd><dt><i>file</i> (str)</dt>
 <dd>
-filename containing this class
-</dd><dt><i>lineno</i></dt>
+filename containing this function
+</dd><dt><i>lineno</i> (int)</dt>
 <dd>
-linenumber of the class definition
-</dd><dt><i>signature</i></dt>
+line number of the function definition
+</dd><dt><i>signature</i> (str)</dt>
 <dd>
-parameterlist of the method
-</dd><dt><i>separator</i></dt>
+parameter list of the function
+</dd><dt><i>separator</i> (str)</dt>
 <dd>
 string separating the parameters
 </dd>
@@ -195,22 +195,22 @@
 <p>
         Constructor
 </p><dl>
-<dt><i>module</i></dt>
+<dt><i>module</i> (str)</dt>
 <dd>
-name of the module containing this class
-</dd><dt><i>name</i></dt>
+name of the module containing this interface
+</dd><dt><i>name</i> (str)</dt>
 <dd>
 name of this interface
-</dd><dt><i>superClasses</i></dt>
+</dd><dt><i>superClasses</i> (list of str)</dt>
 <dd>
 list of interface names this interface is
             inherited from
-</dd><dt><i>file</i></dt>
+</dd><dt><i>file</i> (str)</dt>
 <dd>
 filename containing this interface
-</dd><dt><i>lineno</i></dt>
+</dd><dt><i>lineno</i> (int)</dt>
 <dd>
-linenumber of the interface definition
+line number of the interface definition
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
@@ -247,18 +247,18 @@
 <p>
         Constructor
 </p><dl>
-<dt><i>module</i></dt>
+<dt><i>module</i> (str)</dt>
 <dd>
-name of the module containing this class
-</dd><dt><i>name</i></dt>
+name of the module containing this module
+</dd><dt><i>name</i> (str)</dt>
 <dd>
-name of this class
-</dd><dt><i>file</i></dt>
+name of this module
+</dd><dt><i>file</i> (str)</dt>
 <dd>
-filename containing this class
-</dd><dt><i>lineno</i></dt>
+filename containing this module
+</dd><dt><i>lineno</i> (int)</dt>
 <dd>
-linenumber of the class definition
+line number of the module definition
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
@@ -304,18 +304,23 @@
     Read a CORBA IDL file and return a dictionary of classes, functions and
     modules.
 </p><dl>
-<dt><i>module</i></dt>
+<dt><i>module</i> (str)</dt>
 <dd>
-name of the CORBA IDL file (string)
-</dd><dt><i>path</i></dt>
+name of the CORBA IDL file
+</dd><dt><i>path</i> (list of str)</dt>
 <dd>
-path the file should be searched in (list of strings)
+path the file should be searched in
 </dd>
 </dl><dl>
 <dt>Returns:</dt>
 <dd>
 the resulting dictionary
 </dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+dict
+</dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/Source/eric6.Utilities.ClassBrowsers.protoclbr.html	Sat Nov 18 18:27:25 2017 +0100
@@ -0,0 +1,316 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Utilities.ClassBrowsers.protoclbr</title>
+<meta charset="UTF-8">
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body><a NAME="top" ID="top"></a>
+<h1>eric6.Utilities.ClassBrowsers.protoclbr</h1>
+<p>
+Parse a ProtoBuf protocol file and retrieve messages, enums, services and
+rpc methods.
+</p><p>
+It is based on the Python class browser found in this package.
+</p>
+<h3>Global Attributes</h3>
+<table>
+<tr><td>SUPPORTED_TYPES</td></tr><tr><td>_commentsub</td></tr><tr><td>_getnext</td></tr><tr><td>_modules</td></tr><tr><td>_normalize</td></tr>
+</table>
+<h3>Classes</h3>
+<table>
+<tr>
+<td><a href="#Enum">Enum</a></td>
+<td>Class to represent a ProtoBuf Enum.</td>
+</tr><tr>
+<td><a href="#Message">Message</a></td>
+<td>Class to represent a ProtoBuf Message.</td>
+</tr><tr>
+<td><a href="#Service">Service</a></td>
+<td>Class to represent a ProtoBuf Service.</td>
+</tr><tr>
+<td><a href="#ServiceMethod">ServiceMethod</a></td>
+<td>Class to represent a ProtoBuf Service Method.</td>
+</tr><tr>
+<td><a href="#VisibilityMixin">VisibilityMixin</a></td>
+<td>Mixin class implementing the notion of visibility.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+<table>
+<tr>
+<td><a href="#readmodule_ex">readmodule_ex</a></td>
+<td>Read a ProtoBuf protocol file and return a dictionary of messages, enums, services and rpc methods.</td>
+</tr>
+</table>
+<hr /><hr />
+<a NAME="Enum" ID="Enum"></a>
+<h2>Enum</h2>
+<p>
+    Class to represent a ProtoBuf Enum.
+</p>
+<h3>Derived from</h3>
+ClbrBaseClasses.Enum, VisibilityMixin
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#Enum.__init__">Enum</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="Enum.__init__" ID="Enum.__init__"></a>
+<h4>Enum (Constructor)</h4>
+<b>Enum</b>(<i>module, name, file, lineno</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>module</i> (str)</dt>
+<dd>
+name of the module containing this enum
+</dd><dt><i>name</i> (str)</dt>
+<dd>
+name of this enum
+</dd><dt><i>file</i> (str)</dt>
+<dd>
+filename containing this enum
+</dd><dt><i>lineno</i> (int)</dt>
+<dd>
+linenumber of the message enum
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="Message" ID="Message"></a>
+<h2>Message</h2>
+<p>
+    Class to represent a ProtoBuf Message.
+</p>
+<h3>Derived from</h3>
+ClbrBaseClasses.Module, VisibilityMixin
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#Message.__init__">Message</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="Message.__init__" ID="Message.__init__"></a>
+<h4>Message (Constructor)</h4>
+<b>Message</b>(<i>module, name, file, lineno</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>module</i> (str)</dt>
+<dd>
+name of the module containing this message
+</dd><dt><i>name</i> (str)</dt>
+<dd>
+name of this message
+</dd><dt><i>file</i> (str)</dt>
+<dd>
+filename containing this message
+</dd><dt><i>lineno</i> (int)</dt>
+<dd>
+linenumber of the message definition
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="Service" ID="Service"></a>
+<h2>Service</h2>
+<p>
+    Class to represent a ProtoBuf Service.
+</p>
+<h3>Derived from</h3>
+ClbrBaseClasses.Class, VisibilityMixin
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#Service.__init__">Service</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="Service.__init__" ID="Service.__init__"></a>
+<h4>Service (Constructor)</h4>
+<b>Service</b>(<i>module, name, file, lineno</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>module</i> (str)</dt>
+<dd>
+name of the module containing this service
+</dd><dt><i>name</i> (str)</dt>
+<dd>
+name of this service
+</dd><dt><i>file</i> (str)</dt>
+<dd>
+filename containing this service
+</dd><dt><i>lineno</i> (int)</dt>
+<dd>
+linenumber of the service definition
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="ServiceMethod" ID="ServiceMethod"></a>
+<h2>ServiceMethod</h2>
+<p>
+    Class to represent a ProtoBuf Service Method.
+</p>
+<h3>Derived from</h3>
+ClbrBaseClasses.Function, VisibilityMixin
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#ServiceMethod.__init__">ServiceMethod</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="ServiceMethod.__init__" ID="ServiceMethod.__init__"></a>
+<h4>ServiceMethod (Constructor)</h4>
+<b>ServiceMethod</b>(<i>name, file, lineno, signature, returns</i>)
+<p>
+        Constructor
+</p><dl>
+<dt><i>name</i> (str)</dt>
+<dd>
+name of this service method
+</dd><dt><i>file</i> (str)</dt>
+<dd>
+filename containing this service method
+</dd><dt><i>lineno</i> (int)</dt>
+<dd>
+linenumber of the service method definition
+</dd><dt><i>signature</i> (str)</dt>
+<dd>
+parameter list of the service method
+</dd><dt><i>returns</i> (str)</dt>
+<dd>
+return type of the service method
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="VisibilityMixin" ID="VisibilityMixin"></a>
+<h2>VisibilityMixin</h2>
+<p>
+    Mixin class implementing the notion of visibility.
+</p>
+<h3>Derived from</h3>
+ClbrBaseClasses.ClbrVisibilityMixinBase
+<h3>Class Attributes</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+<table>
+<tr>
+<td><a href="#VisibilityMixin.__init__">VisibilityMixin</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+<table>
+<tr><td>None</td></tr>
+</table>
+<a NAME="VisibilityMixin.__init__" ID="VisibilityMixin.__init__"></a>
+<h4>VisibilityMixin (Constructor)</h4>
+<b>VisibilityMixin</b>(<i></i>)
+<p>
+        Constructor
+</p>
+<div align="right"><a href="#top">Up</a></div>
+<hr /><hr />
+<a NAME="readmodule_ex" ID="readmodule_ex"></a>
+<h2>readmodule_ex</h2>
+<b>readmodule_ex</b>(<i>module, path=None</i>)
+<p>
+    Read a ProtoBuf protocol file and return a dictionary of messages, enums,
+    services and rpc methods.
+</p><dl>
+<dt><i>module</i> (str)</dt>
+<dd>
+name of the ProtoBuf protocol file
+</dd><dt><i>path</i> (list of str)</dt>
+<dd>
+path the file should be searched in
+</dd>
+</dl><dl>
+<dt>Returns:</dt>
+<dd>
+the resulting dictionary
+</dd>
+</dl><dl>
+<dt>Return Type:</dt>
+<dd>
+dict
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/Documentation/Source/index-eric6.Utilities.ClassBrowsers.html	Sat Nov 18 12:35:13 2017 +0100
+++ b/Documentation/Source/index-eric6.Utilities.ClassBrowsers.html	Sat Nov 18 18:27:25 2017 +0100
@@ -28,7 +28,10 @@
 </p><p>
 <ul>
 <li>CORBA IDL</li>
-<li>Python</li>
+<li>JavaScript</li>
+<li>ProtoBuf</li>
+<li>Python 2</li>
+<li>Python 3</li>
 <li>Ruby</li>
 </ul>
 </p>
@@ -49,6 +52,9 @@
 <td><a href="eric6.Utilities.ClassBrowsers.jsclbr.html">jsclbr</a></td>
 <td>Parse a JavaScript file and retrieve variables and functions.</td>
 </tr><tr>
+<td><a href="eric6.Utilities.ClassBrowsers.protoclbr.html">protoclbr</a></td>
+<td>Parse a ProtoBuf protocol file and retrieve messages, enums, services and rpc methods.</td>
+</tr><tr>
 <td><a href="eric6.Utilities.ClassBrowsers.pyclbr.html">pyclbr</a></td>
 <td>Parse a Python file and retrieve classes, functions/methods and attributes.</td>
 </tr><tr>
--- a/UI/BrowserModel.py	Sat Nov 18 12:35:13 2017 +0100
+++ b/UI/BrowserModel.py	Sat Nov 18 18:27:25 2017 +0100
@@ -1137,6 +1137,9 @@
             self._moduleName = os.path.basename(finfo)
         elif self.isProtobufFile():
             pixName = "protobuf.png"
+            self._populated = False
+            self._lazyPopulation = True
+            self._moduleName = os.path.basename(finfo)
         elif self.isSvgFile():
             pixName = "fileSvg.png"
         elif self.isPixmapFile():
@@ -1167,7 +1170,8 @@
         self._filename = os.path.abspath(finfo)
         self.itemData[0] = os.path.basename(finfo)
         if self.isPython2File() or self.isPython3File() or \
-           self.isRubyFile() or self.isIdlFile():
+           self.isRubyFile() or self.isIdlFile() or \
+           self.isProtobufFile():
             self._dirName = os.path.dirname(finfo)
             self._moduleName = os.path.basename(finfo)
     
@@ -1393,6 +1397,9 @@
         self.ismodule = isinstance(
             self._classObject,
             Utilities.ClassBrowsers.ClbrBaseClasses.Module)
+        self.isenum = isinstance(
+            self._classObject,
+            Utilities.ClassBrowsers.ClbrBaseClasses.Enum)
         if self.isfunction:
             if cl.isPrivate():
                 self.icon = UI.PixmapCache.getIcon("method_private.png")
@@ -1411,6 +1418,8 @@
             #                       for e in self._classObject.parameters]))
         elif self.ismodule:
             self.icon = UI.PixmapCache.getIcon("module.png")
+        elif self.isenum:
+            self.icon = UI.PixmapCache.getIcon("attribute.png")
         else:
             if cl.isPrivate():
                 self.icon = UI.PixmapCache.getIcon("class_private.png")
--- a/Utilities/ClassBrowsers/ClbrBaseClasses.py	Sat Nov 18 12:35:13 2017 +0100
+++ b/Utilities/ClassBrowsers/ClbrBaseClasses.py	Sat Nov 18 18:27:25 2017 +0100
@@ -19,10 +19,14 @@
         """
         Constructor
         
-        @param module name of the module containing this class
-        @param name name of this class
+        @param module name of the module containing this object
+        @type str
+        @param name name of this object
+        @type str
         @param file filename containing this object
-        @param lineno linenumber of the class definition
+        @type str
+        @param lineno linenumber of the object definition
+        @type int
         """
         self.module = module
         self.name = name
@@ -34,7 +38,8 @@
         """
         Public method to set the ending line number.
         
-        @param endLineNo number of the last line (integer)
+        @param endLineNo number of the last line
+        @type int
         """
         self.endlineno = endLineNo
 
@@ -47,10 +52,14 @@
         """
         Constructor
         
-        @param module name of the module containing this class
-        @param name name of this class
+        @param module name of the module containing this object
+        @type str
+        @param name name of this object
+        @type str
         @param file filename containing this object
-        @param lineno linenumber of the class definition
+        @type str
+        @param lineno linenumber of the object definition
+        @type int
         """
         _ClbrBase.__init__(self, module, name, file, lineno)
         self.methods = {}
@@ -62,8 +71,10 @@
         """
         Protected method to add information about a method.
         
-        @param name name of method to be added (string)
+        @param name name of method to be added
+        @type str
         @param function Function object to be added
+        @type Function
         """
         self.methods[name] = function
         
@@ -72,7 +83,9 @@
         Protected method to retrieve a method by name.
         
         @param name name of the method (string)
-        @return the named method or None
+        @type str
+        @return the named method
+        @rtype Function or None
         """
         try:
             return self.methods[name]
@@ -83,7 +96,8 @@
         """
         Protected method to add information about global variables.
         
-        @param attr Attribute object to be added (Attribute)
+        @param attr Attribute object to be added
+        @type Attribute
         """
         if attr.name not in self.globals:
             self.globals[attr.name] = attr
@@ -94,8 +108,10 @@
         """
         Protected method to retrieve a global variable by name.
         
-        @param name name of the global variable (string)
-        @return the named global variable or None
+        @param name name of the global variable
+        @type str
+        @return the named global variable
+        @rtype Attribute or None
         """
         try:
             return self.globals[name]
@@ -106,7 +122,8 @@
         """
         Protected method to add information about attributes.
         
-        @param attr Attribute object to be added (Attribute)
+        @param attr Attribute object to be added
+        @type Attribute
         """
         if attr.name not in self.attributes:
             self.attributes[attr.name] = attr
@@ -117,8 +134,10 @@
         """
         Protected method to retrieve an attribute by name.
         
-        @param name name of the attribute (string)
-        @return the named attribute or None
+        @param name name of the attribute
+        @type str
+        @return the named attribute
+        @rtype Attribute or None
         """
         try:
             return self.attributes[name]
@@ -130,7 +149,9 @@
         Protected method method to add a nested class to this class.
         
         @param name name of the class
-        @param _class Class object to be added (Class)
+        @type str
+        @param _class Class object to be added
+        @type Class
         """
         self.classes[name] = _class
 
@@ -143,7 +164,8 @@
         """
         Public method to check, if the visibility is Private.
         
-        @return flag indicating Private visibility (boolean)
+        @return flag indicating Private visibility
+        @rtype bool
         """
         return self.visibility == 0
         
@@ -151,7 +173,8 @@
         """
         Public method to check, if the visibility is Protected.
         
-        @return flag indicating Protected visibility (boolean)
+        @return flag indicating Protected visibility
+        @rtype bool
         """
         return self.visibility == 1
         
@@ -159,7 +182,8 @@
         """
         Public method to check, if the visibility is Public.
         
-        @return flag indicating Public visibility (boolean)
+        @return flag indicating Public visibility
+        @rtype bool
         """
         return self.visibility == 2
         
@@ -190,10 +214,14 @@
         """
         Constructor
         
-        @param module name of the module containing this class
-        @param name name of this class
+        @param module name of the module containing this attribute
+        @type str
+        @param name name of this attribute
+        @type str
         @param file filename containing this attribute
-        @param lineno linenumber of the class definition
+        @type str
+        @param lineno line number of the attribute definition
+        @type int
         """
         _ClbrBase.__init__(self, module, name, file, lineno)
         
@@ -203,8 +231,8 @@
         """
         Public method to add another assignment line number.
         
-        @param lineno linenumber of the additional attribute assignment
-            (integer)
+        @param lineno line number of the additional attribute assignment
+        @type int
         """
         if lineno not in self.linenos:
             self.linenos.append(lineno)
@@ -219,10 +247,15 @@
         Constructor
         
         @param module name of the module containing this class
+        @type str
         @param name name of this class
+        @type str
         @param superClasses list of class names this class is inherited from
+        @type list of str
         @param file filename containing this class
-        @param lineno linenumber of the class definition
+        @type str
+        @param lineno line number of the class definition
+        @type int
         """
         ClbrBase.__init__(self, module, name, file, lineno)
         if superClasses is None:
@@ -239,9 +272,13 @@
         Constructor
         
         @param module name of the module containing this module
+        @type str
         @param name name of this module
+        @type str
         @param file filename containing this module
-        @param lineno linenumber of the module definition
+        @type str
+        @param lineno line number of the module definition
+        @type int
         """
         ClbrBase.__init__(self, module, name, file, lineno)
 
@@ -260,13 +297,21 @@
         Constructor
         
         @param module name of the module containing this function
+        @type str
         @param name name of this function
-        @param file filename containing this class
-        @param lineno linenumber of the class definition
-        @param signature parameterlist of the method
-        @param separator string separating the parameters
+        @type str
+        @param file filename containing this function
+        @type str
+        @param lineno line number of the function definition
+        @type int
+        @param signature parameter list of the function
+        @type str
+        @param separator string separating the parameters of the function
+        @type str
         @param modifierType type of the function
-        @param annotation return annotation
+        @type int
+        @param annotation function return annotation
+        @type str
         """
         ClbrBase.__init__(self, module, name, file, lineno)
         self.parameters = [e.strip() for e in signature.split(separator)]
@@ -282,10 +327,34 @@
         """
         Constructor
         
-        @param module name of the module containing this module
-        @param file filename containing this module
-        @param lineno linenumber of the module definition
+        @param module name of the module containing this coding statement
+        @type str
+        @param file filename containing this coding statement
+        @type str
+        @param lineno line number of the coding definition
+        @type int
         @param coding character coding of the source file
+        @type str
         """
         ClbrBase.__init__(self, module, "Coding", file, lineno)
         self.coding = coding
+
+
+class Enum(ClbrBase):
+    """
+    Class to represent an enum definition.
+    """
+    def __init__(self, module, name, file, lineno):
+        """
+        Constructor
+        
+        @param module name of the module containing this enum
+        @type str
+        @param name name of this enum
+        @type str
+        @param file filename containing this enum
+        @type str
+        @param lineno line number of the enum definition
+        @type int
+        """
+        ClbrBase.__init__(self, module, name, file, lineno)
--- a/Utilities/ClassBrowsers/__init__.py	Sat Nov 18 12:35:13 2017 +0100
+++ b/Utilities/ClassBrowsers/__init__.py	Sat Nov 18 18:27:25 2017 +0100
@@ -11,7 +11,10 @@
 
 <ul>
 <li>CORBA IDL</li>
-<li>Python</li>
+<li>JavaScript</li>
+<li>ProtoBuf</li>
+<li>Python 2</li>
+<li>Python 3</li>
 <li>Ruby</li>
 </ul>
 """
@@ -29,14 +32,17 @@
 RB_SOURCE = 129
 IDL_SOURCE = 130
 JS_SOURCE = 131
+PROTO_SOURCE = 132
 
-SUPPORTED_TYPES = [PY_SOURCE, PTL_SOURCE, RB_SOURCE, IDL_SOURCE, JS_SOURCE]
+SUPPORTED_TYPES = [PY_SOURCE, PTL_SOURCE, RB_SOURCE, IDL_SOURCE, JS_SOURCE,
+                   PROTO_SOURCE]
 
 __extensions = {
     "IDL": [".idl"],
     "Python": [".py", ".pyw", ".ptl"],  # currently not used
     "Ruby": [".rb"],
     "JavaScript": [".js"],
+    "ProtoBuf": [".proto"],
 }
 
 
@@ -48,10 +54,14 @@
     The real work of parsing the source file is delegated to the individual
     file parsers.
 
-    @param module name of the source file (string)
-    @param path path the file should be searched in (list of strings)
-    @param isPyFile flag indicating a Python file (boolean)
+    @param module name of the source file
+    @type str
+    @param path list of paths the file should be searched in
+    @type list of str
+    @param isPyFile flag indicating a Python file
+    @type bool
     @return the resulting dictionary
+    @rtype dict
     """
     ext = os.path.splitext(module)[1].lower()
     path = [] if path is None else path[:]
@@ -60,6 +70,10 @@
         from . import idlclbr
         dictionary = idlclbr.readmodule_ex(module, path)
         idlclbr._modules.clear()
+    elif ext in __extensions["ProtoBuf"]:
+        from . import protoclbr
+        dictionary = protoclbr.readmodule_ex(module, path)
+        protoclbr._modules.clear()
     elif ext in __extensions["Ruby"]:
         from . import rbclbr
         dictionary = rbclbr.readmodule_ex(module, path)
@@ -87,16 +101,20 @@
     """
     Module function to extend the Python module finding mechanism.
     
-    This function searches for files in the given path. If the filename
-    doesn't have an extension or an extension of .py, the normal search
-    implemented in the imp module is used. For all other supported files
-    only path is searched.
+    This function searches for files in the given list of paths. If the
+    file name doesn't have an extension or an extension of .py, the normal
+    Python search implemented in the imp module is used. For all other
+    supported files only the paths list is searched.
     
-    @param name filename or modulename to search for (string)
-    @param path search path (list of strings)
-    @param isPyFile flag indicating a Python file (boolean)
+    @param name file name or module name to search for
+    @type str
+    @param path search paths
+    @type list of str
+    @param isPyFile flag indicating a Python file
+    @type bool
     @return tuple of the open file, pathname and description. Description
         is a tuple of file suffix, file mode and file type)
+    @rtype tuple
     @exception ImportError The file or module wasn't found.
     """
     ext = os.path.splitext(name)[1].lower()
@@ -115,6 +133,13 @@
                 return (open(pathname), pathname, (ext, 'r', IDL_SOURCE))
         raise ImportError
     
+    elif ext in __extensions["ProtoBuf"]:
+        for p in path:      # only search in path
+            pathname = os.path.join(p, name)
+            if os.path.exists(pathname):
+                return (open(pathname), pathname, (ext, 'r', PROTO_SOURCE))
+        raise ImportError
+    
     elif ext in __extensions["JavaScript"]:
         for p in path:      # only search in path
             pathname = os.path.join(p, name)
--- a/Utilities/ClassBrowsers/idlclbr.py	Sat Nov 18 12:35:13 2017 +0100
+++ b/Utilities/ClassBrowsers/idlclbr.py	Sat Nov 18 18:27:25 2017 +0100
@@ -114,10 +114,14 @@
         """
         Constructor
         
-        @param module name of the module containing this class
-        @param name name of this class
-        @param file filename containing this class
-        @param lineno linenumber of the class definition
+        @param module name of the module containing this module
+        @type str
+        @param name name of this module
+        @type str
+        @param file filename containing this module
+        @type str
+        @param lineno line number of the module definition
+        @type int
         """
         ClbrBaseClasses.Module.__init__(self, module, name, file, lineno)
         VisibilityMixin.__init__(self)
@@ -131,12 +135,17 @@
         """
         Constructor
         
-        @param module name of the module containing this class
+        @param module name of the module containing this interface
+        @type str
         @param name name of this interface
+        @type str
         @param superClasses list of interface names this interface is
             inherited from
+        @type list of str
         @param file filename containing this interface
-        @param lineno linenumber of the interface definition
+        @type str
+        @param lineno line number of the interface definition
+        @type int
         """
         ClbrBaseClasses.Class.__init__(self, module, name, superClasses, file,
                                        lineno)
@@ -153,11 +162,17 @@
         Constructor
         
         @param module name of the module containing this function
+        @type str
         @param name name of this function
-        @param file filename containing this class
-        @param lineno linenumber of the class definition
-        @param signature parameterlist of the method
+        @type str
+        @param file filename containing this function
+        @type str
+        @param lineno line number of the function definition
+        @type int
+        @param signature parameter list of the function
+        @type str
         @param separator string separating the parameters
+        @type str
         """
         ClbrBaseClasses.Function.__init__(self, module, name, file, lineno,
                                           signature, separator)
@@ -172,10 +187,14 @@
         """
         Constructor
         
-        @param module name of the module containing this class
-        @param name name of this class
+        @param module name of the module containing this attribute
+        @type str
+        @param name name of this attribute
+        @type str
         @param file filename containing this attribute
-        @param lineno linenumber of the class definition
+        @type str
+        @param lineno line number of the attribute definition
+        @type int
         """
         ClbrBaseClasses.Attribute.__init__(self, module, name, file, lineno)
         VisibilityMixin.__init__(self)
@@ -186,9 +205,12 @@
     Read a CORBA IDL file and return a dictionary of classes, functions and
     modules.
 
-    @param module name of the CORBA IDL file (string)
-    @param path path the file should be searched in (list of strings)
+    @param module name of the CORBA IDL file
+    @type str
+    @param path path the file should be searched in
+    @type list of str
     @return the resulting dictionary
+    @rtype dict
     """
     global _modules
     
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/ClassBrowsers/protoclbr.py	Sat Nov 18 18:27:25 2017 +0100
@@ -0,0 +1,390 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2017 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Parse a ProtoBuf protocol file and retrieve messages, enums, services and
+rpc methods.
+
+It is based on the Python class browser found in this package.
+"""
+
+from __future__ import unicode_literals
+
+import re
+
+import Utilities
+import Utilities.ClassBrowsers as ClassBrowsers
+from . import ClbrBaseClasses
+
+SUPPORTED_TYPES = [ClassBrowsers.PROTO_SOURCE]
+    
+_getnext = re.compile(
+    r"""
+    (?P<String>
+        " [^"\\\n]* (?: \\. [^"\\\n]*)* "
+    )
+
+|   (?P<Comment>
+        ^ [ \t]* // .*? $
+    |
+        ^ [ \t]* /\* .*? \*/
+    )
+
+|   (?P<Message>
+        ^
+        (?P<MessageIndent> [ \t]* )
+        message [ \t]+
+        (?P<MessageName> [a-zA-Z_] [a-zA-Z0-9_]* )
+        [ \t]* {
+    )
+
+|   (?P<Enum>
+        ^
+        (?P<EnumIndent> [ \t]* )
+        enum [ \t]+
+        (?P<EnumName> [a-zA-Z_] [a-zA-Z0-9_]* )
+        [ \t]* {
+    )
+
+|   (?P<Service>
+        ^
+        (?P<ServiceIndent> [ \t]* )
+        service [ \t]+
+        (?P<ServiceName> [a-zA-Z_] [a-zA-Z0-9_]* )
+        [ \t]* {
+    )
+
+|   (?P<Method>
+        ^
+        (?P<MethodIndent> [ \t]* )
+        rpc [ \t]+
+        (?P<MethodName> [a-zA-Z_] [a-zA-Z0-9_]* )
+        [ \t]*
+        \(
+        (?P<MethodSignature> [^)]+? )
+        \)
+        [ \t]+
+        returns
+        [ \t]*
+        \(
+        (?P<MethodReturn> [^)]+? )
+        \)
+        [ \t]*
+    )
+
+|   (?P<Begin>
+        [ \t]* {
+    )
+
+|   (?P<End>
+        [ \t]* } [ \t]* ;?
+    )""",
+    re.VERBOSE | re.DOTALL | re.MULTILINE).search
+
+# function to replace comments
+_commentsub = re.compile(r"""//[^\n]*\n|//[^\n]*$""").sub
+# function to normalize whitespace
+_normalize = re.compile(r"""[ \t]{2,}""").sub
+
+_modules = {}                           # cache of modules we've seen
+
+
+class VisibilityMixin(ClbrBaseClasses.ClbrVisibilityMixinBase):
+    """
+    Mixin class implementing the notion of visibility.
+    """
+    def __init__(self):
+        """
+        Constructor
+        """
+        self.setPublic()
+
+
+class Message(ClbrBaseClasses.Module, VisibilityMixin):
+    """
+    Class to represent a ProtoBuf Message.
+    """
+    def __init__(self, module, name, file, lineno):
+        """
+        Constructor
+        
+        @param module name of the module containing this message
+        @type str
+        @param name name of this message
+        @type str
+        @param file filename containing this message
+        @type str
+        @param lineno linenumber of the message definition
+        @type int
+        """
+        ClbrBaseClasses.Module.__init__(self, module, name, file, lineno)
+        VisibilityMixin.__init__(self)
+
+
+class Enum(ClbrBaseClasses.Enum, VisibilityMixin):
+    """
+    Class to represent a ProtoBuf Enum.
+    """
+    def __init__(self, module, name, file, lineno):
+        """
+        Constructor
+        
+        @param module name of the module containing this enum
+        @type str
+        @param name name of this enum
+        @type str
+        @param file filename containing this enum
+        @type str
+        @param lineno linenumber of the message enum
+        @type int
+        """
+        ClbrBaseClasses.Enum.__init__(self, module, name, file, lineno)
+        VisibilityMixin.__init__(self)
+
+
+class Service(ClbrBaseClasses.Class, VisibilityMixin):
+    """
+    Class to represent a ProtoBuf Service.
+    """
+    def __init__(self, module, name, file, lineno):
+        """
+        Constructor
+        
+        @param module name of the module containing this service
+        @type str
+        @param name name of this service
+        @type str
+        @param file filename containing this service
+        @type str
+        @param lineno linenumber of the service definition
+        @type int
+        """
+        ClbrBaseClasses.Class.__init__(self, module, name, None, file,
+                                       lineno)
+        VisibilityMixin.__init__(self)
+
+
+class ServiceMethod(ClbrBaseClasses.Function, VisibilityMixin):
+    """
+    Class to represent a ProtoBuf Service Method.
+    """
+    def __init__(self, name, file, lineno, signature, returns):
+        """
+        Constructor
+        
+        @param name name of this service method
+        @type str
+        @param file filename containing this service method
+        @type str
+        @param lineno linenumber of the service method definition
+        @type int
+        @param signature parameter list of the service method
+        @type str
+        @param returns return type of the service method
+        @type str
+        """
+        ClbrBaseClasses.Function.__init__(self, None, name, file, lineno,
+                                          signature,
+                                          annotation="-> {0}".format(returns))
+        VisibilityMixin.__init__(self)
+
+
+def readmodule_ex(module, path=None):
+    """
+    Read a ProtoBuf protocol file and return a dictionary of messages, enums,
+    services and rpc methods.
+
+    @param module name of the ProtoBuf protocol file
+    @type str
+    @param path path the file should be searched in
+    @type list of str
+    @return the resulting dictionary
+    @rtype dict
+    """
+    global _modules
+    
+    dictionary = {}
+
+    if module in _modules:
+        # we've seen this file before...
+        return _modules[module]
+
+    # search the path for the file
+    f = None
+    fullpath = [] if path is None else path[:]
+    f, file, (suff, mode, type) = ClassBrowsers.find_module(module, fullpath)
+    if f:
+        f.close()
+    if type not in SUPPORTED_TYPES:
+        # not ProtoBuf protocol source, can't do anything with this module
+        _modules[module] = dictionary
+        return dictionary
+
+    _modules[module] = dictionary
+    classstack = []  # stack of (class, indent) pairs
+    indent = 0
+    try:
+        src = Utilities.readEncodedFile(file)[0]
+    except (UnicodeError, IOError):
+        # can't do anything with this module
+        _modules[module] = dictionary
+        return dictionary
+
+    lineno, last_lineno_pos = 1, 0
+    lastGlobalEntry = None
+    cur_obj = None
+    i = 0
+    while True:
+        m = _getnext(src, i)
+        if not m:
+            break
+        start, i = m.span()
+
+        if m.start("Method") >= 0:
+            # found a method definition or function
+            thisindent = indent
+            meth_name = m.group("MethodName")
+            meth_sig = m.group("MethodSignature")
+            meth_sig = meth_sig and meth_sig.replace('\\\n', '') or ''
+            meth_sig = _commentsub('', meth_sig)
+            meth_sig = _normalize(' ', meth_sig)
+            meth_return = m.group("MethodReturn")
+            meth_return = meth_return and meth_return.replace('\\\n', '') or ''
+            meth_return = _commentsub('', meth_return)
+            meth_return = _normalize(' ', meth_return)
+            lineno = lineno + src.count('\n', last_lineno_pos, start)
+            last_lineno_pos = start
+            # close all interfaces/modules indented at least as much
+            while classstack and \
+                    classstack[-1][1] >= thisindent:
+                if classstack[-1][0] is not None:
+                    # record the end line
+                    classstack[-1][0].setEndLine(lineno - 1)
+                del classstack[-1]
+            if classstack:
+                # it's an interface/module method
+                cur_class = classstack[-1][0]
+                if isinstance(cur_class, Service):
+                    # it's a method
+                    f = ServiceMethod(meth_name, file, lineno, meth_sig,
+                                      meth_return)
+                    cur_class._addmethod(meth_name, f)
+                # else it's a nested def
+                else:
+                    f = None
+            else:
+                # the file is incorrect, ignore the entry
+                continue
+            if not classstack:
+                if lastGlobalEntry:
+                    lastGlobalEntry.setEndLine(lineno - 1)
+                lastGlobalEntry = f
+            if cur_obj and isinstance(cur_obj, ServiceMethod):
+                cur_obj.setEndLine(lineno - 1)
+            cur_obj = f
+            classstack.append((f, thisindent))  # Marker for nested fns
+
+        elif m.start("String") >= 0:
+            pass
+
+        elif m.start("Comment") >= 0:
+            pass
+
+        elif m.start("Message") >= 0:
+            # we found a message definition
+            thisindent = indent
+            indent += 1
+            # close all messages/services indented at least as much
+            while classstack and \
+                    classstack[-1][1] >= thisindent:
+                if classstack[-1][0] is not None:
+                    # record the end line
+                    classstack[-1][0].setEndLine(lineno - 1)
+                del classstack[-1]
+            lineno = lineno + src.count('\n', last_lineno_pos, start)
+            last_lineno_pos = start
+            message_name = m.group("MessageName")
+            # remember this message
+            cur_class = Message(module, message_name, file, lineno)
+            if not classstack:
+                dictionary[message_name] = cur_class
+            else:
+                msg = classstack[-1][0]
+                msg._addclass(message_name, cur_class)
+            if not classstack:
+                if lastGlobalEntry:
+                    lastGlobalEntry.setEndLine(lineno - 1)
+                lastGlobalEntry = cur_class
+            cur_obj = cur_class
+            classstack.append((cur_class, thisindent))
+
+        elif m.start("Enum") >= 0:
+            # we found a message definition
+            thisindent = indent
+            indent += 1
+            # close all messages/services indented at least as much
+            while classstack and \
+                    classstack[-1][1] >= thisindent:
+                if classstack[-1][0] is not None:
+                    # record the end line
+                    classstack[-1][0].setEndLine(lineno - 1)
+                del classstack[-1]
+            lineno = lineno + src.count('\n', last_lineno_pos, start)
+            last_lineno_pos = start
+            enum_name = m.group("EnumName")
+            # remember this Enum
+            cur_class = Enum(module, enum_name, file, lineno)
+            if not classstack:
+                dictionary[enum_name] = cur_class
+            else:
+                enum = classstack[-1][0]
+                enum._addclass(enum_name, cur_class)
+            if not classstack:
+                if lastGlobalEntry:
+                    lastGlobalEntry.setEndLine(lineno - 1)
+                lastGlobalEntry = cur_class
+            cur_obj = cur_class
+            classstack.append((cur_class, thisindent))
+
+        elif m.start("Service") >= 0:
+            # we found a message definition
+            thisindent = indent
+            indent += 1
+            # close all messages/services indented at least as much
+            while classstack and \
+                    classstack[-1][1] >= thisindent:
+                if classstack[-1][0] is not None:
+                    # record the end line
+                    classstack[-1][0].setEndLine(lineno - 1)
+                del classstack[-1]
+            lineno = lineno + src.count('\n', last_lineno_pos, start)
+            last_lineno_pos = start
+            service_name = m.group("ServiceName")
+            # remember this Service
+            cur_class = Service(module, service_name, file, lineno)
+            if not classstack:
+                dictionary[service_name] = cur_class
+            else:
+                service = classstack[-1][0]
+                service._addclass(service_name, cur_class)
+            if not classstack:
+                if lastGlobalEntry:
+                    lastGlobalEntry.setEndLine(lineno - 1)
+                lastGlobalEntry = cur_class
+            cur_obj = cur_class
+            classstack.append((cur_class, thisindent))
+
+        elif m.start("Begin") >= 0:
+            # a begin of a block we are not interested in
+            indent += 1
+
+        elif m.start("End") >= 0:
+            # an end of a block
+            indent -= 1
+
+        else:
+            assert 0, "regexp _getnext found something unexpected"
+
+    return dictionary
--- a/changelog	Sat Nov 18 12:35:13 2017 +0100
+++ b/changelog	Sat Nov 18 18:27:25 2017 +0100
@@ -2,6 +2,8 @@
 ----------
 Version 17.12:
 - bug fixes
+- General
+  -- added support for Google protobuf protocol files
 - Code Documentation Viewer
   -- added possibility to show the type of the object info is shown for
   -- modified the top row and the search part in order to allow smaller sizes
--- a/eric6.e4p	Sat Nov 18 12:35:13 2017 +0100
+++ b/eric6.e4p	Sat Nov 18 18:27:25 2017 +0100
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
+<!DOCTYPE Project SYSTEM "Project-6.0.dtd">
 <!-- eric project file for project eric6 -->
 <!-- Copyright (C) 2017 Detlev Offenbach, detlev@die-offenbachs.de -->
-<Project version="5.1">
+<Project version="6.0">
   <Language>en_US</Language>
   <ProjectWordList>Dictionaries/words.dic</ProjectWordList>
   <ProjectExcludeList>Dictionaries/excludes.dic</ProjectExcludeList>
@@ -1258,6 +1258,7 @@
     <Source>Utilities/ClassBrowsers/__init__.py</Source>
     <Source>Utilities/ClassBrowsers/idlclbr.py</Source>
     <Source>Utilities/ClassBrowsers/jsclbr.py</Source>
+    <Source>Utilities/ClassBrowsers/protoclbr.py</Source>
     <Source>Utilities/ClassBrowsers/pyclbr.py</Source>
     <Source>Utilities/ClassBrowsers/rbclbr.py</Source>
     <Source>Utilities/FtpUtilities.py</Source>
@@ -2021,7 +2022,6 @@
     <Resource>WebBrowser/data/icons.qrc</Resource>
     <Resource>WebBrowser/data/javascript.qrc</Resource>
   </Resources>
-  <Interfaces/>
   <Others>
     <Other>.hgignore</Other>
     <Other>APIs/Python/zope-2.10.7.api</Other>

eric ide

mercurial