diff --git a/documentation/trunk/eiffel/Coding_Standards/Eiffel-Code-Comments.wiki b/documentation/trunk/eiffel/Coding_Standards/Eiffel-Code-Comments.wiki index 2e33d9cc..7d8d85b0 100644 --- a/documentation/trunk/eiffel/Coding_Standards/Eiffel-Code-Comments.wiki +++ b/documentation/trunk/eiffel/Coding_Standards/Eiffel-Code-Comments.wiki @@ -1,3 +1,5 @@ +[[Property:modification_date|Fri, 04 Jan 2019 15:06:26 GMT]] +[[Property:publication_date|Thu, 03 Jan 2019 18:00:43 GMT]] [[Property:uuid|146E241E-C367-4F16-9CCE-6F11E5F7860A]] [[Property:weight|1]] [[Property:title|Eiffel Code Comments]] @@ -8,22 +10,31 @@ The Eiffel compiler and EiffelStudio's code browsing tools support a special, li ===Syntax=== The syntax for marking up classes and features is very compact, to ensure retained legibility. You'll see no need for XML or other types of verbose mark up found in other languages, which can impede the comment's very nature as a quick reference. -To mark up a class reference, surround the class name in an open ('''{''') and matching closing ('''}''') brace: +To mark up a class reference, surround the class name in an open (` { `) and matching closing (` } `) brace: --- See {DEBUG_OUTPUT} for more information. + -- See {DEBUG_OUTPUT} for more information. -To mark up a feature reference, implemented in the same class or parent, surround the feature name in a single back quote (`) and a matching closing single quote ('): +To mark up a feature reference, implemented in the same class or parent, surround the name with two single back quotes (`` `...` ``): --- See `debug_output' for more information. + -- See `debug_output` for more information. +The earlier convention, which you will still find in much existing code, used a single back quote for opening and a matching normal quote for closing, as in + + + -- See `debug_output' for more information. + + +The new convention, with back quotes both for opening and for closing, is the recommended one. + + In the case where a reference to a feature is not accessible to the containing class directly, use a combination of the class reference mark up and a feature name, ''sans'' quotation marks: --- See {DEBUG_OUTPUT}.debug_output for more information. + -- See {DEBUG_OUTPUT}.debug_output for more information. The rules that apply for comments, as described above, can also be utilized in any manifest or verbatim string: @@ -49,8 +60,8 @@ feature -- Query test (a_arg: INTEGER): BOOLEAN -- Comments for a feature. -- - -- `a_arg': An integer value. - -- `Result': Could be True or False. + -- `a_arg`: An integer value. + -- `Result`: Could be True or False. deferred end @@ -99,8 +110,8 @@ Using the code browsing facilities of [[EiffelStudio]] the reader will be presen -- -- Comments for a feature. -- --- `a_arg': An integer value. --- `Result': Could be True or False. +-- `a_arg`: An integer value. +-- `Result`: Could be True or False. -- -- Some additional comments. @@ -111,8 +122,8 @@ For clarity it is a good idea to separate the agumented comments from the precur -- Comments before the original comments from {BASE}. -- Comments for a feature. -- --- `a_arg': An integer value. --- `Result': Could be True or False. +-- `a_arg`: An integer value. +-- `Result`: Could be True or False. -- Some additional comments. diff --git a/documentation/trunk/eiffel/Language_reference/quick-reference-eiffel-programming-language/eiffel-programming-language-syntax.wiki b/documentation/trunk/eiffel/Language_reference/quick-reference-eiffel-programming-language/eiffel-programming-language-syntax.wiki index c338bf68..6a79dea6 100644 --- a/documentation/trunk/eiffel/Language_reference/quick-reference-eiffel-programming-language/eiffel-programming-language-syntax.wiki +++ b/documentation/trunk/eiffel/Language_reference/quick-reference-eiffel-programming-language/eiffel-programming-language-syntax.wiki @@ -1,3 +1,5 @@ +[[Property:modification_date|Tue, 30 Apr 2019 07:27:55 GMT]] +[[Property:publication_date|Mon, 29 Apr 2019 14:08:51 GMT]] [[Property:title|Eiffel programming language syntax]] [[Property:link_title|Syntax]] [[Property:weight|0]] @@ -98,7 +100,12 @@ A simple string -- specimen of Simple_string -- is a [[#Strings|String]] consist | } || %> || Closing brace |} -* %/123/ represents the character with decimal code 123 . +* `%/123/` represents the character with decimal code `123` . +* And only for manifest character (for now) +** `'%/0x2200/'` represents the character with hexadecimal code U+2200 = '∀' (note `'%/0x2200/' = '%/8704/'` ) +** `'%/0c21000/'` in octal +** `'%/0b10001000000000/'` in binary + ===Line wrapping parts=== diff --git a/documentation/trunk/eiffel/Overview/learning-eiffel.wiki b/documentation/trunk/eiffel/Overview/learning-eiffel.wiki index 53305820..470d4792 100644 --- a/documentation/trunk/eiffel/Overview/learning-eiffel.wiki +++ b/documentation/trunk/eiffel/Overview/learning-eiffel.wiki @@ -1,54 +1,58 @@ -[[Property:title|Learning Eiffel]] -[[Property:weight|3]] -[[Property:uuid|a30e29fe-841d-4634-ded2-88ae1754e5fd]] -If you are new to Eiffel and are interested in learning the technology, you might consider some of the following resources. Remember that Eiffel, unlike other programming languages, is not just a programming language. Instead, it is a full life-cycle framework for software development. As a consequence, learning Eiffel implies learning the Eiffel Method and the Eiffel programming Language. Additionally, the Eiffel development environment EiffelStudio is specifically designed to support the method and language. So having an understanding of the method and language helps you to appreciate the capabilities and behavior of EiffelStudio. - - -=Online presentations= - -Your first stop in getting acquainted with Eiffel might be the collection of [http://eiffel.com/developers/presentations/ online presentations] on the [http://eiffel.com eiffel.com] website. These presentations each usually take less than an hour to view, and give an introduction to Eiffel concepts including Design by Contract, the EiffelStudio development environment, and includes several presentations that describe selected Eiffel features in relation to those of other other development tools. - -=Online documentation set= - -The [http://docs.eiffel.com docs.eiffel.com] site contains the online documentation for the Eiffel method, tools, and language. Within the documentation set are tutorials to help you learn about the Eiffel programming language and tools. - -==The Eiffel Tutorial== - -A [[An Eiffel Tutorial (ET)|tutorial]] that covers the Eiffel Method and much of the Eiffel programming language. - -==The EiffelStudio Guided Tour== - -This [[Introducing EiffelStudio]] page is good way to get a feel for what EiffelStudio can do. - -=Academic materials available online= - -Many colleges and universities use Eiffel to teach "best practices" in software engineering. Often the materials used in courses are available on the worldwide web. For example, the teaching materials for courses at the Swiss Federal Institute of Technology in Zurich are available at [http://se.ethz.ch/teaching/index.html this web address]. - -If you search the web, you can find similar materials at other academic institutions. - -=Learning maps= - -For certain specific areas of learning, the eiffel.com website includes conceptual [http://eiffel.com/developers/learning_maps/ learning maps]. These are graphical maps that link concepts with their relationships. Each concept can have multiple learning resources attached to it. One of the most prevalent types of resources is the "Learnlet", a short online presentation (less than 30 minutes) covering a specific concept. - -=Books= - -To find information about the most up-to-date books about Eiffel, look [[Books about the Eiffel Method and Language|here]]. - -=Examples and sample code= - -Throughout the documentation site, there are many code snippets designed to illustrate certain language features or design principles. For example, the code snippet [[ET: Inheritance#Redefinition|here]] shows the mechanics of redefining an inherited feature. - -In the EiffelStudio distribution you will find a subdirectory "examples" which contains many examples of using Eiffel, primarily with the Eiffel class libraries. - -A third source of examples is the [[Examples]] book in the documentation pages. - -=Eiffel Programming Language Syntax= - -The documentation site includes a summary of the [[Quick reference to the Eiffel programming language|syntax of Eiffel]] the language. This summary is intended to reflect the state of the current official [[ECMA Standard 367|ISO/ECMA Eiffel standard document]]. - -However, usually you will find that there are differences in the syntax supported by EiffelStudio's compiler and that defined in the current standard. The differences between the standard and the EiffelStudio implementation are summarized in the [[EiffelStudio release notes]] and in a [[Differences between standard ECMA-367 and Eiffel Software implementation|documentation page]] that is specific to that purpose. - - - - - +[[Property:modification_date|Fri, 22 Mar 2019 14:53:52 GMT]] +[[Property:publication_date|Fri, 22 Mar 2019 14:53:52 GMT]] +[[Property:title|Learning Eiffel]] +[[Property:weight|3]] +[[Property:uuid|a30e29fe-841d-4634-ded2-88ae1754e5fd]] +If you are new to Eiffel and are interested in learning the technology, you might consider some of the following resources. Remember that Eiffel, unlike other programming languages, is not just a programming language. Instead, it is a full life-cycle framework for software development. As a consequence, learning Eiffel implies learning the Eiffel Method and the Eiffel programming Language. Additionally, the Eiffel development environment EiffelStudio is specifically designed to support the method and language. So having an understanding of the method and language helps you to appreciate the capabilities and behavior of EiffelStudio. + + +=Online presentations= + +Your first stop in getting acquainted with Eiffel might be the collection of [http://eiffel.com/developers/presentations/ online presentations] on the [http://eiffel.com eiffel.com] website. These presentations each usually take less than an hour to view, and give an introduction to Eiffel concepts including Design by Contract, the EiffelStudio development environment, and includes several presentations that describe selected Eiffel features in relation to those of other other development tools. + +=Online documentation set= + +The [http://docs.eiffel.com docs.eiffel.com] site contains the online documentation for the Eiffel method, tools, and language. Within the documentation set are tutorials to help you learn about the Eiffel programming language and tools. + +==The Eiffel Tutorial== + +A [[An Eiffel Tutorial (ET)|tutorial]] that covers the Eiffel Method and much of the Eiffel programming language. + +==The EiffelStudio Guided Tour== + +This [[Introducing EiffelStudio]] page is good way to get a feel for what EiffelStudio can do. + +=Academic materials available online= + +Many colleges and universities use Eiffel to teach "best practices" in software engineering. Often the materials used in courses are available on the worldwide web. For example, the teaching materials for courses at the Swiss Federal Institute of Technology in Zurich are available at [http://se.inf.ethz.ch/courses/ this web address] (warning: old content). + +If you search the web, you can find similar materials at other academic institutions. + + + +=Books= + +To find information about the most up-to-date books about Eiffel, look [[Books about the Eiffel Method and Language|here]]. + +=Examples and sample code= + +Throughout the documentation site, there are many code snippets designed to illustrate certain language features or design principles. For example, the code snippet [[ET: Inheritance#Redefinition|here]] shows the mechanics of redefining an inherited feature. + +In the EiffelStudio distribution you will find a subdirectory "examples" which contains many examples of using Eiffel, primarily with the Eiffel class libraries. + +A third source of examples is the [[Examples]] book in the documentation pages. + +=Eiffel Programming Language Syntax= + +The documentation site includes a summary of the [[Quick reference to the Eiffel programming language|syntax of Eiffel]] the language. This summary is intended to reflect the state of the current official [[ECMA Standard 367|ISO/ECMA Eiffel standard document]]. + +However, usually you will find that there are differences in the syntax supported by EiffelStudio's compiler and that defined in the current standard. The differences between the standard and the EiffelStudio implementation are summarized in the [[EiffelStudio release notes]] and in a [[Differences between standard ECMA-367 and Eiffel Software implementation|documentation page]] that is specific to that purpose. + + + + + diff --git a/documentation/trunk/eiffel/Tutorials/Mini-HowTo/Iterating-on-a-LIST.wiki b/documentation/trunk/eiffel/Tutorials/Mini-HowTo/Iterating-on-a-LIST.wiki index d4306b77..fd0f6819 100644 --- a/documentation/trunk/eiffel/Tutorials/Mini-HowTo/Iterating-on-a-LIST.wiki +++ b/documentation/trunk/eiffel/Tutorials/Mini-HowTo/Iterating-on-a-LIST.wiki @@ -1,4 +1,4 @@ -[[Property:modification_date|Thu, 06 Sep 2018 15:21:39 GMT]] +[[Property:modification_date|Wed, 17 Apr 2019 14:09:18 GMT]] [[Property:publication_date|Thu, 06 Sep 2018 15:17:57 GMT]] [[Property:uuid|96077603-DD2D-4D8C-A486-AF4BD066613A]] [[Property:weight|2000]] @@ -18,7 +18,7 @@ The `across` can be used on every `ITERABLE` object (including `LIST` objects). end -Note that the temporary variable (`ic` in the example) represent an iterator of the `ITERABLE` object, and not directly an element like in many other languages (like the `for` structure in Python for example). +Note that the temporary variable (`ic` in the example) represents an iterator of the `ITERABLE` object, and not directly an element like in many other languages (like the `for` structure in Python for example). === the `from until` loop syntax=== This syntax offer more possibilities than the `across` loop, but is riskier. diff --git a/documentation/trunk/eiffel/Tutorials/Mini-HowTo/Managing-CTRL-C-on-console.wiki b/documentation/trunk/eiffel/Tutorials/Mini-HowTo/Managing-CTRL-C-on-console.wiki index bd2f1204..f1abc49a 100644 --- a/documentation/trunk/eiffel/Tutorials/Mini-HowTo/Managing-CTRL-C-on-console.wiki +++ b/documentation/trunk/eiffel/Tutorials/Mini-HowTo/Managing-CTRL-C-on-console.wiki @@ -1,12 +1,16 @@ +[[Property:modification_date|Wed, 17 Apr 2019 14:06:41 GMT]] +[[Property:publication_date|Wed, 17 Apr 2019 14:02:25 GMT]] [[Property:uuid|5CA34C5D-30F1-4D6F-9FE4-B555E541EA8C]] [[Property:weight|4000]] [[Property:title|Managing CTRL+C in console application]] -Normally, if the user use the CTRL+C keys, the Eiffel application detect it as an error and throw an exception of type OPERATING_SYSTEM_SIGNAL_FAILURE. +Normally, if the user uses the CTRL+C keys, the Eiffel application detect it as an error and throw an exception of type OPERATING_SYSTEM_SIGNAL_FAILURE. -To manage the CTRL+C keys, you can use a rescue clause to detect the exception and a retry mecanism to cancel the exception handeling done by the Eiffel runtime. +To manage the CTRL+C keys, you can use a rescue clause to detect the exception and a retry mechanism to cancel the exception handling done by the Eiffel runtime. To detect the exception, you can inherit from the EXCEPTIONS class and use an attachment test on Exception_manager.last_exception. +Note that this code does not work on Windows. If used on Windows, the application will quit, but the rescue call is not launched. + note description: "Show how to quit an application using CTRL+C (without trace)." diff --git a/documentation/trunk/eiffelstudio/eiffelstudio-reference/compiler/command-line/eiffelstudio-using-command-line-options.wiki b/documentation/trunk/eiffelstudio/eiffelstudio-reference/compiler/command-line/eiffelstudio-using-command-line-options.wiki index 6acdc484..4951fde2 100644 --- a/documentation/trunk/eiffelstudio/eiffelstudio-reference/compiler/command-line/eiffelstudio-using-command-line-options.wiki +++ b/documentation/trunk/eiffelstudio/eiffelstudio-reference/compiler/command-line/eiffelstudio-using-command-line-options.wiki @@ -1,3 +1,5 @@ +[[Property:modification_date|Mon, 24 Dec 2018 08:49:05 GMT]] +[[Property:publication_date|Mon, 24 Dec 2018 08:45:22 GMT]] [[Property:title|EiffelStudio: Using command line options]] [[Property:link_title|Using command line options]] [[Property:weight|1]] @@ -19,8 +21,8 @@ The usage and options display gives you information about which options are vali Usage and options of the command line compiler vary from version to version in order to accommodate new and changed features. Here is an example of the command line help from the latest version of EiffelStudio: - -ISE EiffelStudio version 14.05.9.5158 GPL Edition - win64 + +ISE EiffelStudio version 18.11.10.2549 GPL Edition - win64 Usage: ec [-help | [-compat | -experiment] | -version | -full @@ -40,22 +42,24 @@ Usage: -implementers [-filter filtername] class feature | -callers [-filter filtername] [-show_all] [-assigners | -creators] class feature | -callees [-filter filtername] [-show_all] [-assignees | -creators] class feature | - [[-config config.ecf] [-target target] | - -ace Ace (obsolete) | -project Project_file_name (obsolete)] | + [[-config config.ecf] [-target target] [-config_option option]| [class_file.e [-library library_name]] | -stop | -no_library | -project_path Project_directory_path | -file File | - -code-analysis [-cadefaults | -caloadprefs pref_file | -caclasses class ...] | + -ca_class (-all | class) | -ca_default | -ca_rule rule | -ca_setting file | -gc_stats] Options: default (no option): quick melt the system. - -ace: specify the Ace file (obsolete). -ancestors: show the ancestors of a class. -aversions: show the ancestor versions of a feature. -batch: launch the compilation without user request. -c_compile: launch C compilation if needed. + -ca_class: analyze code of a class or of all non-library classes (-all). + -ca_default: restore default code analyzer preferences. + -ca_rule: activate code analyzer rule(s) (with settings). + -ca_setting: load code analyzer preferences from a file. -callees: show the callees of a feature. -callers: show the callers of a feature. -class_file.e: specify a class file for single file compilation. @@ -63,6 +67,7 @@ Options: -clients: show the clients of a class. -compat: enable pre-attached type compatibility. -config: specify the configuration (ECF) file. + -config_option: override configuration options of a target. -debug: debug the system as a command loop. -descendants: show the descendants of a class. -dversions: show the descendant versions of a feature. @@ -181,31 +186,29 @@ To produce documentation for a view other than ''Text'', use its option in the c ec -flatshort -filter html-stylesheet -all -config application.ecf -==Commands for Eiffel Inspector== -To start the Eiffel Inspector you need to pass the '''-code-analysis''' command line options. If no other options are given, it will analyze the whole system. To specify some preferences, enable specific rules or analyze part of a system, you will need to provide some more options described below: +==Commands for the Code Analyzer== +The Code Analyzer is invoked when an option to analyze the whole system or a particular class is specified in the command line. Additional command-line options are used to specify some preferences and to enable specific rules: - - ec -config project.ecf -code-analysis [-cadefaults | -caloadprefs pref_file | -caclasses "CLASS1 CLASS2" | - -caforcerules "RULE1 (First preference=1, Second preference=2) RULE2"] + + ec -config project.ecf [-ca_class (-all | ) | -ca_default | -ca_rule | -ca_setting ] -; -cadefaults : If provided, all preferences regarding the analysis will be reset to their default values (before the analysis is run). For example this leads to enabling all rules that are enabled by default, no matter whether they have been disabled before. +;-ca_default: Requests to reset all Code Analyzer preferences to their default values before the analysis is run. For example, this enables all rules that are enabled by default, no matter whether they have been disabled before. -; -caloadprefs : Use preferences from ''pref_file'', an XML file containing the code analysis preferences. ''pref_file'' can be generated by exporting the current preferences in the GUI. +;-ca_setting: Requests to use preferences from the specified file. The file is generated by exporting the current preferences from the GUI. -; -caclass : Followed by a list of class names (without file extension ''.e'') of the classes that shall be analyzed. If omitted then the whole system will be analyzed. If more than one class is to be specified, the list must be wrapped in double quotes. The class names can optionally be separated by semicolons ("CLASS1; CLASS2"). +;-ca_class: Asks to analyze a given class or a set of classes. Several class names can be specified, separated either by spaces or semicolons. In that case, the argument may need to be enclosed in double quotes (e.g., `"CLASS1; CLASS2"`). A special value `-all` triggers analysis of the whole system. -; -caforcerules: Followed by a list of rules, enables those rules for the analysis and disables all the others, overriding the current preferences. Specific rule preferences can also be provided in parentheses. Preferences must be separated by commas. The class names can optionally be separated by semicolons. The following example summarizes the syntax of this option: +;-ca_rule: Followed by a list of rules, enables those rules for the analysis and disables all the others, overriding the current preferences. Specific rule preferences can also be provided in parentheses. Preferences are separated by commas. The rule names can optionally be separated by semicolons. Example: - - -caforcerules "RULE1; RULE2 (Maximum length threshold=20, Enable something=False); RULE3" + +-ca_rule "CA001; CA033 (maximum_feature_count=10; maximum_instruction_count=100); CA066 (enforce_prefix=False)" ==Command options== The table below lists the available ''options'', the arguments they require, and their effect: - {| border="1" |- | width="175pt" | '''OPTION''' diff --git a/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-analyzing-results.wiki b/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-analyzing-results.wiki index 0058d695..d1a37323 100644 --- a/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-analyzing-results.wiki +++ b/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-analyzing-results.wiki @@ -1,5 +1,7 @@ -[[Property:title|Eiffel Inspector - Analyzing Results]] -[[Property:link_title|Analyzing Results]] +[[Property:modification_date|Mon, 24 Dec 2018 07:44:49 GMT]] +[[Property:publication_date|Mon, 24 Dec 2018 07:44:49 GMT]] +[[Property:title|Code Analyzer: Interpreting Results]] +[[Property:link_title|Interpreting Results]] [[Property:weight|-13]] [[Property:uuid|e4670791-7885-b9a0-6a1c-0d9611eb5f5d]] = Sorting and Filtering = diff --git a/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-customization.wiki b/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-customization.wiki index 87b4daf5..e3973ec7 100644 --- a/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-customization.wiki +++ b/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-customization.wiki @@ -1,10 +1,12 @@ -[[Property:title|Eiffel Inspector - Customization]] +[[Property:modification_date|Mon, 24 Dec 2018 07:52:18 GMT]] +[[Property:publication_date|Mon, 24 Dec 2018 07:52:18 GMT]] +[[Property:title|Code Analyzer: Customization]] [[Property:link_title|Customization]] [[Property:weight|-12]] [[Property:uuid|ed86093e-fed0-04b8-6fd4-b05d5de849fc]] = General Preferences = -The ''Preferences'' button in the toolbar opens a dialog containing all preferences for the Eiffel Inspector. There you can enable and disable all rules of a certain severity, you can choose colors for the results, and there are many preferences that control the behavior of individual rules. +The ''Preferences'' button in the toolbar opens a dialog containing all preferences for the Code Analyzer. There you can enable and disable all rules of a certain severity, you can choose colors for the results, and there are many preferences that control the behavior of individual rules. [[Image:CA Preference Dialog|center|640px|Preferences]] @@ -18,15 +20,15 @@ The rule-specific preferences are located in the ''Rules'' subfolder. Two prefer Using the buttons in the preferences dialog one can export these preferences to an XML file or import them. This can be used for creating profiles that stretch across multiple machines. Just set the desired preferences on one machine, export them to a file, distribute this file, and import it. -{{note| The Eiffel Inspector preferences are separate from the general EiffelStudio preferences. Pressing ''Restore Defaults'', ''Import ...'', or ''Export ...'' ''only'' affects preferences for the Eiffel Inspector.''}} +{{note| The Code Analyzer preferences are separate from the general EiffelStudio preferences. Pressing ''Restore Defaults'', ''Import ...'', or ''Export ...'' ''only'' affects preferences for the Code Analyzer.''}} = Class Options = -There are cases in which you might want to customize the Eiffel Inspector for ''parts of your code'' only. The Eiffel Inspector provides a way to set options ''per class''. You can exclude a class from being checked by certain rules. Also you can declare a class to be a ''library'' or a ''non-library'' class. All class-wide options for the Eiffel Inspector are set in the ''note clause'' (after the note keyword). +There are cases in which you might want to customize the Code Analyzer for ''parts of your code'' only. The Code Analyzer provides a way to set options ''per class''. You can exclude a class from being checked by certain rules. Also you can declare a class to be a ''library'' or a ''non-library'' class. All class-wide options for the Code Analyzer are set in the ''note clause'' (after the note keyword). == Library and Non-Library Classes == -If the programmer uses the default values then a rule checks all classes. But a rule can be defined (hard-coded) not to check either ''library'' or ''non-library'' classes. How does the Eiffel Inspector now know which classes are ''library'' classes and which classes are ''non-library'' classes? This is defined by the user. If, for a certain class, the user does ''not'' define anything then the class will be analyzed in every case. Only if the user declares a class to be a ''library'' class then this class will not be checked by a rule that has disabled checking library classes. The same goes for classes that are declared as ''non-library''. +If the programmer uses the default values then a rule checks all classes. But a rule can be defined (hard-coded) not to check either ''library'' or ''non-library'' classes. How does the Code Analyzer now know which classes are ''library'' classes and which classes are ''non-library'' classes? This is defined by the user. If, for a certain class, the user does ''not'' define anything then the class will be analyzed in every case. Only if the user declares a class to be a ''library'' class then this class will not be checked by a rule that has disabled checking library classes. The same goes for classes that are declared as ''non-library''. * To declare a class to be a ''library'' class add ca_library : "true" to the (top or bottom) indexing clause. * To declare a class to be a ''non-library'' class add ca_library : "false" to the (top or bottom) indexing clause. diff --git a/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-rules/index.wiki b/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-rules/index.wiki index 79d4d5b3..7fd1735a 100644 --- a/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-rules/index.wiki +++ b/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-rules/index.wiki @@ -1,4 +1,6 @@ -[[Property:title|Eiffel Inspector - Rules]] +[[Property:modification_date|Mon, 24 Dec 2018 07:54:57 GMT]] +[[Property:publication_date|Mon, 24 Dec 2018 07:54:57 GMT]] +[[Property:title|Code Analyzer: Rules]] [[Property:link_title|Rules]] [[Property:weight|15]] [[Property:uuid|109ca62a-212d-8a85-eea8-ddf0f89177a1]] diff --git a/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-running-analyzer.wiki b/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-running-analyzer.wiki index 45cac042..02a8d2f6 100644 --- a/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-running-analyzer.wiki +++ b/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-running-analyzer.wiki @@ -1,13 +1,15 @@ -[[Property:title|Eiffel Inspector - Running the Analyzer]] +[[Property:modification_date|Mon, 24 Dec 2018 07:41:32 GMT]] +[[Property:publication_date|Mon, 24 Dec 2018 07:41:32 GMT]] +[[Property:title|Running the Code Analyzer]] [[Property:link_title|Running the Analyzer]] [[Property:weight|-14]] [[Property:uuid|d672c769-57fb-6b87-2781-83daff3ab9e7]] = General = -There are several different ways of running the Eiffel Inspector. Most importantly, you can select the scope of the analysis. For example it is possible to analyze a single class, a cluster or a whole system. Also for the same scope there are different ways of running the analyzer depending on your personal preferences. To perform the analysis the Eiffel system which will be analyzed must compile without any error. +There are several different ways of running the Code Analyzer. Most importantly, you can select the scope of the analysis. For example it is possible to analyze a single class, a cluster or a whole system. Also for the same scope there are different ways of running the analyzer depending on your personal preferences. To perform the analysis the Eiffel system which will be analyzed must compile without any error. -There are two ways of running the Eiffel Inspector -# Using the GUI, the Eiffel Inspector Tool appears as a panel. The panel is mainly used for displaying analysis results. The command to perform the analysis can be found not only in the panel but also in various context menus making it easy to analyze specific classes or sets of classes. +There are two ways of running the Code Analyzer +# Using the GUI, the Code Analyzer Tool appears as a panel. The panel is mainly used for displaying analysis results. The command to perform the analysis can be found not only in the panel but also in various context menus making it easy to analyze specific classes or sets of classes. # Using command-line arguments with the command-line version of EiffelStudio. The system is compiled (if necessary) and then analyzed. The output of the analysis will be directed to the terminal window. = GUI = @@ -25,13 +27,13 @@ Left-clicking the '''Analyze Item''' button in the toolbar will start an analysi === Any Class === There are two ways of analyzing an arbitrary class (either from your system or from a library): -* Right-click on a class name and select '''Run Eiffel Inspector on Class...''' from the context menu: +* Right-click on a class name and select '''Analyze Class...''' from the context menu: [[Image:CA Class Context Menu|center|371px|Class Context Menu]] * Pick a class and drop it on the '''Analyze Item''' button. === Clusters === To analyze a cluster there are two possibilities, like for classes: -* You can either right-click the cluster and select '''Run Eiffel Inspector on cluster''' from the context menu: +* You can either right-click the cluster and select '''Analyze cluster''' from the context menu: [[Image:CA Cluster Context Menu|center|247px|Cluster Context Menu]] * Pick a cluster and drop it on the '''Analyze Item''' button. @@ -40,7 +42,7 @@ Not only clusters but any other elements of a project (such as a library) can be =Command Line= -The Eiffel Inspector is also available from the EiffelStudio command line compiler by using the '''-code-analysis''' command. The results will be displayed in the terminal window or to a file. +The Code Analyzer is also available from the EiffelStudio command line compiler by using the '''-code-analysis''' command. The results will be displayed in the terminal window or to a file. == Execution / Command Line Options == @@ -49,7 +51,7 @@ The following command will perform a code analysis: ec.exe -config project.ecf -code-analysis [-cadefaults] [-caloadprefs ''preffile''] [-caclass ''CLASS1 CLASS2 ...''] [-caforcerules "RULE1 (First preference=1, Second preference=2) RULE2"] -The arguments in brackets are optional. For a complete description of the Eiffel inspector command line options see [[EiffelStudio: Using command line options|Using command line compiler options]]. +The arguments in brackets are optional. For a complete description of the Code Analyzer command line options see [[EiffelStudio: Using command line options|Using command line compiler options]]. EiffelStudio will try to compile the system if needed. The analysis will only work with syntactically correct code and a compiled system. Should the compilation fail, EiffelStudio will abort and the analysis will not start. @@ -58,7 +60,7 @@ Upon a successful compilation either the whole system or the classes mentioned i As soon as everything needed has been analyzed the results will be displayed as a list of rule violations. These rule violations are sorted by class and by location. In addition to the name of the violated rule and the rule ID, a description of the concrete violation will be displayed as well. -[[Image:Eiffel Inspector Command Line|center|877px|Eiffel Inspector - Command Line]] +[[Image:Eiffel Inspector Command Line|center|877px|Code Analyzer - Command Line]] === Output to file === diff --git a/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/Release-notes-for-EiffelStudio-18.11.wiki b/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/Release-notes-for-EiffelStudio-18.11.wiki index 696299e4..d4dbd21d 100644 --- a/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/Release-notes-for-EiffelStudio-18.11.wiki +++ b/documentation/trunk/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/Release-notes-for-EiffelStudio-18.11.wiki @@ -1,4 +1,4 @@ -[[Property:modification_date|Fri, 07 Dec 2018 13:53:20 GMT]] +[[Property:modification_date|Fri, 04 Jan 2019 15:52:42 GMT]] [[Property:publication_date|Mon, 26 Nov 2018 10:45:37 GMT]] [[Property:uuid|4452B417-C538-49AF-960F-C3C2473A3AF8]] [[Property:title|Release notes for EiffelStudio 18.11]] @@ -23,14 +23,14 @@ * Several code-generation and run-time bugs are fixed. ==Libraries== -* All container classes are now `ITERABLE` that allows for iterating over them with the `across` loop and simplifies conversions between different types of containers. {{Inline-Warning|Potential incompatibility}} for descendant classes that did not implement`new_cursor`. -* `duplicate`, `duplicate_all` and related features of container classes are now obsolete to simplify inheritance from these classes in the future. The affected effective classes now have the feature `make_from_iterable`. +* All container classes are now ITERABLE that allows for iterating over them with the across loop and simplifies conversions between different types of containers. {{Inline-Warning|Potential incompatibility}} for descendant classes that did not implement new_cursor. +* duplicate, duplicate_all and related features of container classes are now obsolete to simplify inheritance from these classes in the future. The affected effective classes now have the feature make_from_iterable. * Figures in Vision can be drawn with anti-aliasing (on Windows). -* `HASH_TABLE` now takes arguments of type `G` instead of `detachable G` and introduces a feature `definite_item` of type `G` (in addition to the existing feature `item` of type `detachable G`). +* HASH_TABLE now takes arguments of type G instead of detachable G and introduces a feature definite_item of type G (in addition to the existing feature item of type detachable G). * OpenSSL binding uses OpenSSL 1.1.1a and supports new asymmetric algorithms (RSA). * JWT (JSON Web Token) supports custom JWT algorithms. The associated extension library provides RSA signing algorithms. * Performance of the JSON parser is improved by 40% on large regular files. -* The new function `JSON_VALUE.chained_item (a_key): JSON_VALUE` allows for expressions `json @ "person" @ "address" @ "city" ` to get associated JSON value. +* The new function JSON_VALUE.chained_item (a_key): JSON_VALUE allows for expressions json @ "person" @ "address" @ "city" to get associated JSON value. * ''ROC CMS'' implements protection against cross-site scripting attacks. * ''EiffelWeb'' adopts nanoseconds timeout precision and supports suffixes ns, us, ms, s for the standalone connector in the initialization file. * ''EiffelWeb'' correctly uses the setting socket.timeout for ''httpd'' (before the misuse of the setting caused high CPU usage for WebSocket). @@ -40,7 +40,7 @@ * Code analyzer does not report false positives for the rules about an unread variable (CA020) and replacement of a regular loop with an iterative form (CA024). ==Examples== -* `processor_pool` demonstrates how a pool of active SCOOP processors can be used to execute tasks from passive regions. +* processor_pool demonstrates how a pool of active SCOOP processors can be used to execute tasks from passive regions. ---- -See [https://dev.eiffel.com/EiffelStudio_18.11_Releases change log] for more details. \ No newline at end of file +See [https://dev.eiffel.com/EiffelStudio_18.11_Releases change log] for more details. diff --git a/documentation/trunk/index.wiki b/documentation/trunk/index.wiki index 7b2a8def..696a02c8 100644 --- a/documentation/trunk/index.wiki +++ b/documentation/trunk/index.wiki @@ -1,4 +1,4 @@ -[[Property:modification_date|Mon, 24 Sep 2018 13:20:40 GMT]] +[[Property:modification_date|Sat, 19 Jan 2019 15:46:52 GMT]] [[Property:publication_date|Thu, 06 Sep 2018 15:10:13 GMT]] [[Property:title|Documentation]] [[Property:description|Central repository of information about Eiffel and the products and technologies of Eiffel Software]] @@ -18,10 +18,10 @@ This is the Eiffel documentation site, with a wealth of resources on how to unle ** [[EiffelStudio tutorials]] ** [[Technical papers about EiffelStudio|Technical papers]] on specific concepts and tools * [[Solutions]]. EiffelStudio comes with numerous libraries, packages, and tools. The Solutions book includes: -** Libraries: data structures, graphics, networking... +** Libraries: data structures, graphics, concurrency (SCOOP), networking... ** Packages ** Tools * [[Glossary]]: clear definitions of the concepts underlying Eiffel: feature, routine, attribute, contract... * [[FAQ]]: everything you always wanted to ask about Eiffel. -A number of sites outside of eiffel.org contain useful Eiffel resources. You can find a partial list [/contribute here]. +A number of sites outside of eiffel.org contain useful Eiffel resources. You can find a partial list on the [https://www.eiffel.org/contribute "contribute" page]. diff --git a/documentation/trunk/solutions/concurrent-computing/SCOOP_tutorial.wiki b/documentation/trunk/solutions/concurrent-computing/SCOOP_tutorial.wiki index 2e6a0464..9493420e 100644 --- a/documentation/trunk/solutions/concurrent-computing/SCOOP_tutorial.wiki +++ b/documentation/trunk/solutions/concurrent-computing/SCOOP_tutorial.wiki @@ -1,7 +1,16 @@ -[[Property:modification_date|Fri, 30 Nov 2018 20:17:44 GMT]] +[[Property:modification_date|Sun, 20 Jan 2019 12:52:42 GMT]] [[Property:publication_date|Mon, 26 Nov 2018 12:09:44 GMT]] [[Property:uuid|FF51774B-2EB9-4EDF-8A0C-0F71A96D391F]] [[Property:weight|0]] [[Property:title|SCOOP_tutorial]] -[[Property:link_title|SCOOP Tutorial: a small concurrent email system]] -The text of this tutorial will be available on 2 December 2018 (sorry for the delay but please come back!). \ No newline at end of file +[[Property:link_title|SCOOP Tutorial (hands-on): a small concurrent email system]] + +This tutorial comes with a full-fledged example: a simple email client system. It is hands-on, inviting you to look at the code of the sequential version of the system, then guiding you step-by-step to make it concurrent, and hence much nicer to use. + +The Eiffel compiler helps you through out: at each step of the transformation from sequential to concurrent, the error messages tell you what remains to be done. + +For reading convenience the tutorial is in PDF format. It includes all the links to the code to be downloaded. + +Read the tutorial by clicking [https://www.eiffel.org/files/uploads/scoop_tutorial_%282%29.pdf this link]. + +You should also note the [https://learning.acm.org/webinars/coop ACM webinar on SCOOP] which relies on this example to provide a general introduction to SCOOP. \ No newline at end of file diff --git a/documentation/trunk/solutions/concurrent-computing/index.wiki b/documentation/trunk/solutions/concurrent-computing/index.wiki index 48f2e776..683c4751 100644 --- a/documentation/trunk/solutions/concurrent-computing/index.wiki +++ b/documentation/trunk/solutions/concurrent-computing/index.wiki @@ -1,4 +1,4 @@ -[[Property:modification_date|Tue, 20 Nov 2018 12:44:24 GMT]] +[[Property:modification_date|Sat, 19 Jan 2019 20:11:49 GMT]] [[Property:publication_date|Tue, 20 Nov 2018 12:44:24 GMT]] [[Property:link_title|Concurrency]] [[Property:title|Concurrency]] @@ -18,6 +18,7 @@ In most programming languages, the way to obtain threaded applications is to rel Thread libraries are at a lower level of abstraction than modern programming languages, requiring you to manage the interaction of threads manually through such techniques as mutual exclusion semaphores. Eiffel offers a higher-level mechanism: [[SCOOP]] (Simple Concurrent Object-Oriented Programming), which greatly simplifies the writing of concurrent applications and avoids many of the typical pitfalls of concurrency such as "data races". SCOOP is the recommended approach to concurrent Eiffel programming. For details see: +* [[SCOOP_tutorial|SCOOP tutorial (hands-on)]]: build a small concurrent email system, step by step. * The [[SCOOP|SCOOP documentation]] for the recommended approach to concurrent programming in Eiffel. * The [[EiffelThreads|EiffelThreads documentation]] if you need to exert fine control on the execution and synchronization of threads. diff --git a/documentation/trunk/solutions/database-access/eiffelstore/EiffelStore-ODBC-with-PostgreSQL.wiki b/documentation/trunk/solutions/database-access/eiffelstore/EiffelStore-ODBC-with-PostgreSQL.wiki index 0edc7cb9..41c348fa 100644 --- a/documentation/trunk/solutions/database-access/eiffelstore/EiffelStore-ODBC-with-PostgreSQL.wiki +++ b/documentation/trunk/solutions/database-access/eiffelstore/EiffelStore-ODBC-with-PostgreSQL.wiki @@ -1,4 +1,4 @@ -[[Property:modification_date|Thu, 18 Oct 2018 15:19:06 GMT]] +[[Property:modification_date|Tue, 05 Feb 2019 11:19:29 GMT]] [[Property:publication_date|Mon, 24 Sep 2018 12:04:18 GMT]] [[Property:uuid|6F78A05A-2054-4150-84FC-1D8663CA76E6]] [[Property:weight|5]] @@ -6,7 +6,7 @@ [[Property:link_title|EiffelStore ODBC]] The following steps describe how to check the EiffelStudio installation and the required dependencies to use EiffelStore ODBC with PostgreSQL. The steps are also useful for other databases such as MySQL (for which you will to install the MySQL ODBC driver). -{{note|For this documentation, tests used Ubuntu 18.04 64 bits and EiffelStudio 18.07 64 bits. }} +{{note|For this documentation, tests used Ubuntu 18.04 64 bits and EiffelStudio 18.07 64 bits / Debian 9 and EiffelStudio 18.11 64 bits. }} * '''Install EiffelStudio''' From here on, $YOUR_INSTALLATION_PATH denotes the path name of the EiffelStudio installation. @@ -143,9 +143,9 @@ encoding name too long * '''Compile C code of the Eiffel library store:''' -cd $YOUR_INSTALLATION_PATH/library/store/dbms/rdbms/odbc/Clib finish_freezing -library +cd $ISE_EIFFEL/library/store/dbms/rdbms/odbc/Clib; finish_freezing -library -{{note|On debian at least before finish_freezing log in as superuser doing a '''sudo -i''' }} +{{note|On debian at least before finish_freezing log in as superuser doing a '''sudo -i''' depending on the right and user setted for $ISE_EIFFEL/Eiffel_18.07 directory }} * '''Open EiffelStudio eSQL example and run it''' The example is located on `$ISE_EIFFEL/examples/store/esql/` diff --git a/documentation/trunk/solutions/gui-building/eiffelbuild/eiffelbuild-reference/builder-window.wiki b/documentation/trunk/solutions/gui-building/eiffelbuild/eiffelbuild-reference/builder-window.wiki index 33887ab8..6a7758bf 100644 --- a/documentation/trunk/solutions/gui-building/eiffelbuild/eiffelbuild-reference/builder-window.wiki +++ b/documentation/trunk/solutions/gui-building/eiffelbuild/eiffelbuild-reference/builder-window.wiki @@ -1,26 +1,28 @@ +[[Property:modification_date|Sat, 06 Apr 2019 15:49:27 GMT]] +[[Property:publication_date|Sat, 06 Apr 2019 15:49:27 GMT]] [[Property:title|Builder window]] [[Property:weight|7]] [[Property:uuid|e82ca336-cab6-bc60-6ddc-b359a7c86811]] The Builder window provides a view of the [[EiffelBuild Notation|objects]] in your system, in which the [[EiffelBuild Notation|objects]] may be manipulated. -This window may either be shown or hidden (default). To change between these two states, click [[Image:icon-builder-window-color]] on the [[Main toolbar| main toolbar]] , or select '''Show/Hide builder window''' from the '''View''' menu. +This window may either be shown or hidden (default). To change between these two states, click [[Image:icon-builder-window-color]] on the [[Main toolbar| main toolbar]], or select '''Show/Hide builder window''' from the '''View''' menu. [[Image:builder-window]] The content of this window is a representation of the [[EiffelBuild Notation|objects]] you have defined in your project. Each [[EiffelBuild Notation|object]] is represented by the [[EiffelVision Introduction|EiffelVision 2]] control matching its type. For example, an [[EiffelBuild Notation|object]] representing an EV_BUTTON will be displayed in here using an EV_BUTTON. As this view provides direct access to the objects ( [[EiffelBuild Notation|Pick]] any of the controls in this window), it enables you to build your interface within a view which provides rich visual feedback. -Because this window is just a view of the [[EiffelBuild Notation|objects]] , it will be always synchronized with the [[Layout constructor| layout constructor]] . This means you can [[Reparent an Object| re-parent objects]] , using the [[EiffelBuild Notation|pick and drop]] transport method, seamlessly between the two views.
+Because this window is just a view of the [[EiffelBuild Notation|objects]], it will be always synchronized with the [[Layout constructor| layout constructor]] . This means you can [[Reparent an Object| re-parent objects]] , using the [[EiffelBuild Notation|pick and drop]] transport method, seamlessly between the two views.
{{note|Holding Ctrl while right clicking on an [[EiffelBuild Notation|object]] in the Builder Window creates a new [[Object editor|object editor]] targeted to the [[EiffelBuild Notation|object]] . Holding Ctrl and Shift while right clicking on an [[EiffelBuild Notation|object]] , highlights it within the [[Layout constructor|layout constructor]] .}} ==Visual Differences== -Although the builder window attempts to show you the interface you are developing, it is not a completely accurate representation (Unlike the [[Display window|display window]] ). The main difference is that all [[EiffelBuild Notation|objects]] representing descendents of EV_CONTAINER are parented in a frame. This was implemented so that you would be able to easily manipulate the containers. +Although the builder window attempts to show you the interface you are developing, it is not a completely accurate representation (Unlike the [[Display window|display window]] ). The main difference is that all [[EiffelBuild Notation|objects]] representing descendants of EV_CONTAINER are parented in a frame. This was implemented so that you would be able to easily manipulate the containers. Imagine that this was not the case, and each container [[EiffelBuild Notation|object]] was just represented by an [[EiffelVision Introduction|EiffelVision 2]] object matching its type. Because these containers have no visible screen space when filled with children, manipulation of them would have been difficult, and the functionality of this view would be compromised. In the screenshot above, you can see that there are two [[EiffelBuild Notation|objects]] representing containers in your project, an EV_VERTICAL_BOX, and an EV_HORIZONTAL_BOX (Excluding the EV_TITLED_WINDOW [[EiffelBuild Notation|object]] represented by this window). -The properties of the [[EiffelBuild Notation|objects]] in you system are always reflected in this window, with a few exceptions: +The properties of the [[EiffelBuild Notation|objects]] in your system are always reflected in this window, with a few exceptions: * `user_can_resize`, `maximum_width`, `maximum_height` and `title_string` are not reflected in this window. * `minimum_width` and `minimum_height` are not reflected in any of the controls representing [[EiffelBuild Notation|objects]] within this window. diff --git a/documentation/trunk/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/inheritance.wiki b/documentation/trunk/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/inheritance.wiki index e081c166..4fc2dde0 100644 --- a/documentation/trunk/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/inheritance.wiki +++ b/documentation/trunk/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/inheritance.wiki @@ -1,3 +1,5 @@ +[[Property:modification_date|Sat, 12 Jan 2019 18:39:06 GMT]] +[[Property:publication_date|Sat, 12 Jan 2019 18:34:23 GMT]] [[Property:title|Inheritance]] [[Property:weight|3]] [[Property:uuid|7e4cb7ba-fda6-8eac-3e27-bbb8fafd8673]] @@ -120,7 +122,7 @@ inherit extend, force, is_inserted - redefine + redefine duplicate, linear_representation select @@ -200,7 +202,7 @@ So, in this example the implementation for linear_representation, f remove
-The select part is used only under special circumstances. The case in which select is required involves a situation called "repeated" inheritance. Repeated inheritance occurs when an heir inherits more than once from the same ancestor. Usually this means it has two or more parents who have a common proper ancestor (but it can occur directly). The features from the common ancestor are inherited by each of the parents and passed on to the heir. The rules and effects of repeated inheritance occupy an entire chapter in the official Eiffel programming language reference and will not be reproduced here. Justunderstand at this point that it is sometimes necessary to use select to provide the dynamic binding system with an unambiguous choice of features in the presence of polymorphic attachment. +The select part is used only under special circumstances. The case in which select is required involves a situation called "repeated" inheritance. Repeated inheritance occurs when an heir inherits more than once from the same ancestor. Usually this means it has two or more parents who have a common proper ancestor (but it can occur directly). The features from the common ancestor are inherited by each of the parents and passed on to the heir. The rules and effects of repeated inheritance occupy an entire chapter in the official Eiffel programming language reference and will not be reproduced here. Just understand at this point that it is sometimes necessary to use select to provide the dynamic binding system with an unambiguous choice of features in the presence of polymorphic attachment. You should note also that repeated inheritance can and does occur often without causing any problem at all. In fact it happens in every case of multiple inheritance, due to the fact that all classes inherit from class ANY and receive its features as a result. The reason it is not a problem is that in the case that any feature makes it from the original common ancestor along multiple paths to the heir with its name and implementation still intact, it will arrive as only one feature heir. This is called sharing and nothing special needs to be done to make it happen.