259 lines
7.7 KiB
Markdown
259 lines
7.7 KiB
Markdown
# Format Method Parameters
|
|
|
|
Apply consistent method parameter line break formatting across all C# projects in the repository.
|
|
|
|
## Scope: What to Format
|
|
|
|
**ALL projects:**
|
|
|
|
All *.cs files EXCEPT auto-generated code.
|
|
Exclude files with:
|
|
|
|
- "generated", ".g.cs", ".designer.cs" in filename
|
|
- AssemblyInfo.cs files
|
|
- [GeneratedCode] or [GeneratedCodeAttribute]
|
|
- <auto-generated> tags
|
|
- "auto-generated" in headers
|
|
- "This code was generated by a tool"
|
|
|
|
**ONLY format parameter lists in DECLARATIONS:**
|
|
|
|
- ✅ Method declarations (public, private, protected, internal, static, async, virtual, override, abstract, etc.)
|
|
- ✅ Constructor declarations
|
|
- ✅ Local function declarations (functions defined inside methods)
|
|
- ✅ Delegate declarations
|
|
|
|
**DO NOT format parameter lists in INVOCATIONS or EXPRESSIONS:**
|
|
|
|
- ❌ Method calls/invocations (e.g., `.Replace(...)`, `.Substring(...)`)
|
|
- ❌ Constructor invocations (e.g., `new MyClass(...)`)
|
|
- ❌ Ternary operators (e.g., `condition ? value1 : value2`)
|
|
- ❌ Lambda expressions (e.g., `(x, y) => x + y`)
|
|
- ❌ LINQ query expressions
|
|
- ❌ Indexer property declarations (e.g., `this[int x, int y]`)
|
|
|
|
## Formatting Rules
|
|
|
|
### Rule 1: Multiple Parameters
|
|
|
|
Break down **all parameters** if a method has **more than 1 parameter**, with each parameter on its own line.
|
|
|
|
### Rule 2: Single Long Parameter
|
|
|
|
Break down a **single parameter** if the total line length (including indentation) exceeds **80 characters**.
|
|
|
|
## Examples: What TO Format
|
|
|
|
### Method Declarations
|
|
|
|
```csharp
|
|
// No parameters - no break
|
|
public void MyMethod1()
|
|
|
|
// Single short parameter - no break
|
|
public void MyMethod2(int parameter1)
|
|
|
|
// Single parameter, method name long but total < 80 chars - no break
|
|
public void MyLoooooooooooooooooooooooooooooooooooooooonMethod3(int parameter1)
|
|
|
|
// Single parameter, total length > 80 chars - break
|
|
public void MyLooooooooooooooooooooooooooooooooooooooooooonMethod4(
|
|
int parameter1)
|
|
|
|
// 2 parameters - break all
|
|
public void MyMethod5(
|
|
int parameter1,
|
|
int parameter2)
|
|
|
|
// 3+ parameters - break all
|
|
public void MyMethod6(
|
|
int parameter1,
|
|
int parameter2,
|
|
int parameter3)
|
|
```
|
|
|
|
### Constructor Declarations
|
|
|
|
```csharp
|
|
// Single parameter - no break
|
|
public MyClass(string name)
|
|
|
|
// Multiple parameters - break all
|
|
public MyClass(
|
|
string name,
|
|
int age,
|
|
bool isActive)
|
|
```
|
|
|
|
### Local Function Declarations
|
|
|
|
```csharp
|
|
public void OuterMethod()
|
|
{
|
|
// Local function with multiple parameters - break all
|
|
void LocalFunction(
|
|
int param1,
|
|
string param2)
|
|
{
|
|
// implementation
|
|
}
|
|
}
|
|
```
|
|
|
|
### Delegate Declarations
|
|
|
|
```csharp
|
|
// Multiple parameters - break all
|
|
public delegate void MyEventHandler(
|
|
object sender,
|
|
EventArgs e);
|
|
|
|
// Single parameter - no break
|
|
public delegate void SimpleHandler(string message);
|
|
```
|
|
|
|
## Examples: What NOT TO Format
|
|
|
|
**These should remain unchanged - do not modify invocations or expressions:**
|
|
|
|
```csharp
|
|
// ❌ Method invocations - DO NOT format these
|
|
var result = assembly.GetBeautifiedName().Replace("Api", "API", StringComparison.Ordinal);
|
|
|
|
var name = someObject.SomeMethod(arg1, arg2, arg3);
|
|
|
|
// ❌ Constructor invocations - DO NOT format these
|
|
var obj = new MyClass(param1, param2, param3);
|
|
|
|
// ❌ Ternary operators - DO NOT format these
|
|
return condition ? value1 : value2;
|
|
|
|
return removeLastVerb
|
|
? assemblyName.Substring(0, assemblyName.LastIndexOf(' '))
|
|
: assemblyName;
|
|
|
|
// ❌ Lambda expressions - DO NOT format these
|
|
var filtered = items.Where((item, index) => item.IsActive && index > 0);
|
|
|
|
// ❌ LINQ expressions - DO NOT format these
|
|
var query = from item in items
|
|
where item.IsActive
|
|
select new { item.Name, item.Value };
|
|
|
|
// ❌ Indexer declarations - DO NOT format these
|
|
public string this[int row, int column]
|
|
{
|
|
get => matrix[row, column];
|
|
}
|
|
```
|
|
|
|
## Execution Instructions
|
|
|
|
### 1. Scan for C# files
|
|
|
|
Find all `.cs` files in the repository
|
|
|
|
### 2. Identify DECLARATIONS (not invocations)
|
|
|
|
**Look for these patterns to identify declarations:**
|
|
|
|
**Method declarations:**
|
|
|
|
- Lines starting with access modifiers: `public`, `private`, `protected`, `internal`
|
|
- Lines with method modifiers: `static`, `virtual`, `override`, `abstract`, `async`, `sealed`
|
|
- Pattern: `[modifiers] [return-type] [method-name]([parameters])`
|
|
- Must have a return type (or `void`) before the method name
|
|
- Usually followed by `{`, `;`, or `=>`
|
|
|
|
**Constructor declarations:**
|
|
|
|
- Pattern: `[modifiers] [class-name]([parameters])`
|
|
- Class name matches the containing class
|
|
- No return type before the name
|
|
|
|
**Local function declarations:**
|
|
|
|
- Found inside method bodies
|
|
- Pattern: `[return-type] [function-name]([parameters])`
|
|
- Usually indented inside a method
|
|
|
|
**Delegate declarations:**
|
|
|
|
- Pattern: `[modifiers] delegate [return-type] [delegate-name]([parameters]);`
|
|
- Contains the `delegate` keyword
|
|
|
|
**Key distinction from invocations:**
|
|
|
|
- Declarations have modifiers (public, private, static, etc.) OR are preceded by a type
|
|
- Invocations follow a `.` (member access), are on the right side of `=`, or are arguments to other methods
|
|
- Invocations do NOT have return types or access modifiers
|
|
|
|
### 3. Apply formatting rules
|
|
|
|
**For each declaration found:**
|
|
|
|
- If 2+ parameters: break all parameters onto separate lines
|
|
- If 1 parameter: break only if total line length > 80 characters
|
|
- Ensure proper indentation (4 spaces per indentation level)
|
|
- Place opening parenthesis `(` on same line as method name
|
|
- Place each parameter on its own line with proper indentation
|
|
- Keep closing parenthesis `)` on same line as last parameter
|
|
|
|
### 4. Process in batches
|
|
|
|
Work on files in manageable batches (e.g., 10-20 files at a time)
|
|
|
|
### 5. Verify after each batch
|
|
|
|
Run `dotnet build` to ensure no syntax errors
|
|
|
|
### 6. Track progress
|
|
|
|
Use todo list to track which files have been processed
|
|
|
|
### 7. Final verification
|
|
|
|
Run full test suite after all changes complete
|
|
|
|
## Important Notes
|
|
|
|
- **Preserve all code logic and comments**
|
|
- **Maintain existing indentation style** (spaces vs tabs)
|
|
- **Handle edge cases**: attributes, generic types, default values, nullable types, ref/out/in parameters
|
|
- **Do not modify method bodies** - only parameter declarations
|
|
- **Do not modify method invocations** - only declarations
|
|
- **Leave ternary operators unchanged**
|
|
- **Leave lambda expressions unchanged**
|
|
- **Leave LINQ expressions unchanged**
|
|
- **If uncertain whether something is a declaration or invocation**, skip it and flag for manual review
|
|
|
|
## Pattern Recognition Examples
|
|
|
|
### ✅ These are DECLARATIONS (format these)
|
|
|
|
```csharp
|
|
public void MyMethod(int x, int y) // Method declaration
|
|
private async Task<string> GetDataAsync(string id) // Async method declaration
|
|
protected virtual bool TryParse(string input, out int result) // Virtual method with out param
|
|
internal static MyClass Create(string name, int age) // Static method declaration
|
|
public MyClass(string name, int age) // Constructor declaration
|
|
delegate void EventHandler(object sender, EventArgs e) // Delegate declaration
|
|
|
|
void LocalFunc(int a, int b) // Local function (inside a method)
|
|
{
|
|
// ...
|
|
}
|
|
```
|
|
|
|
### ❌ These are INVOCATIONS or EXPRESSIONS (do NOT format)
|
|
|
|
```csharp
|
|
var result = MyMethod(x, y); // Method invocation
|
|
var name = assembly.GetName().Replace("old", "new", StringComparison.Ordinal); // Chained invocations
|
|
var obj = new MyClass(name, age); // Constructor invocation
|
|
return condition ? value1 : value2; // Ternary operator
|
|
var lambda = (int x, int y) => x + y; // Lambda expression
|
|
items.Where((item, index) => item.IsActive) // Lambda in method call
|
|
var value = this[row, column]; // Indexer usage
|
|
```
|