Complete Statement
Ctrl+Shift+Enter
ReSharper_CompleteStatement
This command inserts necessary syntax elements (parentheses, braces, semicolons etc.) and gets you in position where you can start typing the next statement.
To invoke Complete Statement
- Type the core of a statement (see scenarios below for examples).
- Press Ctrl+Shift+Enter or choose in the main menu. Alternatively, you can press Ctrl+Shift+A, start typing the command name in the pop-up, and then choose it there.
The command is helpful in numerous scenarios, including auto-closing parentheses, adding semicolons, completing if
, while
and for
statements, and more.
For example, whenever you declare a new method, complete statement comes handy after specifying method parameters:
public void Foo(string input
At this point, to start writing the method body, you normally have to:
- Insert a missing parenthesis.
- Press Enter.
- Insert an opening brace.
- Press Enter once again.
With ReSharper, you only have to press Ctrl+Shift+Enter, and it will automatically insert a closing parenthesis, as well as both braces, and put the caret right where you can proceed with writing the method body:
public void Foo(string input)
{
// the caret is here
}
In similar ways, Complete Statement works with the following language constructs:
- Types and type members: class, interface, struct, enum, delegate, field, event, and method declarations.
- Statements:
if
,while
,do
,switch
,using
,lock
,continue
,break
, andreturn
statements;case
anddefault
clauses; conversion of single-line statements to block statements. - Expressions: invocation, element access, string/char literals; object, member, and collection item initializers; expressions that create anonymous types and implicitly typed arrays.
Below, you can find a number of examples of applying the complete statement command in different contexts.
Use case | Before Complete Statement | After Complete Statement |
---|---|---|
Class declaration | public class Foo/*caret*/ | public class Foo
{
/*caret*/
} |
Delegate declaration | delegate void ChangeHandler(object sender/*caret*/ | internal delegate void ChangeHandler(object sender);
/*caret*/ |
Nested method invocation | myVar.DoSomething(foo.Bar(value/*caret*/ | myVar.DoSomething(foo.Bar(value));
/*caret*/ |
if statement | if(myVar != null/*caret*/ | if(myVar != null)
{
/*caret*/
} |
case clause | switch (position)
{
case Position.Last/*caret*/
} | switch (position)
{
case Position.Last:
/*caret*/
} |
Conversion of a single-line statement into block (case A) | if(myVar != null)
position = Position.Last;/*caret*/ | if(myVar != null)
{
position = Position.Last;
/*caret*/
} |
Conversion of a single-line statement into block (case B) | if(myVar != null)
/*caret*/position = Position.Last; | if(myVar != null)
{
/*caret*/
position = Position.Last;
} |
Element access expression | var myValues = new Value[10/*caret*/ | var myValues = new Value[10];
/*caret*/ |
This feature is supported in the following languages and technologies:
The instructions and examples given here address the use of the feature in C#. For details specific to other languages, see corresponding topics in the ReSharper by Language section.