Files
Devour/internal/quality/plugins/plugin.go
Tomas Dvorak 55885a0e8f first commit
2026-02-22 10:42:17 +01:00

164 lines
3.7 KiB
Go

package plugins
import (
"context"
"go/ast"
"go/token"
"go/types"
"github.com/yourorg/devour/internal/quality"
)
// LanguagePlugin defines the interface for language-specific analysis plugins
type LanguagePlugin interface {
// Name returns the plugin name (e.g., "go", "typescript")
Name() string
// Extensions returns file extensions this plugin handles
Extensions() []string
// MarkerFiles returns files that indicate this language (e.g., "go.mod")
MarkerFiles() []string
// DefaultSrcDir returns the default source directory
DefaultSrcDir() string
// CreateDetectors creates language-specific detectors
CreateDetectors(finder quality.FileFinder) []quality.Detector
// CreateFixers creates language-specific auto-fixers
CreateFixers() []Fixer
// AnalyzeFile performs AST analysis on a single file
AnalyzeFile(ctx context.Context, path string, config *quality.Config) (*FileAnalysis, error)
// BuildDependencyGraph builds the import dependency graph
BuildDependencyGraph(ctx context.Context, path string) (*DependencyGraph, error)
}
// FileAnalysis represents the result of analyzing a single file
type FileAnalysis struct {
Path string
Package string
Imports []ImportInfo
Functions []quality.FunctionInfo
Classes []quality.ClassInfo
Variables []VariableInfo
Types []TypeInfo
Comments []CommentInfo
LOC int
Complexity int
Issues []quality.Finding
}
// ImportInfo represents import information
type ImportInfo struct {
Path string
Alias string
Line int
Used bool
Position token.Position
}
// VariableInfo represents variable information
type VariableInfo struct {
Name string
Type string
File string
Line int
IsExported bool
IsUsed bool
}
// TypeInfo represents type information
type TypeInfo struct {
Name string
Underlying string
Methods []string
File string
Line int
IsExported bool
}
// CommentInfo represents comment information
type CommentInfo struct {
Text string
File string
Line int
IsDoc bool
Attached string // What it's attached to (function name, type name, etc.)
}
// DependencyGraph represents the import dependency graph
type DependencyGraph struct {
Packages map[string]*PackageNode
Edges []DependencyEdge
Cycles [][]string
}
// PackageNode represents a node in the dependency graph
type PackageNode struct {
Name string
Path string
Imports []string
ImportedBy []string
Files []string
IsLocal bool
}
// DependencyEdge represents an edge in the dependency graph
type DependencyEdge struct {
From string
To string
Type EdgeType
}
// EdgeType represents the type of dependency edge
type EdgeType string
const (
EdgeTypeImport EdgeType = "import"
EdgeTypeEmbed EdgeType = "embed"
EdgeTypeInternal EdgeType = "internal"
)
// Fixer defines the interface for auto-fixers
type Fixer interface {
// Name returns the fixer name
Name() string
// Description returns a human-readable description
Description() string
// CanFix checks if this fixer can fix the given finding
CanFix(finding quality.Finding) bool
// Fix applies the fix and returns the patches
Fix(ctx context.Context, finding quality.Finding, dryRun bool) (*FixResult, error)
}
// FixResult represents the result of a fix operation
type FixResult struct {
Success bool
Patches []Patch
Message string
Warnings []string
}
// Patch represents a single file patch
type Patch struct {
File string
OldText string
NewText string
Start int
End int
}
// ASTInfo represents AST information for analysis
type ASTInfo struct {
File *ast.File
Fset *token.FileSet
Types *types.Info
Package *types.Package
}