blob: 08d835213b042ae43eb93cb2af3824f16a25d366 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 1.5.5">
<meta name="author" content="2019-08-08 13:15:33 CEST">
<title>N4JS IDE Specification</title>
<link rel="stylesheet" href="styles/spec.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font-awesome.min.css">
<!-- ************* docinfo ******************************************************************* -->
<!-- ************* Favicon ************-->
<link rel="icon" href="images/favicon.ico" />
<!-- ************* Back-to-top JQuery ************* -->
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.js"></script>
<link href="styles/prism.min.css" rel="stylesheet" />
<script type="text/javascript" async
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML">
</script>
<!-- ************* Styles ************* -->
<link rel="stylesheet" type="text/css" href="styles/n4jsspec-adoc.css">
<!-- ****************** NavBar ****************** -->
<div id="menubar">
<div class="banner">
<a href="https://www.eclipse.org/n4js/#"><img id="logo" src="images/n4js-logo.png" alt="Eclipse N4JS"></a>
</div>
<ul>
<li><a href="index.html">Index</a></li>
</ul>
</div>
<!-- ************* docinfo ******************************************************************* -->
<style>
.admonitionblock td.icon .icon-todo:before{content:"\f249";color:#f4ee42}
</style>
</head>
<body class="book toc2 toc-left">
<div id="header">
<h1>N4JS IDE Specification</h1>
<div class="details">
<span id="author" class="author">2019-08-08 13:15:33 CEST</span><br>
<span id="revnumber">version 0.9</span>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#sec:Views">1. Views</a>
<ul class="sectlevel2">
<li><a href="#_eclipse-standard-views">1.1. Eclipse Standard Views</a>
<ul class="sectlevel3">
<li><a href="#sec:Project_Explorer_View">1.1.1. Project Explorer</a></li>
<li><a href="#sec:Outline_View">1.1.2. Outline</a></li>
<li><a href="#sec:Problems_View">1.1.3. Problems</a></li>
<li><a href="#sec:Console_View">1.1.4. Console</a></li>
<li><a href="#sec:History_View">1.1.5. History</a></li>
<li><a href="#sec:Error_Log_View">1.1.6. Error Log</a></li>
</ul>
</li>
<li><a href="#_n4js-specific-views">1.2. N4JS Specific Views</a>
<ul class="sectlevel3">
<li><a href="#_test-results">1.2.1. Test Results</a></li>
<li><a href="#_source-graphs">1.2.2. Source Graphs</a></li>
<li><a href="#_api-compare">1.2.3. API Compare</a></li>
<li><a href="#_performance-graphs">1.2.4. Performance Graphs</a></li>
<li><a href="#_source-mapping">1.2.5. Source Mapping</a></li>
<li><a href="#_xpect-view">1.2.6. Xpect View</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_navigation">2. Navigation</a>
<ul class="sectlevel2">
<li><a href="#sec:Outline_Navigation">2.1. Outline</a>
<ul class="sectlevel3">
<li><a href="#_quick-outline">2.1.1. Quick Outline</a></li>
<li><a href="#_normal-outline">2.1.2. Normal Outline</a></li>
</ul>
</li>
<li><a href="#_navigation-commands">2.2. Navigation Commands</a>
<ul class="sectlevel3">
<li><a href="#sec:Navigate_to_Declaration">2.2.1. Navigate to Declaration</a></li>
<li><a href="#sec:find_by_references">2.2.2. Find by References</a></li>
<li><a href="#sec:Open_Type_Declaration">2.2.3. Open Type Declaration</a></li>
</ul>
</li>
<li><a href="#sec:Working_Sets">2.3. Working Sets</a>
<ul class="sectlevel3">
<li><a href="#sec:Working_Set_Managers">2.3.1. Working Set Managers</a></li>
<li><a href="#sec:Working_Set_Constraints">2.3.2. Working Set Constraints</a></li>
<li><a href="#sec:Manual_Association_Working_Set_Manager_UI_Features">2.3.3. Manual Association Working Set Manager - UI Features</a></li>
<li><a href="#sec:Project_Name_Filter_Working_Set_Manager">2.3.4. Project Name Filter Working Set Manager</a></li>
<li><a href="#sec:Git_Repository_Working_Set_Manager">2.3.5. Git Repository Working Set Manager</a></li>
<li><a href="#sec:Project_Location_Working_Set_Manager">2.3.6. Project Location Working Set Manager</a></li>
<li><a href="#sec:N4JS_Project_Type_Working_Set_Manager">2.3.7. N4JS Project Type Working Set Manager</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_assistance">3. Assistance</a>
<ul class="sectlevel2">
<li><a href="#sec:Content_Assist">3.1. Content Assist</a>
<ul class="sectlevel3">
<li><a href="#sec:Complete_Keywords">3.1.1. Complete Keywords</a></li>
<li><a href="#sec:Complete_Annotations">3.1.2. Complete Annotations</a></li>
<li><a href="#sec:Complete_Identifier_Reference">3.1.3. Complete Identifier Reference</a></li>
<li><a href="#sec:Complete_Member_Overrides">3.1.4. Complete Member Overrides</a></li>
<li><a href="#sec:Constructor_Completion">3.1.5. Constructor Completion</a></li>
<li><a href="#sec:Complete_Function_Expression">3.1.6. Complete Function Expression with Known Type</a></li>
<li><a href="#sec:Complete_Variable_and_Parameter_Names">3.1.7. Complete Variable and Parameter Names</a></li>
</ul>
</li>
<li><a href="#sec:Quick_Fixes">3.2. Quick Fixes</a>
<ul class="sectlevel3">
<li><a href="#sec:N4JS_Issue_Properties">3.2.1. N4JS Issue User data</a></li>
<li><a href="#sec:N4JS_Issue_Fixes">3.2.2. N4JS Issue Fixes</a>
<ul class="sectlevel4">
<li><a href="#sec:Linking_Issues">3.2.2.1. Linking Issues</a></li>
<li><a href="#sec:Import_Issues">3.2.2.2. Import Issues</a></li>
<li><a href="#sec:Visibility_Issues">3.2.2.3. Visibility Issues</a></li>
<li><a href="#sec:Classifier_Issues">3.2.2.4. Classifier Issues</a></li>
<li><a href="#sec:Function_Issues">3.2.2.5. Function Issues</a></li>
<li><a href="#sec:Syntax_Issues">3.2.2.6. Syntax Issues</a></li>
<li><a href="#sec:Conversion_Issues">3.2.2.7. Conversion Issues</a></li>
<li><a href="#sec:Type_Issues">3.2.2.8. Type Issues</a></li>
<li><a href="#sec:Expression_Issues">3.2.2.9. Expression Issues</a></li>
<li><a href="#sec:Super_Keyword_Issues">3.2.2.10. Super Keyword Issues</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#sec:Quick_Assist">3.3. Quick Assist</a></li>
<li><a href="#sec:Cleanup_Operations">3.4. Cleanup Operations</a>
<ul class="sectlevel3">
<li><a href="#sec:Formatting">3.4.1. Formatting</a></li>
<li><a href="#sec:Organize_Imports">3.4.2. Organize Imports</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_wizards">4. Wizards</a>
<ul class="sectlevel2">
<li><a href="#sec:N4JS_Project_Wizard">4.1. N4JS Project Wizard</a></li>
<li><a href="#sec:Empty_N4JS_File">4.2. Empty N4JS File</a></li>
<li><a href="#sec:Empty_JS_File">4.3. Empty JS File</a>
<ul class="sectlevel3">
<li><a href="#sec:N4JS_Class_File_Wizard">4.3.1. N4JS Class Wizard</a></li>
<li><a href="#field-properties">4.3.2. Field Properties</a></li>
<li><a href="#visibility-issues-or-final-super-classes">4.3.3. Visibility issues or <code>@Final</code> super classes</a></li>
<li><a href="#generation-1">4.3.4. Generation</a></li>
<li><a href="#preview-1">4.3.5. Preview</a></li>
</ul>
</li>
<li><a href="#sec:N4JS_Interface_Wizard">4.4. Interface Wizard</a>
<ul class="sectlevel3">
<li><a href="#field-properties-1">4.4.1. Field Properties</a></li>
<li><a href="#visibility-issues">4.4.2. Visibility Issues</a></li>
<li><a href="#import-naming-conflicts">4.4.3. Import naming conflicts</a></li>
<li><a href="#generation-2">4.4.4. Generation</a></li>
<li><a href="#preview-2">4.4.5. Preview</a></li>
</ul>
</li>
<li><a href="#sec:N4JS_Enum_File_Wizard">4.5. Enum Wizard</a>
<ul class="sectlevel3">
<li><a href="#field-properties-2">4.5.1. Field Properties</a></li>
<li><a href="#generation-3">4.5.2. Generation</a></li>
<li><a href="#preview-3">4.5.3. Preview</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_execution-support">5. Execution Support</a>
<ul class="sectlevel2">
<li><a href="#sec:Non_UI_Execution">5.1. Non-UI Execution</a>
<ul class="sectlevel3">
<li><a href="#sec:Non_UI_Debugging">5.1.1. Non-UI Debugging</a></li>
</ul>
</li>
<li><a href="#sec:UI_Execution">5.2. UI Execution</a></li>
</ul>
</li>
<li><a href="#_test-support">6. Test Support</a>
<ul class="sectlevel2">
<li><a href="#sec:N4JS_Mangelhaft_support">6.1. N4JS Mangelhaft support</a>
<ul class="sectlevel3">
<li><a href="#sec:Asynchronous_Tests">6.1.1. Asynchronous Tests, Test Isolation and Timeouts</a></li>
<li><a href="#sec:Supported_xUnit_API">6.1.2. Supported xUnit API</a>
<ul class="sectlevel4">
<li><a href="#sec:Test_Group">6.1.2.1. Test Group</a></li>
<li><a href="#sec:Test_Method">6.1.2.2. Test Method</a></li>
<li><a href="#sec:BeforeAll">6.1.2.3. BeforeAll Setup</a></li>
<li><a href="#sec:Before_Setup">6.1.2.4. Before Setup</a></li>
<li><a href="#sec:After_Teardown">6.1.2.5. After Teardown</a></li>
<li><a href="#sec:AfterAll_Teardown">6.1.2.6. AfterAll Teardown</a></li>
<li><a href="#sec:Test_Ignore">6.1.2.7. Test Ignore</a></li>
<li><a href="#sec:Timeout">6.1.2.8. Timeout</a></li>
<li><a href="#sec:Description">6.1.2.9. Description</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#sec:Test_Reporting">6.2. Test Reporting</a>
<ul class="sectlevel3">
<li><a href="#sec:Test_Messages">6.2.1. Test Messages</a>
<ul class="sectlevel4">
<li><a href="#_test-case-ids">6.2.1.1. Test Case IDs</a></li>
<li><a href="#sec:Start_Session">6.2.1.2. Start Session</a></li>
<li><a href="#sec:Ping_Session">6.2.1.3. Ping Session</a></li>
<li><a href="#sec:End_Session">6.2.1.4. End Session</a></li>
<li><a href="#sec:Start_Test">6.2.1.5. Start Test</a></li>
<li><a href="#sec:End_Test">6.2.1.6. End Test</a></li>
<li><a href="#sec:Ping_Test">6.2.1.7. Ping Test</a></li>
<li><a href="#sec:Test_Catalog">6.2.1.8. Test Catalog</a></li>
<li><a href="#sec:Test_Session_Example">6.2.1.9. Test Session Example</a></li>
</ul>
</li>
<li><a href="#sec:Test_Runtime_Configuration">6.2.2. Test Runtime Configuration</a></li>
<li><a href="#sec:Test_Plan">6.2.3. Test Plan</a></li>
<li><a href="#sec:Test_Environment_Configuration">6.2.4. Test Environment Configuration</a></li>
<li><a href="#sec:Test_Environment_Configuration_Example">6.2.5. Test Environment Configuration Example</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_help-system">7. Help System</a>
<ul class="sectlevel2">
<li><a href="#sec:Built_In_Help">7.1. Built-In Help</a></li>
<li><a href="#sec:Context_Sensitive_Help">7.2. Context Sensitive Help</a></li>
<li><a href="#sec:Cheat_Sheets">7.3. Cheat Sheets</a></li>
<li><a href="#sec:JSDoc">7.4. JSDoc</a></li>
<li><a href="#sec:Hovering">7.5. Hovering</a>
<ul class="sectlevel3">
<li><a href="#sec:Show_Type_Information_of_Selection">7.5.1. Show Type Information of Selection</a></li>
</ul>
</li>
<li><a href="#sec:Example_Projects_and_Files">7.6. Example Projects and Files</a></li>
</ul>
</li>
<li><a href="#_bug-management">8. Bug Management</a>
<ul class="sectlevel2">
<li><a href="#sec:Built_In_Xpect_Support">8.1. Built-In Xpect Support</a>
<ul class="sectlevel3">
<li><a href="#sec:Report_View">8.1.1. Report View</a></li>
<li><a href="#sec:Generate_Bug_Report">8.1.2. Generate Bug Report</a></li>
<li><a href="#sec:Supported_Xpect_Tests">8.1.3. Supported Xpect Tests</a>
<ul class="sectlevel4">
<li><a href="#sec:XPECT_N4JS_Errors">8.1.3.1. Errors, Warnings, Infos, Issues</a></li>
<li><a href="#sec:XPECT_N4JS_Noerrors">8.1.3.2. Noerrors</a></li>
<li><a href="#sec:XPECT_N4JS_Output">8.1.3.3. Output, OutputRegex</a></li>
<li><a href="#sec:XPECT_N4JS_Type_Of">8.1.3.4. Type Of</a></li>
<li><a href="#sec:XPECT_Advanced_Methods">8.1.3.5. Advanced methods</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="#_cli">9. CLI</a>
<ul class="sectlevel2">
<li><a href="#sec:Headless_Compiler">9.1. Headless Compiler</a></li>
<li><a href="#sec:Headless_Dependencies">9.2. Headless Dependnecies</a></li>
<li><a href="#sec:Headless_Execution">9.3. Headless Execution</a>
<ul class="sectlevel3">
<li><a href="#sec:Cleaning_Headlessly">9.3.1. Cleaning Headlessly</a></li>
<li><a href="#sec:Running_Headlessly">9.3.2. Running Headlessly</a></li>
<li><a href="#sec:Information_about_running_headlessly">9.3.3. Information about running headlessly</a></li>
<li><a href="#sec:Testing_Headlessly">9.3.4. Testing Headlessly</a></li>
<li><a href="#sec:Information_about_testing_headlessly">9.3.5. Information about testing headlessly</a></li>
<li><a href="#_testresults">9.3.6. TestResults</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#sec:License">Appendix A: License</a></li>
<li><a href="#sec:Acronyms">Appendix B: Acronyms</a></li>
<li><a href="#_bibliography">Appendix C: Bibliography</a></li>
</ul>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph center">
<p><strong>Last Updated: 2019-08-08</strong></p>
</div>
<div class="paragraph center">
<p><strong>Authors:</strong><br>
Jens von Pilgrim, Jakub Siberski, Mark-Oliver Reiser, Torsten Krämer, Ákos Kitta, Sebastian Zarnekow, Lorenzo Bettini, Jörg Reichert, Kristian Duske, Marcus Mews, Minh Quang Tran, Luca Beurer-Kellner</p>
</div>
<div style="page-break-after: always;"></div>
<h2 id="_abstract" class="discrete">Abstract</h2>
<div class="paragraph">
<p>This document contains the N4JS IDE Specification.</p>
</div>
<h2 id="_introduction" class="discrete">Introduction</h2>
<div class="paragraph">
<p>This document describes the features of the N4JS <a href="#AC">IDE</a>, that is the user interface and features available to users of the <a href="#AC">IDE</a>. The language N4JS is described in [<a href="#N4JSSpec">N4JSSpec</a>] and is not part of this document.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="sec:Views"><a class="anchor" href="#sec:Views"></a><a class="link" href="#sec:Views">1. Views</a></h2>
<div class="sectionbody">
<div class="paragraph">
<p>This section briefly introduces all the views that belong to the application’s default perspective.</p>
</div>
<div class="sect2">
<h3 id="_eclipse-standard-views"><a class="anchor" href="#_eclipse-standard-views"></a><a class="link" href="#_eclipse-standard-views">1.1. Eclipse Standard Views</a></h3>
<div class="paragraph">
<p>In the following we descibe views usually available in Eclipse based IDEs. Some of the views were slightly adjusted to match specific N4JS needs.</p>
</div>
<div class="sect3">
<h4 id="sec:Project_Explorer_View"><a class="anchor" href="#sec:Project_Explorer_View"></a><a class="link" href="#sec:Project_Explorer_View">1.1.1. Project Explorer</a></h4>
<div class="paragraph">
<p>The Project Explorer view shows the resources from the underlying workspace in a hierarchical way. From this view one can open a resource for editing in the associated editor or select it to perform an operation on the resource. A popup contest menu is available from the Project Explorer for each resources if used right clicks any of them. A lot of convenient actions are available for from the popping context menu: file modifications (such as Copy, Cut, Paste and Delete) and import/export. Project Explorer support file system modifications by drag-and-dropping resources. One can link the Project Explorer with the editors, if one enables the view-editor-linking then the node in the tree representing a particular resource in the workspace will be automatically revealed and highlighted once one activates the corresponding editor. This works the other way around as well, when a node is selected in the tree and the corresponding resource is opened in an editor, then the editor will be activated.</p>
</div>
</div>
<div class="sect3">
<h4 id="sec:Outline_View"><a class="anchor" href="#sec:Outline_View"></a><a class="link" href="#sec:Outline_View">1.1.2. Outline</a></h4>
<div class="paragraph">
<p>The Outline view is responsible for displaying the outline of a structured file that is currently opened in an editor. In case of opening an N4JS file the view depicts all the types defined in the file. The owned members, functions and methods of a particular type are represented in a tree structure. Furthermore in case of opening an N4JS file in the editor, one can link the Outline view with the editor which means whenever one selects a node from the outline view the corresponding item will be revealed and highlighted in the editor.</p>
</div>
</div>
<div class="sect3">
<h4 id="sec:Problems_View"><a class="anchor" href="#sec:Problems_View"></a><a class="link" href="#sec:Problems_View">1.1.3. Problems</a></h4>
<div class="paragraph">
<p>This view is used to show all validation errors and warnings in a table that are generated for workbench resources such as N4JS files. For instance when one writes and/or saves an N4JS file that contains validation errors and/or warnings those issues will be automatically logged into the Problems view. One can reveal the actual problem in the N4JS by simply double-clicking on the problem in the view. In this case the corresponding N4JS file will be opened (if it was not already opened), activated and the relevant line will be revealed in the editor. By default the grouping in the Problems view is done by the severity of the issues. One can group the issues by issue type or just disable the grouping at all. The first column of the table is the actual description of the issue for a particular resource. The second column names the problematic resource itself. The third column shows the relative path of the problematic resource. The location, fifth, column describes the problematic line in the resource. And last but not least the sixth column is for naming the type of the problem. This is optional and might be missing for some cases. One can customise the content of the view from the view menu. One can limit the number of revealed items in the table or can modify the behaviour of the content provider.</p>
</div>
</div>
<div class="sect3">
<h4 id="sec:Console_View"><a class="anchor" href="#sec:Console_View"></a><a class="link" href="#sec:Console_View">1.1.4. Console</a></h4>
<div class="paragraph">
<p>The Console view is used to reveal a text based output provided by a running process and also allows user to provide any input to the running process from the keyboard.</p>
</div>
</div>
<div class="sect3">
<h4 id="sec:History_View"><a class="anchor" href="#sec:History_View"></a><a class="link" href="#sec:History_View">1.1.5. History</a></h4>
<div class="paragraph">
<p>History view supports a way to track the changes of the workbench resources. This view also responsible for providing a convenient way to reveal historical revisions of a particular resource and it is even supports a mechanism to compare two different revisions of a resource. By default this view only provides local historical information but if a resource is under version control then one can retrieve revisions for that particular resource even it was made by remotely by another IDE user.</p>
</div>
</div>
<div class="sect3">
<h4 id="sec:Error_Log_View"><a class="anchor" href="#sec:Error_Log_View"></a><a class="link" href="#sec:Error_Log_View">1.1.6. Error Log</a></h4>
<div class="paragraph">
<p>The Error Log view captures and logs all errors and warnings in a table generated by the application itself. Unlike Problems view the Error Log is responsible to collect and to reveal issues caused by a malfunctioned component or module of the IDE.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_n4js-specific-views"><a class="anchor" href="#_n4js-specific-views"></a><a class="link" href="#_n4js-specific-views">1.2. N4JS Specific Views</a></h3>
<div class="paragraph">
<p>The following views are specific to N4JS. Some of these views are useful for developers of the N4JS language itself as they reveal internal details at runtime. Most of these views can be opened via <code>Windows/Show View/Other..</code>, see <code>N4JS</code> category.</p>
</div>
<div class="sect3">
<h4 id="_test-results"><a class="anchor" href="#_test-results"></a><a class="link" href="#_test-results">1.2.1. Test Results</a></h4>
<div class="paragraph">
<p>The N4JS equivalent to the JUnit test view.</p>
</div>
</div>
<div class="sect3">
<h4 id="_source-graphs"><a class="anchor" href="#_source-graphs"></a><a class="link" href="#_source-graphs">1.2.2. Source Graphs</a></h4>
<div class="paragraph">
<p>Shows the AST of the current source code in the editor windows.</p>
</div>
</div>
<div class="sect3">
<h4 id="_api-compare"><a class="anchor" href="#_api-compare"></a><a class="link" href="#_api-compare">1.2.3. API Compare</a></h4>
<div class="paragraph">
<p>Shows compare results, i.e. the difference between an API definition project and its implementation.</p>
</div>
</div>
<div class="sect3">
<h4 id="_performance-graphs"><a class="anchor" href="#_performance-graphs"></a><a class="link" href="#_performance-graphs">1.2.4. Performance Graphs</a></h4>
<div class="paragraph">
<p>Shows some performance measurements of typical tasks such as builds.</p>
</div>
</div>
<div class="sect3">
<h4 id="_source-mapping"><a class="anchor" href="#_source-mapping"></a><a class="link" href="#_source-mapping">1.2.5. Source Mapping</a></h4>
<div class="paragraph">
<p>Shows source maps, i.e. the relation between N4JS source code and the generated plain JavaScript code.</p>
</div>
</div>
<div class="sect3">
<h4 id="_xpect-view"><a class="anchor" href="#_xpect-view"></a><a class="link" href="#_xpect-view">1.2.6. Xpect View</a></h4>
<div class="paragraph">
<p>Shows result of an Xpext run, may be used to submit bug reports.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_navigation"><a class="anchor" href="#_navigation"></a><a class="link" href="#_navigation">2. Navigation</a></h2>
<div class="sectionbody">
<div class="paragraph">
<p>In this chapter we describe specific views and features to allow for easy navigation.</p>
</div>
<div class="sect2 language-n4js">
<h3 id="sec:Outline_Navigation"><a class="anchor" href="#sec:Outline_Navigation"></a><a class="link" href="#sec:Outline_Navigation">2.1. Outline</a></h3>
<div class="paragraph">
<p>In general, a outline view and a quick outline are supported. Both outlines work similar, which is why both are specified together. The outline of an N4JS file is a tree which should show the following structure: <a id="sec:N4JS_Outline"></a></p>
</div>
<div class="ulist">
<ul>
<li>
<p>Top-level defined classes, interfaces, roles, enums, functions and exported variables. For all these different types, icons are to be used (similar to JDT). Beside the name, type variables should be shown as well, if defined.</p>
</li>
<li>
<p>Members of classifiers are to be shown in the classifier branch. All members (fields, methods, field accessors) are to be shown, with appropriate icons indicating the type (field/member), static flag, access modifier, abstract flag. The icons should look similar to JDT.</p>
</li>
<li>
<p>an import declaration should have a node in the outline view, if multiple elements are imported these should represented as child nodes of that import declaration node. If the import uses aliases the original name and the alias name should appear in the outline node text.</p>
</li>
<li>
<p>for a non exported function declaration no outline node should be created</p>
</li>
<li>
<p>for a non exported variable declaration no outline node should be created</p>
</li>
<li>
<p>for a exported variable statement there should be a node in the outline, if this statement contains only one variable declaration the node represents this declaration. For multiple variable declarations in the statement the statement node just is a comma separated list of the variable names and for each variable there is child node</p>
</li>
<li>
<p>for fields, functions, methods, getters and variables their declared (return) type should be shown (by adding : typeName after the element name). If the type is inferred then the type name should be presented in a different color</p>
</li>
<li>
<p>for functions, methods and setters each formal parameter should be represented by its declared or inferred type (when inferred than with different color)</p>
</li>
<li>
<p>constructors are represented by the method icon and a decorator in the top right corner</p>
</li>
<li>
<p>enumeration literals are represented with the same decoration as static final fields</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The top-level elements must be sortable either by order in the file (default) or alphabetically.</p>
</div>
<div class="sect3">
<h4 id="_quick-outline"><a class="anchor" href="#_quick-outline"></a><a class="link" href="#_quick-outline">2.1.1. Quick Outline</a></h4>
<div class="paragraph">
<p>The quick outline supports two modes. The modes are iteratively selected by pressing <span class="keyseq"><kbd>CMD/CTRL</kbd>+<kbd>O</kbd></span>.</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">owned</dt>
<dd>
<p>This is the default mode, only members directly owned by the type are shown</p>
</dd>
<dt class="hdlist1">inherited</dt>
<dd>
<p>In this mode, the owned members are shown including inherited, consumed, or polyfilled members. The origin is also shown and a different color is used to highlight the special status of these members. For usability reasons (limiting the number of filters), inherited, consumed and polyfilled members are treated similarly.</p>
</dd>
</dl>
</div>
</div>
<div class="sect3">
<h4 id="_normal-outline"><a class="anchor" href="#_normal-outline"></a><a class="link" href="#_normal-outline">2.1.2. Normal Outline</a></h4>
<div class="paragraph">
<p>In the normal outline view, toggles are used for the same purpose. Visualisations are similar to the quick outline view.</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">inherited</dt>
<dd>
<p>By default, only owned members of a type are shown. If the "inherited" toggle is active, inherited, consumed, or polyfilled members as well. For usability reasons (limiting the number of filters), inherited, consumed, and polyfilled members are treated similarly.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p></p>
</div>
<div class="sidebarblock">
<div class="content">
<a href="https://github.com/eclipse/n4js/issues/99" class="gray" title="GitHub Issues"><span class="image"><img src="images/issue.svg" alt=""></span> #99</a>
</div>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">sorting</dt>
<dd>
<p>By default, all elements are sorted in the order of their appearance in the source code. If alphabetic sorting is enabled, they are sorted alphabetically.</p>
</dd>
</dl>
</div>
<div class="admonitionblock todo">
<table>
<tr>
<td class="icon">
<i class="fa icon-todo" title="Todo"></i>
</td>
<td class="content">
<div class="paragraph">
<p>Potential improvements:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>show decorator when a member overrides and member from a super class / super interface or role</p>
</li>
<li>
<p>show object literals and their members in the outline view (just filter <code>eAllContents</code> of an element that already has a node in outline view for object literals)</p>
</li>
<li>
<p>show function expression in the outline view (just filter <code>eAllContents</code> of an element that already has a node in outline view for function expressions)</p>
</li>
</ul>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_navigation-commands"><a class="anchor" href="#_navigation-commands"></a><a class="link" href="#_navigation-commands">2.2. Navigation Commands</a></h3>
<div class="sect3">
<h4 id="sec:Navigate_to_Declaration"><a class="anchor" href="#sec:Navigate_to_Declaration"></a><a class="link" href="#sec:Navigate_to_Declaration">2.2.1. Navigate to Declaration</a></h4>
<div class="paragraph">
<p>It is possible to Command-click on almost every reference and jump to its declaration.</p>
</div>
</div>
<div class="sect3">
<h4 id="sec:find_by_references"><a class="anchor" href="#sec:find_by_references"></a><a class="link" href="#sec:find_by_references">2.2.2. Find by References</a></h4>
<div class="paragraph">
<p>For each referenceable element in an open N4JS file you can click your mouse and invoke the context menu to select <code>Find references</code>. Then in the Eclipse search view all found references are displayed as tree: each match is structured by resource path and coarse grained element in the resource (like a method). If there are multiple matches within a method only the first match is linked but in its display string the total match count is shown in brackets.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>find by references shows the result as tree in the Eclipse search view with having elements that are members or have defined type displayed as nodes</p>
</li>
<li>
<p>every found reference is displayed under its nearest parent that is a member or has a defined type</p>
</li>
<li>
<p>if there a multiple found references in a node only the first one is displayed (and linked) + the number of all total matches is shown as part of the display string (like in JDT)</p>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="sec:Open_Type_Declaration"><a class="anchor" href="#sec:Open_Type_Declaration"></a><a class="link" href="#sec:Open_Type_Declaration">2.2.3. Open Type Declaration</a></h4>
<div class="paragraph">
<p>One can quickly browse the workbench for available types. The declaration of the types can be opened in editor from this dialog. The N4JS type search dialog can be raised with the <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>T</kbd> key binding (<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>T</kbd> on Windows and Linux systems).</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Enter <strong>exact type name</strong>, prefix name or a camel case pattern to run a query against the types. The following rules and patterns are supported.</p>
<div class="ulist">
<ul>
<li>
<p><strong>Wildcards</strong>: <code>?</code> for any character and <code>*</code> for any string.</p>
</li>
<li>
<p><strong>Camel case</strong>: <code>DM</code> will return with all types that contains <code>D</code> and <code>M</code> with the given order such as <code>DataMap</code> and <code>DataMapEntry</code> but not <code>ImmutableDataMap</code>.</p>
<div class="paragraph">
<p><code>AcBuGr</code> will return with all types that contain <code>Ac</code>, <code>Bu</code> and <code>Gr</code> with the given order such as <code>ActionButtonGroup</code>.</p>
</div>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Highlighting</strong>: The matching types names are highlighted according to the matching parts.</p>
</li>
<li>
<p><strong>Decorator</strong> for duplicate type names: The internally used fully qualified name of the type will be appended to the type name automatically, so one can easily distinguish between types even there are type name collision.</p>
</li>
<li>
<p><strong>Opening types in editor</strong>: Type declarations can be opened in the editor in the following ways: after entering the type name prefix or pattern to the filter text one can navigate among the filtered items with the up and/or down arrow keys. Simply hitting return on the keyboard or clicking on the ’OK’ button the currently selected declaration of the selected type will be opened in the editor. For opening multiple type declarations one can use the <kbd>Shift</kbd> modifier to select more than one element. Single type can be opened with double clicking on it in the dialog.</p>
</li>
<li>
<p><strong>History</strong>: Once a type is being opened then it will be available among the recently opened type in the type search dialog. These items will show up in the upper part of the list in the dialog.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect2 language-bash">
<h3 id="sec:Working_Sets"><a class="anchor" href="#sec:Working_Sets"></a><a class="link" href="#sec:Working_Sets">2.3. Working Sets</a></h3>
<div class="paragraph">
<p>Working sets are used to logically group resources, projects in the Project Explorer (navigator) and in the UI in general. Although a couple of projects can be easily handled and shown without any sophisticated working set support in the navigator, larger code sources consisting of multiple projects could cause some trouble when one has to maintain them. Indeed one could use multiple workspaces and could switch between them or can simply manually open-close relevant projects, but this gets cumbersome too.</p>
</div>
<div class="paragraph">
<p>This section describes the general design of the N4JS specific working set support and also introduces a couple of use cases while enumerating the constraints.</p>
</div>
<div class="sect3">
<h4 id="sec:Working_Set_Managers"><a class="anchor" href="#sec:Working_Set_Managers"></a><a class="link" href="#sec:Working_Set_Managers">2.3.1. Working Set Managers</a></h4>
<div class="paragraph">
<p>Just like the JDT (<code>org.eclipse.jdt.internal.ui.workingsets.WorkingSetModel</code>) based working set support, the N4JS IDE based approach is also aware of the <code>org.eclipse.ui.IWorkingSet</code> and the <code>org.eclipse.ui.IWorkingSetManager</code> APIs but besides simply using them it comes with its own implementation and adapts it to the default Eclipse based one, furthermore it also comes with an Eclipse extension point based mechanism to support various working set managers at the same time to provide even better user experience and a more convenient way of working set management.</p>
</div>
<div class="paragraph">
<p>A working set manager can be contributed to the IDE via the <code>org.eclipse.n4js.ui.workingSetManager</code> extension point, then the implementation class must implement the <code>org.eclipse.n4js.ui.workingsets.WorkingSetManager</code> interface but it is highly recommended to rather extend the <code>org.eclipse.n4js.ui.workingsets.WorkingSetManagerImpl</code> class. Guice based dependency injection should also be considered when implementing the custom working set manager. It means that each custom working set manager implementation must have a public <em>no-args</em> constructor. This <em>no-args</em> constructor will be invoked when creating the instances via <code>IConfigurationElement#createExecutableExtension(String)</code> method. Then the members, if any will be injected by the working set manager broker. Below <code>plugin.xml</code> snippet describes how to contribute a custom working set manager to the IDE.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-xml" data-lang="xml"> &lt;extension
point="org.eclipse.n4js.ui.workingSetManager"&gt;
&lt;manager
class="some.package.name.MyExecutableExtensionFactory:some.package.name.MyWorkingSetManager"&gt;
&lt;/manager&gt;
&lt;/extension&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>By default the N4JS IDE comes with five different built-in working set managers. These are the followings:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Manual Association Working Set Manager,</p>
</li>
<li>
<p>Project Name Filter Working Set Manager,</p>
</li>
<li>
<p>Git Repository Working Set Manager,</p>
</li>
<li>
<p>Project Location Working Set Manager and</p>
</li>
<li>
<p>N4JS Project Type Working Set Manager.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The benefits and the details of each built-in working set managers will be discussed in later sections but first we have to distinguish between three conceptually different working set manager approaches.</p>
</div>
<div class="paragraph">
<p>First off, IDE supports fully static working set managers. Fully static working set managers might manage any arbitrary number of working sets, and each working set might be associated with any number of Eclipse projects. That means, user might create, edit and remove working sets and manually associate projects with individual working sets. One project might belong to multiple working sets. There is a dedicated working set, <em>Other Projects</em>, that cannot be renamed and/or deleted. When no user defined working sets are available this dedicated working set will be still available. IDE comes with one single fully static working set manager: <em>Manual Association Working Set Manager</em>.</p>
</div>
<div class="paragraph">
<p>The second kind of working set manager is the semi-dynamic one. That means, user can create, modify and delete working sets, but the associations between the projects and the working sets are automatic. This means, the user might define a working set - project association rule, and the projects will be automatically associated with the working sets. Just like in the above kind, one project might belong to multiple working sets and here as well, there is a dedicated working set manager, that cannot be modified: <em>Other Projects</em>. IDE comes with one semi-dynamic working set manager. That is the <em>Project Name Filter Working Set Manager</em>. User might define a project name filter rule with a regular expression, and each project which name matches a pattern will be associated with the working set. If a project does not comply to any working set manager rule, then it will belong to the <em>Other Projects</em> working set.</p>
</div>
<div class="paragraph">
<p>The third kind of working set manager is the fully-dynamic working set manager. Both the working sets and the project associations are done by some implementation specific rules. Such as Git repository provider based, or project location based approaches. These working set managers have the dedicated <em>Other Projects</em> working set that is used as a fallback working set. For instance, if the <em>Git Repository Working Set Manager</em> is the active one, all projects that are shared with Git will belong to the corresponding working set manager but if a project is not yet a shared project, then it will belong to the dedicated fallback working set. As always that working set manager cannot be deleted and/or modified.</p>
</div>
</div>
<div class="sect3">
<h4 id="sec:Working_Set_Constraints"><a class="anchor" href="#sec:Working_Set_Constraints"></a><a class="link" href="#sec:Working_Set_Constraints">2.3.2. Working Set Constraints</a></h4>
<div class="paragraph">
<p>This section enumerates a set of constraints that have to considered by both end users and implementors:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Working set manager identifier must be unique.</p>
</li>
<li>
<p>The identifier of the working set manager must be unique per container working set managers.</p>
</li>
<li>
<p>Each working set must have a working set with <em>Other Projects</em> unique ID and name.</p>
</li>
<li>
<p>Working sets with <em>Other Projects</em> unique ID must not be editable nor deletable.</p>
</li>
<li>
<p>At least one working set should be visible (not hidden) per working set managers.</p>
</li>
<li>
<p>Working set managers are activated when the <em>Working Sets</em> are configured as <em>Top Level Elements</em> in the <em>Project Explorer</em>.</p>
</li>
<li>
<p>Working set order can be specified and customized by the user if it is not specified yet, then a case sensitive ordering based on the working set names should be applied.</p>
</li>
</ul>
</div>
</div>
<div class="sect3">
<h4 id="sec:Manual_Association_Working_Set_Manager_UI_Features"><a class="anchor" href="#sec:Manual_Association_Working_Set_Manager_UI_Features"></a><a class="link" href="#sec:Manual_Association_Working_Set_Manager_UI_Features">2.3.3. Manual Association Working Set Manager - UI Features</a></h4>
<div class="paragraph">
<p>This section describes the working set manager by introducing the UI capabilities as well.</p>
</div>
<div class="paragraph">
<p>This working set manager is a fully static working set manager and activated and used as the default one when the working set manager support is turned on in the IDE. With this working set manager one can create a new working set by simply defining a unique name for the working set and associating any number of workspace project to the working set. Furthermore existing working sets can be modified and deleted but the <em>Other Projects</em> working set. The working set support can be turned on in the <em>Project Explorer</em> view. Via the view menu one has to select <em>Top Level Elements</em> <em>&gt;</em> <em>Working Sets</em> menu item.</p>
</div>
<div class="imageblock center" style="text-align: center">
<div class="content">
<img src="chapters/04_navigation/fig/activate_working_set_managers.png" alt="Activate_Working_Set_Managers" width="50%">
</div>
<div class="title">Figure 1. Activate Working Set Managers</div>
</div>
<div class="paragraph">
<p>After the working set manager mode activation, a new toolbar contribution item become visible and user can select among the available working set managers.</p>
</div>
<div class="imageblock center" style="text-align: center">
<div class="content">
<img src="chapters/04_navigation/fig/select_working_set_manager_01.png" alt="Select_Working_Set_Manager" width="50%">
</div>
<div class="title">Figure 2. Select Working Set Manager</div>
</div>
<div class="paragraph">
<p>As the below picture depicts the available working set managers are listed and the currently active manager is marked with a check. In our case that is the <em>Manual Association Working Set Manager</em>.</p>
</div>
<div class="imageblock center" style="text-align: center">
<div class="content">
<img src="chapters/04_navigation/fig/select_working_set_manager_02.png" alt="Activate_Working_Set_Manager" width="25%">
</div>
<div class="title">Figure 3. Activate Working Set Manager</div>
</div>
<div class="paragraph">
<p>Once the the <em>Configure Manual Association&#8230;&#8203;</em> menu item is selected, the working set manager configuration dialog pops up. By clicking on the <em>New&#8230;&#8203;</em> button in the configuration dialog, a new working set wizard will be invoked and the manual working set - project association can be configured.</p>
</div>
<div class="imageblock center" style="text-align: center">
<div class="content">
<img src="chapters/04_navigation/fig/configure_working_sets_01.png" alt="Configure_Working_Sets" width="25%">
</div>
<div class="title">Figure 4. Configure Working Sets</div>
</div>
<div class="paragraph">
<p>In the wizard after specifying the desired unique name of the working set an arbitrary number of workspace projects can be associated with the working set. It is important to note, that a project can be associated with more than one working sets. If a project is not associated with any working sets then it will be automatically linked to the fallback <em>Other Projects</em> working set.</p>
</div>
<div class="imageblock center" style="text-align: center">
<div class="content">
<img src="chapters/04_navigation/fig/working_set_project_association.png" alt="Configure_Working_Set_Project_Association" width="50%">
</div>
<div class="title">Figure 5. Working Set - Projects Association</div>
</div>
<div class="paragraph">
<p>Once all the changes made are confirmed and the configuration dialog is closed via the <em>OK</em> button, the <em>Project Explorer</em> will be refreshed and will reflect the working set changes.</p>
</div>
<div class="imageblock center" style="text-align: center">
<div class="content">
<img src="chapters/04_navigation/fig/working_sets_in_navigator.png" alt="Custom_Working_Sets_In_Project_Explorer" width="25%">
</div>
<div class="title">Figure 6. Custom Working Sets In Project Explorer</div>
</div>
<div class="paragraph">
<p>The order of the working sets can be configured and customized in the working set manager configuration dialog, or just simply reordering it from the navigator itself by drag and dropping the available working set managers.</p>
</div>
<div class="imageblock center" style="text-align: center">
<div class="content">
<img src="chapters/04_navigation/fig/working_set_reorder.png" alt="Re_Ordering_Working_Sets_In_Project_Explorer" width="25%">
</div>
<div class="title">Figure 7. Re-ordering Working Sets In Project Explorer</div>
</div>
<div class="paragraph">
<p>Besides changing the order of the working sets, working sets can be hidden from the navigator. Just like the ordering, this can be changed from the working set configuration dialog, or by simply selecting working sets in the navigator and hiding them via <em>Hide Selected Working Set</em> menu item. Important to note, at least one working set should be visible in the navigator, so if all the working sets are selected in the navigator, then the menu item will be disabled. Same behavior in the working set customization dialog, if all items are unchecked, then the <em>OK</em> button is disabled in the dialog.</p>
</div>
<div class="imageblock center" style="text-align: center">
<div class="content">
<img src="chapters/04_navigation/fig/working_set_hide.png" alt="Hide_Working_Sets_In_Project_Explorer" width="25%">
</div>
<div class="title">Figure 8. Hide Working Sets In Project Explorer</div>
</div>
<div class="paragraph">
<p>Once at least one working set is hidden from the UI, then a new toolbar contribution become visible in the <em>Project Explorer</em>. This UI contribution provides a quick, convenient way to show a specific or all hidden working sets in the navigator. It is worth to note, if a project is automatically associated with the <em>Other Projects</em> working set (because it does not belong to any working sets due to the lack of manual association) it will be not shown in the navigator if the <em>Other Projects</em> working set is hidden. Once all working sets are visible, indeed the <em>Show Hidden Working Sets</em> toolbar contribution become invisible.</p>
</div>
<div class="imageblock center" style="text-align: center">
<div class="content">
<img src="chapters/04_navigation/fig/working_set_show.png" alt="Show_Hidden_Working_Sets_In_Project_Explorer" width="25%">
</div>
<div class="title">Figure 9. Show Hidden Working Sets In Project Explorer</div>
</div>
<div class="paragraph">
<p>Besides the above described generic working set UI support, projects can be associated with working sets by simply drag and dropping them from one working set into another. Note, this is only supported for the <em>Manual Association Working Set Manager</em>.</p>
</div>
</div>
<div class="sect3">
<h4 id="sec:Project_Name_Filter_Working_Set_Manager"><a class="anchor" href="#sec:Project_Name_Filter_Working_Set_Manager"></a><a class="link" href="#sec:Project_Name_Filter_Working_Set_Manager">2.3.4. Project Name Filter Working Set Manager</a></h4>
<div class="paragraph">
<p>As mentioned earlier, this working set is a semi-dynamic working set. The working sets can be created, edited and deleted by the user by simply specifying project name filter pattern as valid regular expressions but the project association itself is fully automatic. If the name of a project does not match with any project name filter rule, then the project will be associated with the <em>Other Projects</em> working set. Although reordering the working sets from the navigator by simple drag and dropping them is supported, project association is disabled.</p>
</div>
</div>
<div class="sect3">
<h4 id="sec:Git_Repository_Working_Set_Manager"><a class="anchor" href="#sec:Git_Repository_Working_Set_Manager"></a><a class="link" href="#sec:Git_Repository_Working_Set_Manager">2.3.5. Git Repository Working Set Manager</a></h4>
<div class="paragraph">
<p>This working set is a fully-dynamic working set. Projects will be associated by the Git providers. It means, if a project is imported from a pre-configured local Git repository, then the project will be associated with the working set linked with the Git repository. The subset of the available working sets is become automatically updated once the Git repository preferences changed by the user. These preferences can be changed on the <em>Git</em> perspective in the <em>Git Repositories</em> view by simple adding or hiding/removing a repository from the view.</p>
</div>
</div>
<div class="sect3">
<h4 id="sec:Project_Location_Working_Set_Manager"><a class="anchor" href="#sec:Project_Location_Working_Set_Manager"></a><a class="link" href="#sec:Project_Location_Working_Set_Manager">2.3.6. Project Location Working Set Manager</a></h4>
<div class="paragraph">
<p>This fully-dynamic working set manager calculates the subset of available working sets based on the parent folder of the projects. The benefit of this working set manager is to support the convention recommended by the maven/Git folder structuring. The following constraints are applied when associating the projects with the available working sets:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>If a project is located in the root of the Eclipse workspace, then it will be associated with <em>Other Projects</em> working set.</p>
</li>
<li>
<p>If a project is nested somewhere in the Eclipse workspace, then it will be associated with a working set that has the same name as the parent folder of the project. Let assume the Eclipse workspace root points to <code>/eclipse/root</code> and there is a project <code>P1</code> nested in the workspace root at <code>/eclipse/root/path/to/nested/location/P1</code>, then the associated working set will be <code>location</code>.</p>
</li>
<li>
<p>If a project is not contained in the workspace, but has a Git provider that is configured in IDE, and the project root is the local Git repository root, then the associated working set name will be the name of the Git repository. For example, if we have Eclipse workspace root pointing to <code>/eclipse/root</code> location and a <code>P2</code> project located <code>/some/path/to/git/P2</code> but this location is the location of a registered Git repository, then the name of the associated working set will be neither <code>Other Projects</code> not <code>git</code> but <code>P2</code> since that is known Git local repository root.</p>
</li>
<li>
<p>If project <code>P3</code> is not contained in the Eclipse workspace but contained in a known local Git repository just like above, but the project root is not the local Git repository root, then the name of the parent folder will be considered as the name of the associated working set. This rule is a hybrid alternative of the second and the third constraints, hence for instance if the project is under <code>/some/path/to/git/repositoryName/plugins/P3</code> and <code>repositoryName</code> is local git repository, then the name of the associated working set will be <code>plugins</code> and not <code>repositoryName</code>.</p>
</li>
<li>
<p>Else the associated working set will be the <em>Other Projects</em> fallback working set.</p>
</li>
</ul>
</div>
</div>
<div class="sect3">
<h4 id="sec:N4JS_Project_Type_Working_Set_Manager"><a class="anchor" href="#sec:N4JS_Project_Type_Working_Set_Manager"></a><a class="link" href="#sec:N4JS_Project_Type_Working_Set_Manager">2.3.7. N4JS Project Type Working Set Manager</a></h4>
<div class="paragraph">
<p>This is working set manager is a N4JS specific fully-dynamic working set manager. The working sets will be calculated based on the instances defined by the <code>org.eclipse.n4js.n4mf.ProjectType</code> type. Each accessible N4JS project will be associated to a working set based on the project type. A workspace project will be associated with the <em>Other Projects</em> fallback working set if any of the followings are true to the project:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>The project is not accessible. (It does not exist or is not opened.)</p>
</li>
<li>
<p>The project does not configured with <em>Xtext</em> nature.</p>
</li>
<li>
<p>The project does not have an <em>Xtext</em> builder command ID.</p>
</li>
<li>
<p>The project does not have a valid N4 manifest file.</p>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_assistance"><a class="anchor" href="#_assistance"></a><a class="link" href="#_assistance">3. Assistance</a></h2>
<div class="sectionbody">
<div class="paragraph">
<p>In this chapter we describe all kind of tools assisting the user when writing code, i.e. content assist, quickfixes, quick assists, etc.</p>
</div>
<div class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<i class="fa icon-warning" title=""></i>
</td>
<td class="content">
Not all features are yet implemented!
</td>
</tr>
</table>
</div>
<div class="sect2 language-n4js">
<h3 id="sec:Content_Assist"><a class="anchor" href="#sec:Content_Assist"></a><a class="link" href="#sec:Content_Assist">3.1. Content Assist</a></h3>
<div class="paragraph">
<p>Content assist may change the document at various places at once. In those cases, it is important to prevent flickering in the editor. The FQNImporter provides a blue print how to adjust line numbers properly and scroll the viewport of the current editor to minimize flickering in the UI.</p>
</div>
<div class="paragraph">
<p>Completions not listed here as they are provided by template proposals:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Classifier declaration template proposal</p>
</li>
<li>
<p>Function declaration template proposal</p>
</li>
<li>
<p>Getter/Setter pair template proposal</p>
</li>
</ol>
</div>
<div class="sect3">
<h4 id="sec:Complete_Keywords"><a class="anchor" href="#sec:Complete_Keywords"></a><a class="link" href="#sec:Complete_Keywords">3.1.1. Complete Keywords</a></h4>
<div class="paragraph">
<p>Complete keyword which are syntactically correct at a given location. Do not suggest completions which would lead to wrong code.</p>
</div>
<div class="paragraph">
<p>Keywords that contain only a single character are not proposed since they would pollute the proposal window and don’t offer added value.</p>
</div>
<div class="paragraph">
<p>Special attention has to be given to operators. Since they are modelled in the grammar and not as cross references, their validaty is purely syntactically. That is, there is no generic facility in Xtext, that allows to filter unapplicable operators as there is for cross references.</p>
</div>
</div>
<div class="sect3">
<h4 id="sec:Complete_Annotations"><a class="anchor" href="#sec:Complete_Annotations"></a><a class="link" href="#sec:Complete_Annotations">3.1.2. Complete Annotations</a></h4>
<div class="paragraph">
<p>Annotations can be proposed depending on the following elements or the context.</p>
</div>
</div>
<div class="sect3">
<h4 id="sec:Complete_Identifier_Reference"><a class="anchor" href="#sec:Complete_Identifier_Reference"></a><a class="link" href="#sec:Complete_Identifier_Reference">3.1.3. Complete Identifier Reference</a></h4>
<div class="paragraph">
<p>References to identifiers can be automatically completed. This is even true if the declaration is not imported yet, as the import may be automatically added as well.</p>
</div>
<div class="openblock">
<div class="title">Complete identifier references</div>
<div class="content">
<div class="paragraph">
<p>The IDE supports auto-completion of an identifier referencing to a declaration.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Complete type references.</p>
</li>
<li>
<p>Complete function references.</p>
</li>
<li>
<p>Complete variable references.</p>
</li>
<li>
<p>Complete parameter references.</p>
</li>
<li>
<p>If necessary, imports are added automatically to complete reference <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>r</mi></math> to declaration <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>D</mi></math>.</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p>-</p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<div class="paragraph">
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mspace width="3.0mm"/><mi>b</mi><mi>i</mi><mi>n</mi><mi>d</mi><mfenced close=")" open="("><mi>r</mi><mi>D</mi></mfenced></math><br>
<math xmlns="http://www.w3.org/1998/Math/MathML"><mspace width="3.0mm"/><mo></mo></math><br>
<math xmlns="http://www.w3.org/1998/Math/MathML"><mspace width="3.0mm"/><mi>r</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>=</mo><mi>D</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi></math><br>
<math xmlns="http://www.w3.org/1998/Math/MathML"><mspace width="3.0mm"/><mi>D</mi><mo></mo><mi>r</mi><mo>.</mo><mi>m</mi><mi>o</mi><mi>d</mi><mi>u</mi><mi>l</mi><mi>e</mi></math><br>
<math xmlns="http://www.w3.org/1998/Math/MathML"><mspace width="3.0mm"/><mo></mo></math><br>
<math xmlns="http://www.w3.org/1998/Math/MathML"><mspace width="3.0mm"/><mo></mo><mstyle mathvariant="monospace"><mtext>NamedImportSpecifier</mtext></mstyle><mi>N</mi><mi>I</mi><mi>S</mi><mi>:</mi></math><br>
<math xmlns="http://www.w3.org/1998/Math/MathML"><mspace width="3.0mm"/><mi>W</mi><mi>I</mi><mi>S</mi><mo>.</mo><mi>i</mi><mi>m</mi><mi>p</mi><mi>o</mi><mi>r</mi><mi>t</mi><mi>D</mi><mi>e</mi><mi>c</mi><mi>l</mi><mo>.</mo><mi>i</mi><mi>m</mi><mi>p</mi><mi>o</mi><mi>r</mi><mi>t</mi><mi>e</mi><mi>d</mi><mi>M</mi><mi>o</mi><mi>d</mi><mi>u</mi><mi>l</mi><mi>e</mi><mo>=</mo><mi>D</mi><mo>.</mo><mi>m</mi><mi>o</mi><mi>d</mi><mi>u</mi><mi>l</mi><mi>e</mi></math><br>
<math xmlns="http://www.w3.org/1998/Math/MathML"><mspace width="3.0mm"/><mo></mo><mo></mo><mstyle mathvariant="monospace"><mtext>WildcardImportSpecifier</mtext></mstyle><mi>W</mi><mi>I</mi><mi>S</mi><mi>:</mi></math></p>
</div>
</dd>
<dt class="hdlist1">Description</dt>
<dd>
<p>There might be multiple declarations <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>D</mi></math> in project (or in dependent projects) with <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>D</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>=</mo><mi>r</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi></math>. If the declaration <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>D</mi></math> is not local, then a named import may be created by the content assist:</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>If the declaration <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>D</mi></math> is local, no import is created</p>
</li>
<li>
<p>If an import enabling access to the declaration already exists, no other import is created.</p>
</li>
<li>
<p>If an alias already exists, the alias name is used, even if the prefix was different when the content assist was activated.</p>
</li>
<li>
<p>If the import would conflict with an existing member, an alias is proposed along with the import. Linked editing helps to choose a proper alias.</p>
</li>
<li>
<p>All imports from a single module are done within a single import declaration. The exception to this rule are wildcard imports that provide a simple name which is currently unused. In that case, a new import may be necessary to disambiguate the wildcard.</p>
</li>
</ol>
</div>
</dd>
</dl>
</div>
</li>
<li>
<p>If the identifier reference refers to a function (or method), an opening and a closing parenthesis are appended and
the cursor is positioned between these two parentheses.</p>
</li>
</ol>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="sec:Complete_Member_Overrides"><a class="anchor" href="#sec:Complete_Member_Overrides"></a><a class="link" href="#sec:Complete_Member_Overrides">3.1.4. Complete Member Overrides</a></h4>
<div class="openblock">
<div class="title">Complete Member Overrides Inside a classifier</div>
<div class="content">
<div class="paragraph">
<p>A prefix of an inherited member can be used to autocomplete that to a complete declaration.
This is in particular true for methods.</p>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="sec:Constructor_Completion"><a class="anchor" href="#sec:Constructor_Completion"></a><a class="link" href="#sec:Constructor_Completion">3.1.5. Constructor Completion</a></h4>
<div class="openblock">
<div class="title">Constructor Completion</div>
<div class="content">
<div class="paragraph">
<p>Constructor Completion Based on the declared fields and super constructor, constructor methods can be completed.</p>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="sec:Complete_Function_Expression"><a class="anchor" href="#sec:Complete_Function_Expression"></a><a class="link" href="#sec:Complete_Function_Expression">3.1.6. Complete Function Expression with Known Type</a></h4>
<div class="openblock">
<div class="title">Complete Function Expression</div>
<div class="content">
<div class="paragraph">
<p>If a function expression is used as an argument or assigned to a typed variable, the signature of the function can be derived from the type. This can be used to complete a function expression.</p>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="sec:Complete_Variable_and_Parameter_Names"><a class="anchor" href="#sec:Complete_Variable_and_Parameter_Names"></a><a class="link" href="#sec:Complete_Variable_and_Parameter_Names">3.1.7. Complete Variable and Parameter Names</a></h4>
<div class="openblock">
<div class="title">Type based completion of Variable and Parameter Names</div>
<div class="content">
<div class="paragraph">
<p>Variable and parameter names can be completed based on the type. Camel case detection is used to propose different variations.</p>
</div>
</div>
</div>
<div class="paragraph">
<p>Completion of variables references see <a href="#sec:Complete_Identifier_Reference">Complete Identifier Reference</a>.</p>
</div>
</div>
</div>
<div class="sect2 language-n4js">
<h3 id="sec:Quick_Fixes"><a class="anchor" href="#sec:Quick_Fixes"></a><a class="link" href="#sec:Quick_Fixes">3.2. Quick Fixes</a></h3>
<div class="paragraph">
<p>Quick fixes try to solve issues, i.e. errors or warnings, automatically. This is done by rewriting code, either at the location of the issue or at referenced locations.</p>
</div>
<div class="paragraph">
<p>In all cases, a quick fix must only be suggested if the following preconditions are fulfilled:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>All locations at which modifications have to be done must be writeable.</p>
</li>
<li>
<p>If bindings are involved, e.g., names are to be changed, all previous bindings must remain similar. This might be more complicated as it seems!</p>
</li>
</ol>
</div>
<div class="sect3">
<h4 id="sec:N4JS_Issue_Properties"><a class="anchor" href="#sec:N4JS_Issue_Properties"></a><a class="link" href="#sec:N4JS_Issue_Properties">3.2.1. N4JS Issue User data</a></h4>
<div class="paragraph">
<p>As some quick fixes need more information to decide upfront which strategy to use, some issues provide additional data. These properties are defined in the file <code>IssueUserDataKeys.java</code> in the <code>org.eclipse.n4js.validation</code> package. They can for example be accessed by passing the according key to the <code>getUserData</code> method of an <code>N4JSIssue</code> instance. They are also available as array based Xtext Issue user data.<br></p>
</div>
<div class="paragraph">
<p>All available user data keys are described for each Issue code in <a href="#sec:N4JS_Issue_Fixes">N4JS Issue Fixes</a>.</p>
</div>
</div>
<div class="sect3">
<h4 id="sec:N4JS_Issue_Fixes"><a class="anchor" href="#sec:N4JS_Issue_Fixes"></a><a class="link" href="#sec:N4JS_Issue_Fixes">3.2.2. N4JS Issue Fixes</a></h4>
<div class="paragraph">
<p>The principle idea is to provide a quick fix for every issue, if it is possible to automatically solve it.</p>
</div>
<div class="sect4">
<h5 id="sec:Linking_Issues"><a class="anchor" href="#sec:Linking_Issues"></a><a class="link" href="#sec:Linking_Issues">3.2.2.1. Linking Issues</a></h5>
<div class="paragraph">
<p>Linking issues are special in that they are created by the standard Xtext linker and use all the same built-in issue code <code>Diagnostic.LINKING_DIAGNOSTIC</code>. Therefore, we cannot refer to these issues using one of our custom N4JS issue codes.</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Diagnostic.LINKING_DIAGNOSTIC</dt>
<dd>
<p><code>Couldn’t resolve reference to <em>n</em></code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Add missing import declaration for unresolved name <em>n</em>.</p>
</li>
</ol>
</div>
</dd>
</dl>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Precondition
</td>
<td class="hdlist2">
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>An exported identifiable element <em>e</em> with name <em>n</em> exists in another module <em>m</em>.</p>
</li>
<li>
<p><em>e</em> is visible from the given location.</p>
</li>
</ol>
</div>
</td>
</tr>
<tr>
<td class="hdlist1">
Label
</td>
<td class="hdlist2">
<p><code>Import <em>n</em> - <em>m</em></code></p>
<div class="dlist">
<dl>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p>An import declaration was added such that name <em>n</em> is now resolvable at the given location and bound to <em>e</em>.</p>
</dd>
<dt class="hdlist1">Description</dt>
<dd>
<p>Some important notes:</p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><code>A</code> separate quick fix is proposed for each candidate element instead of having a single generic quick fix for adding imports and showing a dialog later (for example, create two quick fixes “Import class <code>X</code> from module M1" and “Import interface <code>X</code> from module M2" instead of a single quick fix “Add import for name X").<br>
This is unusual for quick fixes, because it means significant work has to be done upfront when creating the quick fix / modification proposals, which raises performance concerns. However,</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>the JDT handles this the same way and</p>
</li>
<li>
<p>this brings the implementation closer to content assist allowing more reuse, therefore this decision was taken.</p>
</li>
</ol>
</div>
</li>
<li>
<p>For consistency, matching of lower/upper/camel case is to be handled as in code completion during content assist. The same applies to display string formatting, esp. name formatting and coloring of element <em>e</em> and module <em>m</em>.</p>
</li>
<li>
<p>Note that here we can make more assumptions than during import as part of content assist. For example, we know that the element is not imported yet (otherwise there would not be an error) and there won’t be a need for an alias and linked editing.</p>
</li>
</ol>
</div>
</dd>
</dl>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="sect4">
<h5 id="sec:Import_Issues"><a class="anchor" href="#sec:Import_Issues"></a><a class="link" href="#sec:Import_Issues">3.2.2.2. Import Issues</a></h5>
</div>
<div class="sect4">
<h5 id="sec:Visibility_Issues"><a class="anchor" href="#sec:Visibility_Issues"></a><a class="link" href="#sec:Visibility_Issues">3.2.2.3. Visibility Issues</a></h5>
<div class="dlist">
<dl>
<dt class="hdlist1">VIS_ILLEGAL_MEMBER_ACCESS</dt>
<dd>
<p><code>The <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>m</mi><mi>e</mi><mi>m</mi><mi>b</mi><mi>e</mi><mi>r</mi><mi>T</mi><mi>y</mi><mi>p</mi><mi>e</mi></math> <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>m</mi><mi>e</mi><mi>m</mi><mi>b</mi><mi>e</mi><mi>r</mi></math> is not visible.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Change access modifier to protected/public or remove <code>@Internal</code> annotation.</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p>The file containing the declaration of <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>m</mi><mi>e</mi><mi>m</mi><mi>b</mi><mi>e</mi><mi>r</mi></math> is modifiable</p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p>The access modifier has been changed so that <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>m</mi><mi>e</mi><mi>m</mi><mi>b</mi><mi>e</mi><mi>r</mi></math> is visible at issue location.</p>
</dd>
<dt class="hdlist1">User Data</dt>
<dd>
<div class="ulist">
<ul>
<li>
<p><strong>ACCESS_SUGGESTION</strong> The most restrictive modifier making the member visible.</p>
</li>
<li>
<p><strong>DECLARATION_OBJECT_URI</strong> The EObject URI of the member declaration</p>
</li>
</ul>
</div>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
</dl>
</div>
<div class="paragraph">
<p>This table shows the access modifier changes to perform to fix the visibility issue while maintaining the strongest access restrictions possible.</p>
</div>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 14.2857%;">
<col style="width: 14.2857%;">
<col style="width: 14.2857%;">
<col style="width: 14.2857%;">
<col style="width: 14.2857%;">
<col style="width: 14.2857%;">
<col style="width: 14.2858%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-center valign-top" rowspan="2"><p class="tableblock"><code>Access Modifier</code></p></td>
<td class="tableblock halign-center valign-top" colspan="6"><p class="tableblock"><code>Accessible From</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Inside Module</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Inside Project</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Vendor Subtypes</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Vendor Projects</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Other Subtypes</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Everywhere</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>private</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>project</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>protected@Internal</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>public@Internal</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>protected</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>public</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>project</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>protected@Internal</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>public@Internal</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>protected</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>public</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>protected@Internal</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>public@Internal</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>protected</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>public</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>protected</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>public@Internal</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>public</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>public@Internal</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>public</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>public</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>public</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-</code></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>Member access modifier changes for quick fixes</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">VIS_ILLEGAL_FUN_ACCESS</dt>
<dd>
<p><code>The function <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>f</mi></math> is not visible.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Change access modifier to protected/public or remove <code>@Internal</code> annotation.</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p>The access modifier has been changed so that <em>f</em> is visible at issue location.</p>
</dd>
<dt class="hdlist1">User Data</dt>
<dd>
<div class="ulist">
<ul>
<li>
<p><strong>ACCESS_SUGGESTION</strong> The most restrictive modifier making the function visible.</p>
</li>
<li>
<p><strong>DECLARATION_OBJECT_URI</strong> The EObject URI of the function declaration</p>
</li>
</ul>
</div>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">VIS_ILLEGAL_TYPE_ACCESS</dt>
<dd>
<p><code>The type <em>T</em> is not visible.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Change access modifier to protected/public or remove <code>@Internal</code> annotation.</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p>The access modifier has been changed so that <em>T</em> is visible at issue location.</p>
</dd>
<dt class="hdlist1">User Data</dt>
<dd>
<p>see VIS_ILLEGAL_FUN_ACCESS</p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">VIS_ILLEGAL_VARIABLE_ACCESS</dt>
<dd>
<p><code>The variable <em>v</em> is not visible.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Change access modifier to protected/public or remove <code>@Internal</code> annotation.</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p>Module containing <em>v</em> is writeable.</p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p>The access modifier has been changed so that <em>v</em> is visible at issue location.</p>
</dd>
<dt class="hdlist1">User Data</dt>
<dd>
<p>see VIS_ILLEGAL_FUN_ACCESS</p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
</dl>
</div>
<div class="paragraph">
<p>For type, variable and function visibility issues the following changes have to be made to solve the visibility issue:</p>
</div>
<table id="tab:typeAccessControl" class="tableblock frame-all grid-all spread">
<caption class="title">Table 1. Type,function and variable access modifier changes for quick fixes</caption>
<colgroup>
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
<col style="width: 20%;">
</colgroup>
<tbody>
<tr>
<th class="tableblock halign-center valign-top" rowspan="2"><p class="tableblock">Access Modifier</p></th>
<th class="tableblock halign-center valign-top" colspan="4"><p class="tableblock">Accessible From</p></th>
</tr>
<tr>
<th class="tableblock halign-center valign-top"><p class="tableblock">Module</p></th>
<th class="tableblock halign-center valign-top"><p class="tableblock">Project</p></th>
<th class="tableblock halign-left valign-top"><p class="tableblock">Vendor</p></th>
<th class="tableblock halign-left valign-top"><p class="tableblock">World</p></th>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>private</code></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export project</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export public@Internal</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export public</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>project</code></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export project</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export public@Internal</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export public</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export project</code></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export public@Internal</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export public</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export public@Internal</code></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export public</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export public</code></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-center valign-top"><p class="tableblock"><code>-</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>export public</code></p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect4">
<h5 id="sec:Classifier_Issues"><a class="anchor" href="#sec:Classifier_Issues"></a><a class="link" href="#sec:Classifier_Issues">3.2.2.4. Classifier Issues</a></h5>
<div class="dlist">
<dl>
<dt class="hdlist1">CLF_EXTEND_FINAL</dt>
<dd>
<p><code>Cannot extend final class <em>C</em>.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Remove <code>@Final</code> annotation in class <em>C</em></p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mo>¬</mo><mi>C</mi><mo>.</mo><mi>f</mi><mi>i</mi><mi>n</mi><mi>a</mi><mi>l</mi></math></p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_OBSERVABLE_MISSING</dt>
<dd>
<p><code>Class <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> extends observable class <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math> and must therefore be annotated with @Observable.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Add <code>@Obervable</code> annotation in class <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math></p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0.</mn></msub><mi>o</mi><mi>b</mi><mi>s</mi><mi>e</mi><mi>r</mi><mi>v</mi><mi>a</mi><mi>b</mi><mi>l</mi><mi>e</mi></math></p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_OVERRIDE_ANNOTATION</dt>
<dd>
<p><code>The <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> overriding <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math> must be annotated with @Override.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Add <code>@Override</code> annotation to <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math></p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Label</dt>
<dd>
<p><code>Add @Override</code></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0.</mn></msub><mi>o</mi><mi>v</mi><mi>e</mi><mi>r</mi><mi>r</mi><mi>i</mi><mi>d</mi><mi>e</mi></math></p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_OVERRIDE_FINAL</dt>
<dd>
<p><code>The <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> cannot override final <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math>.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Remove <code>@Final</code> annotation in <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math></p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mo>¬</mo><msub><mi>e</mi><mn>1.</mn></msub><mi>f</mi><mi>i</mi><mi>n</mi><mi>a</mi><mi>l</mi></math></p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_OVERRIDE_VISIBILITY</dt>
<dd>
<p><code>The <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> cannot reduce the visibility of <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math>.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Set access modifier of <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> to access modifier of <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math></p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0.</mn></msub><mi>a</mi><mi>c</mi><mi>c</mi><mo>=</mo><mo>=</mo><msub><mi>e</mi><mn>1.</mn></msub><mi>a</mi><mi>c</mi><mi>c</mi></math></p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_OVERRIDE_NON_EXISTENT</dt>
<dd>
<p><code>The <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math> must override or implement a <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> from a super class, consumed role or implemented interface.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Remove <code>@Override</code> annotation in <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math></p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Label</dt>
<dd>
<p><code>Remove @Override</code></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mo>¬</mo><msub><mi>e</mi><mn>1.</mn></msub><mi>o</mi><mi>v</mi><mi>e</mi><mi>r</mi><mi>r</mi><mi>i</mi><mi>d</mi><mi>e</mi></math></p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_REDEFINED_TYPE_NOT_SAME_TYPE</dt>
<dd>
<p><code>Type of <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> must equal type of <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math> <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>2</mn></msub></math>.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Set declared type of <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> to declared type of <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>2</mn></msub></math></p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>τ</mi><msub><mi>e</mi><mn>0</mn></msub><mo>=</mo><msub><mi>e</mi><mn>2</mn></msub></math></p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_REDEFINED_MEMBER_TYPE_INVALID</dt>
<dd>
<p><code>Type of <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> does not conform to <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>2</mn></msub></math> <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math>: <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>3</mn></msub></math>.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Set declared type of <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> to declared type of <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math></p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>τ</mi><msub><mi>e</mi><mn>0</mn></msub><mo>=</mo><msub><mi>e</mi><mn>1</mn></msub></math></p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_REDEFINED_METHOD_TYPE_CONFLICT</dt>
<dd>
<p><code>Signature of <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> does not conform to <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math> <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>2</mn></msub></math>: <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>3</mn></msub></math>.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Set declared type of <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> to declared type of <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>2</mn></msub></math></p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>τ</mi><msub><mi>e</mi><mn>0</mn></msub><mo>=</mo><msub><mi>e</mi><mn>2</mn></msub></math></p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_MISSING_IMPLEMENTATION</dt>
<dd>
<p><code>Class <em>C</em> must either be defined abstract or implement <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>m</mi></math>.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Declare <em>C</em> as abstract</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>C</mi><mo>.</mo><mi>a</mi><mi>b</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>a</mi><mi>c</mi><mi>t</mi></math></p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_ABSTRACT_BODY</dt>
<dd>
<p><code>Abstract methods do not specify a body.</code> for method <em>M</em></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Remove abstract annotation from method.</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mo>¬</mo><mi>M</mi><mo>.</mo><mi>a</mi><mi>b</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>a</mi><mi>c</mi><mi>t</mi></math></p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_ABSTRACT_MISSING</dt>
<dd>
<p><code>The abstract <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math> in class <em>C</em> can only be defined in an abstract class.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Declare <em>C</em> as abstract</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>C</mi><mo>.</mo><mi>a</mi><mi>b</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>a</mi><mi>c</mi><mi>t</mi></math></p>
</dd>
<dt class="hdlist1">Multi appliable</dt>
<dd>
<p>false</p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_MISSING_BODY</dt>
<dd>
<p><code>The <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math> has to have either a body or must be defined abstract.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Declare <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math> as abstract</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1.</mn></msub><mi>a</mi><mi>b</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>a</mi><mi>c</mi><mi>t</mi></math></p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_EXT_EXTERNAL_N4JSD</dt>
<dd>
<p><code><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> declared as external have to be placed in a file with file extension ’n4jsd’.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Remove external annotation</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mo>¬</mo><msub><mi>e</mi><mn>0.</mn></msub><mi>e</mi><mi>x</mi><mi>t</mi><mi>e</mi><mi>r</mi><mi>n</mi><mi>a</mi><mi>l</mi></math></p>
</dd>
</dl>
</div>
</li>
<li>
<p>Change module file extension to n4jsd</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p>module file extension is n4jsd</p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">CLF_NOT_EXPORTED_NOT_PRIVATE</dt>
<dd>
<p><code>A <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> with visibility <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>1</mn></msub></math> must be marked as exported.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Export <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math></p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>e</mi><mn>0</mn></msub></math> is exported</p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
</dl>
</div>
</div>
<div class="sect4">
<h5 id="sec:Function_Issues"><a class="anchor" href="#sec:Function_Issues"></a><a class="link" href="#sec:Function_Issues">3.2.2.5. Function Issues</a></h5>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
FUN_BLOCK
</td>
<td class="hdlist2">
<p><code>Functions declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function.</code> with function <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>F</mi></math></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Change function declaration to function expression</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
</dl>
</div>
</li>
</ol>
</div>
</td>
</tr>
</table>
</div>
<div class="openblock">
<div class="content">
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mtable><mtr><mtd/><mtd><mo></mo><mstyle mathvariant="monospace"><mtext>Variable</mtext></mstyle><mi> </mi><mi>v</mi><mo></mo><mi>F</mi><mo>.</mo><mi>v</mi><mi>e</mi><mi>e</mi><mi>:</mi></mtd></mtr><mtr><mtd/><mtd><mspace width="3.0em"/><mi>v</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>=</mo><mi>F</mi></mtd></mtr><mtr><mtd/><mtd><mspace width="3.0em"/><mo></mo><mi>v</mi><mo>.</mo><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi><mo>.</mo><mi>μ</mi><mo>=</mo><mstyle mathvariant="monospace"><mtext>FunctionExpression</mtext></mstyle></mtd></mtr><mtr><mtd/><mtd><mspace width="3.0em"/><mo></mo><mi>v</mi><mo>.</mo><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>=</mo><mi>F</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>,</mo><mi>v</mi><mo>.</mo><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi><mo>.</mo><mi>b</mi><mi>o</mi><mi>d</mi><mi>y</mi><mo>=</mo><mi>F</mi><mo>.</mo><mi>b</mi><mi>o</mi><mi>d</mi><mi>y</mi></mtd></mtr></mtable></math>
</div>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Description</dt>
<dd>
<p>Change function declaration to function expression assigned to variable of the function name</p>
</dd>
</dl>
</div>
</div>
<div class="sect4">
<h5 id="sec:Syntax_Issues"><a class="anchor" href="#sec:Syntax_Issues"></a><a class="link" href="#sec:Syntax_Issues">3.2.2.6. Syntax Issues</a></h5>
<div class="dlist">
<dl>
<dt class="hdlist1">AST_STR_FUN_NOT_NESTED</dt>
<dd>
<p><code>Functions must only be declared on script level or as part of other expressions</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Change function declaration to function expression assigned to variable of the function name</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
</dl>
</div>
</li>
</ol>
</div>
</dd>
</dl>
</div>
<div class="openblock">
<div class="content">
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mtable><mtr><mtd/><mtd><mo></mo><mstyle mathvariant="monospace"><mtext>Variable</mtext></mstyle><mi> </mi><mi>v</mi><mo></mo><mi>F</mi><mo>.</mo><mi>v</mi><mi>e</mi><mi>e</mi><mi>:</mi></mtd></mtr><mtr><mtd/><mtd><mspace width="3.0em"/><mi>v</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>=</mo><mi>F</mi></mtd></mtr><mtr><mtd/><mtd><mspace width="3.0em"/><mo></mo><mi>v</mi><mo>.</mo><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi><mo>.</mo><mi>μ</mi><mo>=</mo><mstyle mathvariant="monospace"><mtext>FunctionExpression</mtext></mstyle></mtd></mtr><mtr><mtd/><mtd><mspace width="3.0em"/><mo></mo><mi>v</mi><mo>.</mo><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>=</mo><mi>F</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>,</mo><mi>v</mi><mo>.</mo><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi><mo>.</mo><mi>b</mi><mi>o</mi><mi>d</mi><mi>y</mi><mo>=</mo><mi>F</mi><mo>.</mo><mi>b</mi><mi>o</mi><mi>d</mi><mi>y</mi></mtd></mtr></mtable></math>
</div>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">SYN_MODIFIER_BAD_ORDER</dt>
<dd>
<p><code>Modifiers should appear in this order: O </code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Rearrange access modifiers</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p>Modifiers are in order O</p>
</dd>
<dt class="hdlist1">Description</dt>
<dd>
<p>Reorder the access modifiers to match the N4JS compliant order.</p>
</dd>
</dl>
</div>
</li>
</ol>
</div>
</dd>
</dl>
</div>
</div>
<div class="sect4">
<h5 id="sec:Conversion_Issues"><a class="anchor" href="#sec:Conversion_Issues"></a><a class="link" href="#sec:Conversion_Issues">3.2.2.7. Conversion Issues</a></h5>
</div>
<div class="sect4">
<h5 id="sec:Type_Issues"><a class="anchor" href="#sec:Type_Issues"></a><a class="link" href="#sec:Type_Issues">3.2.2.8. Type Issues</a></h5>
</div>
<div class="sect4">
<h5 id="sec:Expression_Issues"><a class="anchor" href="#sec:Expression_Issues"></a><a class="link" href="#sec:Expression_Issues">3.2.2.9. Expression Issues</a></h5>
<div class="dlist">
<dl>
<dt class="hdlist1">EXP_WRONG_NUMBER_OF_TYPEARGS</dt>
<dd>
<p><code>Incorrect number of type arguments for <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>T</mi></math> <em>C</em>: expected <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>t</mi><mi>p</mi><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi></math>, got <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>t</mi><mi>a</mi><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi></math>.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Remove superfluous arguments</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>t</mi><mi>a</mi><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi><mo>&gt;</mo><mi>t</mi><mi>p</mi><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi></math></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>t</mi><mi>a</mi><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi><mo>=</mo><mi>t</mi><mi>p</mi><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi></math></p>
</dd>
<dt class="hdlist1">Description</dt>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">EXP_NUM_OF_ARGS_TOO_MANY</dt>
<dd>
<p><code>Incorrect number of arguments: expected <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>f</mi><mi>p</mi><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi></math>, got <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>a</mi><mi>r</mi><mi>g</mi><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi></math>.</code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Remove superfluous arguments</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>a</mi><mi>r</mi><mi>g</mi><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi><mo>&gt;</mo><mi>f</mi><mi>p</mi><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi></math></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>a</mi><mi>r</mi><mi>g</mi><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi><mo>=</mo><mi>f</mi><mi>p</mi><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi></math></p>
</dd>
<dt class="hdlist1">Description</dt>
</dl>
</div>
</li>
</ol>
</div>
</dd>
<dt class="hdlist1">EXP_CAST_UNNECESSARY</dt>
<dd>
<p><code>Unnecessary cast from <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>S</mi></math> to <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>T</mi></math></code></p>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Remove cast</p>
<div class="dlist">
<dl>
<dt class="hdlist1">Precondition</dt>
<dd>
<p></p>
</dd>
<dt class="hdlist1">Postcondition</dt>
<dd>
<p>cast removed</p>
</dd>
<dt class="hdlist1">Description</dt>
</dl>
</div>
</li>
</ol>
</div>
</dd>
</dl>
</div>
</div>
<div class="sect4">
<h5 id="sec:Super_Keyword_Issues"><a class="anchor" href="#sec:Super_Keyword_Issues"></a><a class="link" href="#sec:Super_Keyword_Issues">3.2.2.10. Super Keyword Issues</a></h5>
</div>
</div>
</div>
<div class="sect2">
<h3 id="sec:Quick_Assist"><a class="anchor" href="#sec:Quick_Assist"></a><a class="link" href="#sec:Quick_Assist">3.3. Quick Assist</a></h3>
</div>
<div class="sect2 language-n4js">
<h3 id="sec:Cleanup_Operations"><a class="anchor" href="#sec:Cleanup_Operations"></a><a class="link" href="#sec:Cleanup_Operations">3.4. Cleanup Operations</a></h3>
<div class="sect3">
<h4 id="sec:Formatting"><a class="anchor" href="#sec:Formatting"></a><a class="link" href="#sec:Formatting">3.4.1. Formatting</a></h4>
</div>
<div class="sect3">
<h4 id="sec:Organize_Imports"><a class="anchor" href="#sec:Organize_Imports"></a><a class="link" href="#sec:Organize_Imports">3.4.2. Organize Imports</a></h4>
<div class="paragraph">
<p>Import statements can be cleaned up or automatically inserted by invoking <code>Organize Imports</code>. <code>Organize Imports</code> is available in the context menu <code>Source / Organise imports</code> , in menu <code>Source &gt; Organize imports</code> or by hitting <kbd>Cmd</kbd> + <kbd>Option</kbd> +<kbd>O</kbd> (Win/Linux - <kbd>Ctrl</kbd> +<kbd>Alt</kbd> +<kbd>O</kbd>).</p>
</div>
<div class="paragraph">
<p>For a valid file without errors, this will result in the following actions:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Unused explicit imports will be removed.</p>
</li>
<li>
<p>Unused wildcard imports will be removed.</p>
</li>
<li>
<p>In each import statement the imported elements will be lexicographically sorted depending on the imported element’s name.</p>
</li>
<li>
<p>All import statements will be lexicographically sorted depending on the module specifier as major and the element name as minor key.</p>
</li>
<li>
<p>All import statements will be moved to the top of the file.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>For a file with error-conditions of unresolved references, this will result in the automatic actions:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>All ambiguous wildcard imports will be presented in one dialog, requesting the user to resolve the ambiguity.</p>
</li>
<li>
<p>Each uniquely resolvable <code>unresolved Classifier</code> will be added by a named import. The search scope is limited to the dependencies declared in the current project-setup.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>No action will be taken, if &#8230;&#8203;</p>
</div>
<div class="ulist">
<ul>
<li>
<p>a classifier with name <code>X</code> is already imported by name from a module <code>A</code> and a unknown member of this classifier is marked. Even though the import of <code>X</code> from a different module <code>B</code> could remove this error, the semantic consequences could not be evaluated. The state will be left as-is.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>If more then one option leads to a possible resolution the situation should be clarified using quick-fixes, e.g. if &#8230;&#8203;</p>
</div>
<div class="ulist">
<ul>
<li>
<p>more then one module provides an element, which would render a formerly unresolved reference to be valid.</p>
</li>
<li>
<p>for a wildcard-imported element <code>X</code> there are unknown members and a different module provides an element <code>X</code> containing the missing members. In such a case a named import of <code>X</code> would be proposed, optionally using an alias.</p>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_wizards"><a class="anchor" href="#_wizards"></a><a class="link" href="#_wizards">4. Wizards</a></h2>
<div class="sectionbody">
<div class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<i class="fa icon-warning" title=""></i>
</td>
<td class="content">
Some descriptions may be outdated.
</td>
</tr>
</table>
</div>
<div class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<i class="fa icon-warning" title=""></i>
</td>
<td class="content">
All requirement sections are not linked to real issues. They were left here as an example and to complete the issues.
</td>
</tr>
</table>
</div>
<div class="sect2">
<h3 id="sec:N4JS_Project_Wizard"><a class="anchor" href="#sec:N4JS_Project_Wizard"></a><a class="link" href="#sec:N4JS_Project_Wizard">4.1. N4JS Project Wizard</a></h3>
<div class="paragraph">
<p>Wizard creates a new N4JS project.</p>
</div>
<div class="paragraph">
<p>The following information is to be specified by the user:</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Project Name
</td>
<td class="hdlist2">
<p>string, name of project</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Default Location
</td>
<td class="hdlist2">
<p>boolean, true by default</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Location
</td>
<td class="hdlist2">
<p>string, computed default location, if user set location then default location flag must be false</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Project Type
</td>
<td class="hdlist2">
<p>enumeration, the type of the new project</p>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>The following files are to be created:</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Project Folder
</td>
<td class="hdlist2">
<p>with name of project at given location</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Manifest
</td>
<td class="hdlist2">
<p>with default project structure and name</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Source Folder
</td>
<td class="hdlist2">
<p>default source folder (src)</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Output Folder
</td>
<td class="hdlist2">
<p>default source folder (src-gen)</p>
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="sec:Empty_N4JS_File"><a class="anchor" href="#sec:Empty_N4JS_File"></a><a class="link" href="#sec:Empty_N4JS_File">4.2. Empty N4JS File</a></h3>
<div class="paragraph">
<p>The following information is to be specified by the user:</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Package Name
</td>
<td class="hdlist2">
<p>dot separated name of the package, empty by default (or set to the package/folder selected in the navigator)</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Module Name
</td>
<td class="hdlist2">
<p>string, name of the module – must be a valid module name without extension</p>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>The following files are to be created:</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Package Folder(s)
</td>
<td class="hdlist2">
<p>if folders representing package structure do not exist, they are to be created</p>
</td>
</tr>
<tr>
<td class="hdlist1">
Module File
</td>
<td class="hdlist2">
<p>empty file with name of module and extension <code>n4js</code> in the appropriate package folder</p>
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="sec:Empty_JS_File"><a class="anchor" href="#sec:Empty_JS_File"></a><a class="link" href="#sec:Empty_JS_File">4.3. Empty JS File</a></h3>
<div class="paragraph">
<p>Similar to <a href="#sec:Empty_N4JS_File">Empty N4JS File</a> but with the file extension <code>js</code>.</p>
</div>
<div class="sect3">
<h4 id="sec:N4JS_Class_File_Wizard"><a class="anchor" href="#sec:N4JS_Class_File_Wizard"></a><a class="link" href="#sec:N4JS_Class_File_Wizard">4.3.1. N4JS Class Wizard</a></h4>
<div class="paragraph">
<p>It is recommended to define a single classifier in a file, the name of the classifier should have the same name as the file. Based on that assumption, file wizards are provided for N4JS classes, interfaces and enumerations.</p>
</div>
<div class="imageblock center">
<div class="content">
<img src="chapters/06_wizards/fig/newclasswizard.png" alt="newclasswizard">
</div>
</div>
</div>
<div class="sect3">
<h4 id="field-properties"><a class="anchor" href="#field-properties"></a><a class="link" href="#field-properties">4.3.2. Field Properties</a></h4>
<div class="paragraph">
<p><a id="Class_File_Wizard-Project_Field"></a> The New N4JS Class wizard offers following fields:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Project</dt>
<dd>
<p>Specifies the containing project.</p>
</dd>
</dl>
</div>
<div class="openblock requirement">
<div class="content">
<div class="paragraph">
<p><a id="Req-GH-1413a"></a><strong>Req. GH-1413a:</strong> <a href="#Req-GH-1413a">Project constraints</a> (ver. 1)</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Constraints
</td>
<td class="hdlist2">
<div class="olist arabic">
<ol class="arabic">
<li>
<p>It is a path of a valid project in the current workspace</p>
</li>
<li>
<p>This field must not be empty</p>
</li>
</ol>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="openblock requirement">
<div class="content">
<div class="paragraph">
<p><a id="Req-GH-1413b"></a><strong>Req. GH-1413b:</strong> <a href="#Req-GH-1413b">Project browse button</a> (ver. 1)</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Browse Button</dt>
<dd>
<p>Browsing only allows the selection of projects in the current workspace. Project creation is not possible.</p>
</dd>
</dl>
</div>
</div>
</div>
<div class="openblock requirement">
<div class="content">
<div class="paragraph">
<p><a id="Req-GH-1413c"></a><strong>Req. GH-1413c:</strong> <a href="#Req-GH-1413c">Project initial selection inference</a> (ver. 1)</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Initial selection</dt>
<dd>
<p>The project should be derived from the initial selection.</p>
</dd>
</dl>
</div>
</div>
</div>
<div class="openblock requirement">
<div class="content">
<div class="paragraph">
<p><a id="Req-GH-1413d"></a><strong>Req. GH-1413d:</strong> <a href="#Req-GH-1413d">Project content assist</a> (ver. 1)</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Content Assist</dt>
<dd>
<p>Workspace projects</p>
</dd>
</dl>
</div>
</div>
</div>
<div id="Class_File_Wizard-Source_Folder_Field" class="dlist">
<dl>
<dt class="hdlist1">Source folder</dt>
<dd>
<p>Specifies the containing source folder.</p>
</dd>
</dl>
</div>
<div class="openblock requirement">
<div class="content">
<div class="paragraph">
<p><a id="Req-GH-1413e"></a><strong>Req. GH-1413e:</strong> <a href="#Req-GH-1413e">Source folder constraints</a> (ver. 1)</p>
</div>
<div class="hdlist">
<table>
<tr>
<td class="hdlist1">
Constraints
</td>
<td class="hdlist2">
<div class="olist arabic">
<ol class="arabic">
<li>
<p>The folder is listed as source folder in the project manifest</p>
</li>
<li>
<p>This field must not be empty.</p>
</li>
<li>
<p>The name is a valid path that means each segment of the path matches the following expression:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-ebnf" data-lang="ebnf">[a-zA-z_](([\\.][a-zA-z_0-9\\-])|[a-zA-z_0-9\\-])*</code></pre>
</div>
</div>
</li>
</ol>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="openblock requirement">
<div class="content">
<div class="paragraph">
<p><a id="Req-GH-1413f"></a><strong>Req. GH-1413f:</strong> <a href="#Req-GH-1413f">Source folder browse button</a> (ver. 1)</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Browse Button</dt>
<dd>
<p>Browsing only allows the selection of source folders in the selected project. The dialog should provide a list of all source folders of the selected project. This includes nested source folders. A list element is a relative path of a source folder in the project.</p>
</dd>
</dl>
</div>
</div>
</div>
<div class="openblock requirement">
<div class="content">
<div class="paragraph">
<p><a id="Req-GH-1413g"></a><strong>Req. GH-1413g:</strong> <a href="#Req-GH-1413g">Source folder initial selection inference</a> (ver. 1)</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Initial selection</dt>
<dd>
<p>The source folder field should be derived from the initial selection</p>
</dd>
</dl>
</div>
</div>
</div>
<div class="openblock requirement">
<div class="content">
<div class="paragraph">
<p><a id="Req-GH-1413h"></a><strong>Req. GH-1413h:</strong> <a href="#Req-GH-1413h">Source folder content assist</a> (ver. 1)</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">Content Assist</dt>
<dd>
<p>source folders defined by the project manifest</p>
</dd>
</dl>
</div>
</div>
</div>
<div id="Class_File_Wizard-Module_Specifier_Field" class="dlist">
<dl>
<dt class="hdlist1">Module specifier</dt>
<dd>
<p>Specifies the module specifier. May only specify a module container (a folder) but could also include module name. May also be an already existing module. Does not include the file extension.</p>
</dd>
</dl>
</div>
<div class="openblock requirement">
<div class="content">
<div class="paragraph">
<p><a id="Req-GH-1413i"></a><strong>Req. GH-1413i:</strong> <a href="#Req-GH-1413i">Module specifier constraints</a> (ver. 1)</p>
</div>
<div class="paragraph">
<p>The specifier is a valid module specifier that is
- Segments are separated by the path separator
- No separator at the beginning or end</p>
</div>
</div>
</div>
<div class="openblock requirement">
<div class="content">
<div class="paragraph">
<p><a id="Req-GH-1413j"></a><strong>