Files
gh-atc-net-atc-agentic-tool…/commands/format-params.md
2025-11-29 17:58:38 +08:00

7.7 KiB

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]
  • 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

// 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

// Single parameter - no break
public MyClass(string name)

// Multiple parameters - break all
public MyClass(
    string name,
    int age,
    bool isActive)

Local Function Declarations

public void OuterMethod()
{
    // Local function with multiple parameters - break all
    void LocalFunction(
        int param1,
        string param2)
    {
        // implementation
    }
}

Delegate Declarations

// 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:

// ❌ 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)

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)

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