Skip to content

Commit a9b1905

Browse files
committed
support aliased FastAPI/APIRouter imports
1 parent d5b1232 commit a9b1905

2 files changed

Lines changed: 45 additions & 2 deletions

File tree

src/core/analyzer.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import type { Tree } from "web-tree-sitter"
66
import { logError } from "../utils/logger"
77
import {
8+
aliasExtractor,
89
collectStringVariables,
910
decoratorExtractor,
1011
findNodesByType,
@@ -42,9 +43,13 @@ export function analyzeTree(tree: Tree, filePath: string): FileAnalysis {
4243
const decoratedDefs = findNodesByType(rootNode, "decorated_definition")
4344
const routes = decoratedDefs.map(decoratorExtractor).filter(notNull)
4445

46+
const aliases = aliasExtractor(rootNode)
47+
4548
// Get all router assignments
4649
const assignments = findNodesByType(rootNode, "assignment")
47-
const routers = assignments.map(routerExtractor).filter(notNull)
50+
const routers = assignments
51+
.map((node) => routerExtractor(node, aliases))
52+
.filter(notNull)
4853

4954
// Get all include_router and mount calls
5055
const callNodes = findNodesByType(rootNode, "call")

src/core/extractors.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,10 @@ function extractTags(listNode: Node): string[] {
237237
.filter((v): v is string => v !== null)
238238
}
239239

240-
export function routerExtractor(node: Node): RouterInfo | null {
240+
export function routerExtractor(
241+
node: Node,
242+
aliasMap?: Map<string, "FastAPI" | "APIRouter">,
243+
): RouterInfo | null {
241244
if (node.type !== "assignment") {
242245
return null
243246
}
@@ -254,6 +257,8 @@ export function routerExtractor(node: Node): RouterInfo | null {
254257
type = "APIRouter"
255258
} else if (funcName === "FastAPI" || funcName === "fastapi.FastAPI") {
256259
type = "FastAPI"
260+
} else if (funcName && aliasMap?.has(funcName)) {
261+
type = aliasMap.get(funcName)!
257262
} else {
258263
return null
259264
}
@@ -476,3 +481,36 @@ export function mountExtractor(node: Node): MountInfo | null {
476481
app: appNode?.text ?? "",
477482
}
478483
}
484+
485+
export function aliasExtractor(
486+
node: Node,
487+
): Map<string, "FastAPI" | "APIRouter"> {
488+
const importAliases = findNodesByType(node, "aliased_import")
489+
490+
const aliasMap = new Map<string, "FastAPI" | "APIRouter">()
491+
492+
for (const node of importAliases) {
493+
const originalNode = node.childForFieldName("name")
494+
const aliasNode = node.childForFieldName("alias")
495+
496+
if (
497+
originalNode?.text === "FastAPI" ||
498+
originalNode?.text === "fastapi.FastAPI"
499+
) {
500+
const alias = aliasNode?.text
501+
if (alias) {
502+
aliasMap.set(alias, "FastAPI")
503+
}
504+
} else if (
505+
originalNode?.text === "APIRouter" ||
506+
originalNode?.text === "fastapi.APIRouter"
507+
) {
508+
const alias = aliasNode?.text
509+
if (alias) {
510+
aliasMap.set(alias, "APIRouter")
511+
}
512+
}
513+
}
514+
515+
return aliasMap
516+
}

0 commit comments

Comments
 (0)