blob: 592a61d9ff5db7a3a691387d693a2617b39ec1d5 [file] [log] [blame]
<?php
$title="WebKit Coding Style Guidelines";
include("../header.inc");
?>
<style type="text/css">
pre .code {
background-color: #F2F2F2;
}
.right {
color: #080 !important;
}
.wrong {
color: #f00 !important;
}
</style>
<h2>WebKit Coding Style Guidelines</h2>
<h3>Indentation</h3>
<ol>
<li> Use spaces, not tabs. Tabs should only appear in files that require them for semantic meaning, like Makefiles.
</li>
<li> The indent size is 4 spaces.
<h4 class="right">Right:</h4>
<pre class="code">
int main()
{
return 0;
}
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
int main()
{
return 0;
}
</pre>
</li>
<li>In a header, code inside a namespace should be indented.
<h4 class="right">Right:</h4>
<pre class="code">
// Document.h
namespace WebCore {
class Document {
Document();
...
};
} // namespace WebCore
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
// Document.h
namespace WebCore {
class Document {
Document();
...
};
} // namespace WebCore
</pre>
</li>
<li>In an implementation file (files with the extension .cpp, .c or .mm), code inside a namespace should <em>not</em> be indented.
<h4 class="right">Right:</h4>
<pre class="code">
// Document.cpp
namespace WebCore {
Document::Document()
{
...
}
} // namespace WebCore
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
// Document.cpp
namespace WebCore {
Document::Document()
{
...
}
} // namespace WebCore
</pre>
</li>
<li>A case label should line up with its switch statement. The case statement is indented.
<h4 class="right">Right:</h4>
<pre class="code">
switch (condition) {
case fooCondition:
case barCondition:
i++;
break;
default:
i--;
}
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
switch (condition) {
case fooCondition:
case barCondition:
i++;
break;
default:
i--;
}
</pre>
</li>
<li>Boolean expressions at the same nesting level that span multiple lines should
have their operators on the left side of the line instead of the right side.
<h4 class="right">Right:</h4>
<pre class="code">
return attr->name() == srcAttr
|| attr->name() == lowsrcAttr
|| (attr->name() == usemapAttr && attr->value().domString()[0] != '#');
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
return attr->name() == srcAttr ||
attr->name() == lowsrcAttr ||
(attr->name() == usemapAttr && attr->value().domString()[0] != '#');
</pre>
</li>
</ol>
<h3>Spacing</h3>
<ol>
<li>Do not place spaces around unary operators.
<h4 class="right">Right:</h4>
<pre class="code">
i++;
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
i ++;
</pre>
</li>
<li><em>Do</em> place spaces around binary and ternary operators.
<h4 class="right">Right:</h4>
<pre class="code">
y = m * x + b;
f(a, b);
c = a | b;
return condition ? 1 : 0;
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
y=m*x+b;
f(a,b);
c = a|b;
return condition ? 1:0;
</pre>
</li>
<li>Place spaces between control statements and their parentheses.
<h4 class="right">Right:</h4>
<pre class="code">
if (condition)
doIt();
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
if(condition)
doIt();
</pre>
</li>
<li>Do not place spaces between a function and its parentheses, or between a parenthesis and its content.
<h4 class="right">Right:</h4>
<pre class="code">
f(a, b);
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
f (a, b);
f( a, b );
</pre>
</li>
</ol>
<h3>Line breaking</h3>
<ol>
<li>Each statement should get its own line.
<h4 class="right">Right:</h4>
<pre class="code">
x++;
y++;
if (condition)
doIt();
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
x++; y++;
if (condition) doIt();
</pre>
</li>
<li>An <code>else</code> statement should go on the same line as a preceding close brace if one is present,
else it should line up with the <code>if</code> statement.
<h4 class="right">Right:</h4>
<pre class="code">
if (condition) {
...
} else {
...
}
if (condition)
doSomething();
else
doSomethingElse();
if (condition)
doSomething();
else {
...
}
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
if (condition) {
...
}
else {
...
}
if (condition) doSomething(); else doSomethingElse();
if (condition) doSomething(); else {
...
}
</pre>
</li>
<li>An <code>else if</code> statement should be written as an <code>if</code> statement when the prior <code>if</code> concludes with a <code>return</code> statement.
<h4 class="right">Right:</h4>
<pre class="code">
if (condition) {
...
return someValue;
}
if (condition) {
...
}
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
if (condition) {
...
return someValue;
} else if (condition) {
...
}
</pre>
</li>
</ol>
<h3>Braces</h3>
<ol>
<li> Function definitions: place each brace on its own line.
<h4 class="right">Right:</h4>
<pre class="code">
int main()
{
...
}
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
int main() {
...
}
</pre>
</li>
<li> Other braces: place the open brace on the line preceding the code block; place the close brace on its own line.
<h4 class="right">Right:</h4>
<pre class="code">
class MyClass {
...
};
namespace WebCore {
...
}
for (int i = 0; i &lt; 10; i++) {
...
}
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
class MyClass
{
...
};
</pre>
<li>One-line control clauses should not use braces unless comments are included
or a single statement spans multiple lines.
<h4 class="right">Right:</h4>
<pre class="code">
if (condition)
doIt();
if (condition) {
// Some comment
doIt();
}
if (condition) {
myFunction(reallyLongParam1, reallyLongParam2, ...
reallyLongParam5);
}
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
if (condition) {
doIt();
}
if (condition)
// Some comment
doIt();
if (condition)
myFunction(reallyLongParam1, reallyLongParam2, ...
reallyLongParam5);
</pre>
</li>
<li>Control clauses without a body should use empty braces:
<h4 class="right">Right:</h4>
<pre class="code">
for ( ; current; current = current->next) { }
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
for ( ; current; current = current->next);
</pre>
</li>
</ol>
<h3>Null, false and 0</h3>
<ol>
<li>In C++, the null pointer value should be written as <code>0</code>. In C, it should be written as <code>NULL</code>. In Objective-C and Objective-C++, follow the guideline for C or C++, respectively, but use <code>nil</code> to represent a null Objective-C object.</li>
<li>C++ and C <code>bool</code> values should be written as <code>true</code> and <code>false</code>. Objective-C <code>BOOL</code> values should be written as <code>YES</code> and <code>NO</code>.</li>
<li>Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.<br>
<h4 class="right">Right:</h4>
<pre class="code">
if (condition)
doIt();
if (!ptr)
return;
if (!count)
return;
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
if (condition == true)
doIt();
if (ptr == NULL)
return;
if (count == 0)
return;
</pre>
</li>
<li>In Objective-C, instance variables are initialized to zero automatically. Don't add explicit initializations to nil or NO in an init method.</li>
</ol>
<h3>Names</h3>
<ol>
<li>Use CamelCase. Capitalize the first letter, including all letters in an acronym, in a class, struct, protocol, or namespace name. Lower-case the first letter, including all letters in an acronym, in a variable or function name.
<h4 class="right">Right:</h4>
<pre class="code">
struct Data;
size_t bufferSize;
class HTMLDocument;
String mimeType();
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
struct data;
size_t buffer_size;
class HtmlDocument;
String MIMEType();
</pre>
</li>
<li>Use full words, except in the rare case where an abbreviation would be more canonical and easier to understand.
<h4 class="right">Right:</h4>
<pre class="code">
size_t characterSize;
size_t length;
short tabIndex; // more canonical
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
size_t charSize;
size_t len;
short tabulationIndex; // bizarre
</pre>
</li>
<li>Prefix C++ data members with "m_".
<h4 class="right">Right:</h4>
<pre class="code">
class String {
...
short m_length;
};
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
class String {
...
short length;
};
</pre>
</li>
<li>Prefix Objective-C instance variables with "_".
<h4 class="right">Right:</h4>
<pre class="code">
@class String
...
short _length;
@end
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
@class String
...
short length;
@end
</pre>
</li>
<li>Precede boolean values with words like "is" and "did".
<h4 class="right">Right:</h4>
<pre class="code">
bool isValid;
bool didSendData;
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
bool valid;
bool sentData;
</pre>
</li>
<li>Precede setters with the word "set". Use bare words for getters. Setter and getter names should match the names of the variables being set/gotten.
<h4 class="right">Right:</h4>
<pre class="code">
void setCount(size_t); // sets m_count
size_t count(); // returns m_count
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
void setCount(size_t); // sets m_theCount
size_t getCount();
</pre>
</li>
<li>Use descriptive verbs in function names.
<h4 class="right">Right:</h4>
<pre class="code">
bool convertToASCII(short*, size_t);
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
bool toASCII(short*, size_t);
</pre>
</li>
<li>Leave meaningless variable names out of function declarations.
<h4 class="right">Right:</h4>
<pre class="code">
void setCount(size_t);
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
void setCount(size_t count);
</pre>
</li>
<li>Objective-C method names should follow the Cocoa naming guidelines &mdash;
they should read like a phrase and each piece of the selector should
start with a lowercase letter and use intercaps.</li>
<li>Enum members should user InterCaps with an initial capital letter.</li>
<li>Prefer const to #define. Prefer inline functions to macros.</li>
<li>#defined constants should use all uppercase names with words separated by underscores.</li>
<li> Macros that expand to function calls or other non-constant computation: these
should be named like functions, and should have parentheses at the end, even if
they take no arguments (with the exception of some special macros like ASSERT).
Note that usually it is preferable to use an inline function in such cases instead of a macro.<br>
<h4 class="right">Right:</h4>
<pre class="code">
#define WBStopButtonTitle() \
NSLocalizedString(@"Stop", @"Stop button title")
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
#define WB_STOP_BUTTON_TITLE \
NSLocalizedString(@"Stop", @"Stop button title")
#define WBStopButtontitle \
NSLocalizedString(@"Stop", @"Stop button title")
</pre>
</li>
<li>#define, #ifdef "header guards" should be named exactly the same as the file (including case), replacing the '.' with a '_'.
<h4 class="right">Right:</h4>
<pre class="code">
// HTMLDocument.h
#ifndef HTMLDocument_h
#define HTMLDocument_h
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
// HTMLDocument.h
#ifndef _HTML_DOCUMENT_H_
#define _HTML_DOCUMENT_H_
</pre>
</li>
</ol>
<h3>Other Punctuation</h3>
<ol>
<li>Constructors for C++ classes should initialize all of their members using C++
initializer syntax. Each member (and superclass) should be indented on a separate
line, with the colon or comma preceding the member on that line.
<h4 class="right">Right:</h4>
<pre class="code">
MyClass::MyClass(Document* doc)
: MySuperClass()
, m_myMember(0)
, m_doc(doc)
{
}
MyOtherClass::MyOtherClass()
: MySuperClass()
{
}
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
MyClass::MyClass(Document* doc) : MySuperClass()
{
m_myMember = 0;
m_doc = doc;
}
MyOtherClass::MyOtherClass() : MySuperClass() {}
</pre>
<li>Pointer types in non-C++ code &mdash; Pointer types should be written with a space between the
type and the * (so the * is adjacent to the following identifier if any).
<li>Pointer and reference types in C++ code &mdash; Both pointer types and reference types
should be written with no space between the type name and the * or &amp;.
<h4 class="right">Right:</h4>
<pre class="code">
Image* SVGStyledElement::doSomething(PaintInfo&amp; paintInfo)
{
SVGStyledElement* element = static_cast&lt;SVGStyledElement*>(node());
const KCDashArray&amp; dashes = dashArray();
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
Image *SVGStyledElement::doSomething(PaintInfo &amp;paintInfo)
{
SVGStyledElement *element = static_cast&lt;SVGStyledElement *>(node());
const KCDashArray &amp;dashes = dashArray();
</pre>
</ol>
<h3>#include Statements</h3>
<ol>
<li>All implementation files must #include "config.h" first. Header
files should never include "config.h".
<h4 class="right">Right:</h4>
<pre class="code">
// RenderLayer.h
#include "Node.h"
#include "RenderObject.h"
#include "RenderView.h"
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
// RenderLayer.h
#include "config.h"
#include "RenderObject.h"
#include "RenderView.h"
#include "Node.h"
</pre>
<li>All implementation files must #include the primary header second,
just after "config.h". So for example, Node.cpp should include Node.h first,
before other files. This guarantees that each header's completeness is tested.
This also assures that each header can be compiled without requiring any other
header files be included first.
<li>Other #include statements should be in sorted order (case sensitive, as
done by the command-line sort tool or the Xcode sort selection command).
Don't bother to organize them in a logical order.
<h4 class="right">Right:</h4>
<pre class="code">
// HTMLDivElement.cpp
#include "config.h"
#include "HTMLDivElement.h"
#include "Attribute.h"
#include "HTMLElement.h"
#include "QualifiedName.h"
</pre>
<h4 class="wrong">Wrong:</h4>
<pre class="code">
// HTMLDivElement.cpp
#include "HTMLElement.h"
#include "HTMLDivElement.h"
#include "QualifiedName.h"
#include "Attribute.h"
</pre>
</ol>
<?php
include("../footer.inc");
?>