class

Analyzer::CSharp::Carter

Inherits Analyzer::CSharp::MinimalApiSupport < Analyzer::CSharp::Common < Analyzer < FileHelper < Reference < Object

Extracts endpoints from Carter (https://github.com/CarterCommunity/Carter) modules. A Carter module is a class that either implements ICarterModule or derives from the CarterModule base class, and registers minimal-API routes inside AddRoutes(IEndpointRouteBuilder).

CarterModule additionally takes a base path through its constructor (public DirectorsModule() : base("/directors")), which every route in that module hangs off. Modules using that base were previously invisible to this analyzer (it required the literal string ICarterModule), so they fell through to cs_aspnet_core_minimal_api, which emitted their routes without the base path — GET / and GET /qs instead of GET /directors and GET /directors/qs.

Route parsing itself is the same job the minimal-API analyzer does, so it runs on the shared MinimalApiSupport helpers with the module base path passed in as a prefix. That also brings delegate parameter binding, MapGroup composition, method-group handlers and generic MapPut<T>("/x", …) registrations to Carter, none of which the previous hand-rolled copy supported.

Extraction is scoped to each module's AddRoutes body so MapGroup prefixes and base paths don't leak between modules declared in one file.

Constants

ADD_ROUTES_RE = /\bAddRoutes\s*\(/
BASE_PATH_RE = /:\s*base\s*\(\s*@?"([^"]*)"/

public DirectorsModule() : base("/directors") — Carter's constructor base path. base() with no literal leaves the prefix empty.

MODULE_CLASS_RE = /\bclass\s+(\w+)(?:\s*<[^>]*>)?\s*:[^{]*\bI?CarterModule\b/

class X : ICarterModule / class X : CarterModule / with generics or extra interfaces in the base list.

Class methods

tech_name
Source

Instance methods

analyze
Source
tech

Instance-side view of the same declaration. The per-file rescues live on this base class, which has no way to name the analyzer that is running inside them, so a skipped file could not be attributed to a tech. Deriving it from analyzer_for keeps the name written exactly once.

Source