Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "CDT/policy"

< CDT
(Copyright)
(Big update - much old stuff removed, other duplicated stuff removed and pointed at other sources. See Bug 561623)
Line 1: Line 1:
 
== Code Formatting ==
 
== Code Formatting ==
  
* It is recommended to preserve formatting and style of old code when making patches
+
These are the coding style recommendations that are in place with project setting. They are enforced by the [https://github.com/eclipse-cdt/cdt-infra/tree/master/jenkins/pipelines/cdt/verify#cdt-verify-code-cleanliness build process] and auto-save actions in Eclipse.
* It is recommended to use default "Eclipse" code formatting for Java for new code (which is 120 chars line width for code and 80 for comments)
+
 
** Note: Please don't rely completely on Java auto-formatter that is known to be buggy (see [http://bugs.eclipse.org/bugs/show_bug.cgi?id=303519 bug 303519]).
+
* Preserve formatting and style of old code when making patches
 +
* Use default "Eclipse" code formatting for Java for new code
 +
* Organize Imports action on save
 
* It is recommended to use code blocks (curly brackets) for for/while/do/if statement bodies, with the exception of simple terminating statements, i.e. "if (a) return;"
 
* It is recommended to use code blocks (curly brackets) for for/while/do/if statement bodies, with the exception of simple terminating statements, i.e. "if (a) return;"
* It is strongly recommended to use Organize Imports action on save
 
  
 
== Eclipse Java Errors/Warnings ==
 
== Eclipse Java Errors/Warnings ==
  
It is strongly recommended for cdt plugins to override default compiler error/warning and use project specific errors/warnings.
+
All CDT plugins override default compiler error/warning and use project specific errors/warnings. This enforced by the [https://github.com/eclipse-cdt/cdt-infra/tree/master/jenkins/pipelines/cdt/verify#cdt-verify-code-cleanliness build process].
Projects should have the following customizations:
+
 
+
* Method with a constructor name - Error
+
* Assignment has no effect - Error
+
* Possible accidental boolean assignment - Error
+
* finally does not complete normally - Error
+
* Using a char array in string concatenation - Error
+
* Null pointer access - Error
+
* Potential null pointer access - Warning
+
* Unused Import - Error
+
  
All commiters and contributors submitting patches should enable [http://wiki.eclipse.org/PDE/API_Tools/User_Guide#API_Tooling_Setup API tooling] by setting target baseline platform. Do not commit code with API errors.
+
All committers and contributors submitting patches should enable [http://wiki.eclipse.org/PDE/API_Tools/User_Guide#API_Tooling_Setup API tooling] by setting target baseline platform. Do not commit code with API errors.
  
 
'''Patches with errors listed above including API errors will not be accepted without corrections.'''
 
'''Patches with errors listed above including API errors will not be accepted without corrections.'''
  
Committers who wish to keep a plugin warning-free should update the project as follows. These steps turns warnings into errors and leaves everything else in the ignore state. In other words, the idea is not to turn everything into an error, just the things that are set to generate a warning.
+
=== Evolving Warning and Error settings ===
  
# Open project properties > Java Compiler > Errors/Warnings
+
The warnings and error settings can and should be evolved as needed. For example, a bundle with no warning may want to ensure no new warnings are introduced and should change the project specific settings to upgrade those warnings to errors as needed. This change may require changes to the to [https://git.eclipse.org/c/cdt/org.eclipse.cdt.git/tree/releng/scripts/check_code_cleanliness.sh code cleanliness checks] that ensure warnings/errors are at the correct level.
## Turn on Enable project specific settings
+
## Turn on Annotations > Suppress optional errors with '@SuppressWarnings' (new pref in Helios)
+
# Open .setings/org.eclipse.jdt.core.prefs in a text editor and do a find&replace of "=warning" to "=error" (use Replace All)
+
# Turn on project properties > Plug-in Development > API Errors/Warnings > Use project settings
+
# Open .settings/org.eclipse.pde.api.tools.prefs in a text editor and do a find&replace of "=Warning" to "=Error" (use Replace All; 'W' and 'E' must be uppercase)
+
# Turn on project properties > Plug-in Development > Plug-in Manifest Compiler > Use project settings
+
# Open .settings/org.eclipse.pde.prefs in a text editor and do a find&replace of "=1" to "=0" (use Replace All)
+
  
 
== Copyright ==
 
== Copyright ==
Line 59: Line 43:
 
== API ==
 
== API ==
  
There are 3 types of API: Public API, Provisional API and Internal API (aka Private API, aka non API).
+
The Eclipse CDT project follows the same guidelines and policies as the Eclipse Platform project, with exceptions noted below. See [[Eclipse/API_Central|Eclipse API Central] for more details.
Public API is what all client should use, it suppose to be documented (javadoc) and should not change much
+
from version to version. If major version of the plugin changed it may contain API breakage. If minor
+
version of the plugin changed it may contain API extensions (non-breaking changes). There is also some policies about
+
changing API between milestone builds. Provisional API is a public API in making. It does not have to follow versioning and other
+
rules of public API, but other than that, it can be threated as public.
+
  
Examples API breaking change:
 
* Adding a method in interface
 
* Changing method signature
 
* Changing private visibility to any other
 
  
Examples of API extensions:
+
Note: you can still use internal API is you want to, if java visibility allows you (even if it does not, you can hack it, using reflection). The only problem with this approach is that internal API can be changed without notice or trace, so you would have hard time making your code compile or run with new version of the tool. The best approach in this case to submit a bug asking to create an API for functionality you are looking for.
* Adding new extension point
+
* Changing visibility from protected to public
+
* Adding method in a class
+
  
So here is what considered Internal API vs Public vs Provisional for CDT
+
=== Deprecating and Deleting API ===
* Internal API
+
** packages with name *.internal.*, *.examples.*
+
** test projects, releng projects and feature projects
+
** packages which are not exported or X-exported (i.e. not exported as public)
+
** non-java code (i.e. native C code)
+
** private and package private classes and members
+
* Provisional API
+
** packages with names *.provisional*
+
** class that are marked EXPERIMENTAL and all its members
+
  
  <strong>EXPERIMENTAL</strong>. This class or interface has been added as part
+
The Eclipse CDT project follows the same guidelines and policies as the Eclipse Platform project. See [[Eclipse/API_Central/Deprecation_Policy|Deprecation Policy]]. The changes to the policy are:
  of a work in progress. There is no guarantee that this API will work or that
+
  it will remain the same.
+
  
* Public API
+
# Removal of any Eclipse CDT API requires approval from the Eclipse CDT Committers.
** everything which is not internal or provisional and
+
# Announcement must be made on cdt-dev mailing list - it can be additionally made to  cross-project-issues-dev mailing list if there is concern that the impact of such removal would affect other Eclipse projects.
*** has public or protected java visibility
+
# API Changes should be listed in the [[CDT/User/NewInCDT|New and Noteworthy]] wiki page.
*** in public exported package
+
# Porting guide is in CDT's git repo at doc/org.eclipse.cdt.doc.isv/guide/deprecated_API_removals.html
** public API class or interface can also have some usage exceptions:
+
*** classes and members marked @noreference in the javadoc comment cannot be used and not considered public API even if they have public visibility
+
*** classes and interfaces that are marked as @noextend should not be extended
+
*** interfaces that are marked @noimplement should not be implemented
+
  
See also [[Evolving Java-based APIs]].
 
 
Note: you can still use internal API is you want to, if java visibility allows you (even if it does not, you can hack it, using reflection). The only problem with this approach is that internal API can be changed without notice or trace, so you would have hard time making your code compile or run with new version of the tool. The best approach in this case to submit a bug asking to create an API for functionality you are looking for.
 
  
 
=== Using API Tooling ===
 
=== Using API Tooling ===
  
 
All committers and contributors should enable API Tooling when writing patches for CDT.<br>
 
All committers and contributors should enable API Tooling when writing patches for CDT.<br>
 
==== Using Eclipse 4.5.0 and greater ====
 
 
''Starting with Eclipse 4.5.0, it is no longer necessary to download and maintain a separate Eclipse installation for the API baseline. You can simply use a target definition file, as explained below.''
 
  
 
To set up the API baseline, follow these steps:
 
To set up the API baseline, follow these steps:
Line 147: Line 97:
 
* Code inspect the patch, apply and test
 
* Code inspect the patch, apply and test
 
* Commit the patch
 
* Commit the patch
* Set the iplog as follows:
 
** to '-' if the patch came from a committer
 
** to '+' if the patch came from a non-committer.
 
 
* If the patch is > 1,000 lines, it must be submitted for IP review, i.e. CQ in IPZilla. See [[Development_Resources/Automatic_IP_Log]]
 
* If the patch is > 1,000 lines, it must be submitted for IP review, i.e. CQ in IPZilla. See [[Development_Resources/Automatic_IP_Log]]
* Check that all non-committed patches are marked as obsolete
 
 
* Change bug state to fixed. Check again that you set milestone field.
 
* Change bug state to fixed. Check again that you set milestone field.
* Add a comment about where it was fixed (branches) and related notes
 
  
 
== Committing Code ==
 
== Committing Code ==
  
 
* API changes have to be discussed in cdt-dev mailing list before commiting
 
* API changes have to be discussed in cdt-dev mailing list before commiting
* When development reaches cycle where release candidates are built, letter in cdt-dev should be sent for every commit you are making
+
* When development reaches cycle where release candidates are built, email to cdt-dev should be sent for every commit you are making
* Have a bug associated with every commit, with bug number at the beginning of commit comment, e.g.:  
+
* Non-committers must have a bug associated with every non-cosmetic commit, with bug number at the beginning of commit comment, e.g.:  
 
   Bug 12345 fixed that, added this
 
   Bug 12345 fixed that, added this
 
* Post a change for review on gerrit  
 
* Post a change for review on gerrit  
 
* You may not need gerrit review if changes are cosmetic - formatting, warning fixed, copyright, auto-re factoring, typos in strings.
 
* You may not need gerrit review if changes are cosmetic - formatting, warning fixed, copyright, auto-re factoring, typos in strings.
 
== How to add a new feature ==
 
 
* Create a feature project
 
* Copy build.properties, epl-v10.html, feature.properties, feature.xml, license.html from another cdt feature plugin
 
* Open in feature editor and modify all feature specific details including plugin list
 
* Add it to org.eclipse.cdt.repo/category.xml (see how other are done)
 
* Add it to pom.xml file of the parent folder containing the feature. For example, qt/pom.xml needs to be modified if qt/org.eclipse.cdt.qt-feature was being added.
 
 
== How to add a new plugin ==
 
 
* Create a new plugin plugin
 
* Version should be like 1.0.0.qualifier
 
* Edit name and vendor. Externalize string. Bundle-Vendor = Eclipse CDT
 
* Add your plugin to a feature
 
* Open project properties Java Compiler -> Error and Warnings. Check "Enable project specific settings". Go through list of warnings and set some to errors (see above list of recommended settings). Some people prefer zero warning tolerance, in this case all of them should be errors and no warnings.
 
* Make sure all packages are exported (or x-exported). See http://wiki.eclipse.org/Export-Package
 
* Add it to pom.xml file of the parent folder containing the plugin. For example, qt/pom.xml needs to be modified if qt/org.eclipse.cdt.qt.core was being added.
 
  
 
== Version Numbering ==
 
== Version Numbering ==

Revision as of 15:07, 31 March 2020

Code Formatting

These are the coding style recommendations that are in place with project setting. They are enforced by the build process and auto-save actions in Eclipse.

  • Preserve formatting and style of old code when making patches
  • Use default "Eclipse" code formatting for Java for new code
  • Organize Imports action on save
  • It is recommended to use code blocks (curly brackets) for for/while/do/if statement bodies, with the exception of simple terminating statements, i.e. "if (a) return;"

Eclipse Java Errors/Warnings

All CDT plugins override default compiler error/warning and use project specific errors/warnings. This enforced by the build process.

All committers and contributors submitting patches should enable API tooling by setting target baseline platform. Do not commit code with API errors.

Patches with errors listed above including API errors will not be accepted without corrections.

Evolving Warning and Error settings

The warnings and error settings can and should be evolved as needed. For example, a bundle with no warning may want to ensure no new warnings are introduced and should change the project specific settings to upgrade those warnings to errors as needed. This change may require changes to the to code cleanliness checks that ensure warnings/errors are at the correct level.

Copyright

Use eclipse copyright header: http://www.eclipse.org/legal/copyrightandlicensenotice.php. Here is an example:

/********************************************************************************
 * Copyright (c) {date} {owner}[ and others]
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *   {name} - initial API and implementation
 ********************************************************************************/

A contributors line can be added for significant changes in the file but this is optional.

API

The Eclipse CDT project follows the same guidelines and policies as the Eclipse Platform project, with exceptions noted below. See [[Eclipse/API_Central|Eclipse API Central] for more details.


Note: you can still use internal API is you want to, if java visibility allows you (even if it does not, you can hack it, using reflection). The only problem with this approach is that internal API can be changed without notice or trace, so you would have hard time making your code compile or run with new version of the tool. The best approach in this case to submit a bug asking to create an API for functionality you are looking for.

Deprecating and Deleting API

The Eclipse CDT project follows the same guidelines and policies as the Eclipse Platform project. See Deprecation Policy. The changes to the policy are:

  1. Removal of any Eclipse CDT API requires approval from the Eclipse CDT Committers.
  2. Announcement must be made on cdt-dev mailing list - it can be additionally made to cross-project-issues-dev mailing list if there is concern that the impact of such removal would affect other Eclipse projects.
  3. API Changes should be listed in the New and Noteworthy wiki page.
  4. Porting guide is in CDT's git repo at doc/org.eclipse.cdt.doc.isv/guide/deprecated_API_removals.html


Using API Tooling

All committers and contributors should enable API Tooling when writing patches for CDT.

To set up the API baseline, follow these steps:

  1. Select "Window -> Preferences". In the window that opens, select "Plug-in Development -> API Baselines" on the left pane.
  2. Click on "Add Baseline..."
  3. Choose "A target platform" and click Next.
  4. In the next page check the box "cdt-baseline".
  5. Click "Refresh" to download the contents of the target.
  6. Specify a name for this baseline in the top area, like "cdt-baseline" for example.
  7. Click "Finish", then "OK" in the next dialog.

Once this is done, a full build will be triggered. After that, any changes that doesn't follow API rules will be shown as an error.

Note that when a new version of CDT is released, you will need to refresh the baseline

  1. Go back to "Window -> Preferences", "Plug-in Development -> API Baselines"
  2. Select the cdt baseline and click on Edit...
  3. In the next page check the box "cdt-baseline".
  4. Click "Refresh" to update the contents of the target.
  5. Click "Finish", then "OK" in the next dialog.

(In the future, refreshing manually might not be required, see bug 479055)

Javadoc

All public API classes and interfaces must have meaningful javadoc header, as well as all public API members.

Contributing to CDT

See CDT/contributing

Applying the Patch

  • Assign bug to yourself
  • Set target milestone field to release in which patch would be applied, If it is applied in two branches set target milestone to maintenance branch
  • Code inspect the patch, apply and test
  • Commit the patch
  • If the patch is > 1,000 lines, it must be submitted for IP review, i.e. CQ in IPZilla. See Development_Resources/Automatic_IP_Log
  • Change bug state to fixed. Check again that you set milestone field.

Committing Code

  • API changes have to be discussed in cdt-dev mailing list before commiting
  • When development reaches cycle where release candidates are built, email to cdt-dev should be sent for every commit you are making
  • Non-committers must have a bug associated with every non-cosmetic commit, with bug number at the beginning of commit comment, e.g.:
 Bug 12345 fixed that, added this
  • Post a change for review on gerrit
  • You may not need gerrit review if changes are cosmetic - formatting, warning fixed, copyright, auto-re factoring, typos in strings.

Version Numbering

See Eclipse Version Numbering Guildlines

Bugs Workflow

For creating and managing bugs see http://wiki.eclipse.org/CDT/Bugs

Back to the top