@@ -37,24 +37,21 @@ func NewLSPServer(e *engine.MiniExecutor) *LSPServer {
3737 }
3838}
3939
40- // UpdateSession 更新或创建脚本会话并返回诊断信息
41- func (s * LSPServer ) UpdateSession (uri , code string ) ([]Diagnostic , error ) {
42- // 1. 尝试获取包名(简单正则或初步解析)
40+ // UpdateSession 更新或创建脚本会话并返回诊断信息。
41+ func (s * LSPServer ) UpdateSession (uri , code string ) (map [string ][]Diagnostic , error ) {
4342 pkgName := "main"
4443 converter := ffigo .NewGoToASTConverter ()
4544 node , _ := converter .ConvertSourceTolerant (uri , code )
4645 if prog , ok := node .(* ast.ProgramStmt ); ok && prog .Package != "" {
4746 pkgName = prog .Package
4847 }
4948
50- // 2. 存储文件会话
5149 s .sessions .Store (uri , & fileSession {pkgName : pkgName , code : code })
5250
53- // 3. 触发包级重新聚合分析
54- return s .rebuildPackage (pkgName , uri )
51+ return s .rebuildPackage (pkgName )
5552}
5653
57- func (s * LSPServer ) rebuildPackage (pkgName , targetURI string ) ([]Diagnostic , error ) {
54+ func (s * LSPServer ) rebuildPackage (pkgName string ) (map [ string ] []Diagnostic , error ) {
5855 val , _ := s .packages .LoadOrStore (pkgName , & packageState {files : make (map [string ]string )})
5956 pkg := val .(* packageState )
6057 pkg .mu .Lock ()
@@ -69,10 +66,9 @@ func (s *LSPServer) rebuildPackage(pkgName, targetURI string) ([]Diagnostic, err
6966 return true
7067 })
7168
72- // 聚合所有文件到单个 ProgramStmt
7369 var combinedNode * ast.ProgramStmt
7470 converter := ffigo .NewGoToASTConverter ()
75- diagnostics := make ([] Diagnostic , 0 )
71+ allDiagnostics := make (map [ string ][] Diagnostic )
7672
7773 for uri , code := range pkg .files {
7874 node , errs := converter .ConvertSourceTolerant (uri , code )
@@ -81,19 +77,17 @@ func (s *LSPServer) rebuildPackage(pkgName, targetURI string) ([]Diagnostic, err
8177 for _ , err := range errs {
8278 var scanErr scanner.Error
8379 if errors .As (err , & scanErr ) {
84- if scanErr .Pos .Filename == targetURI {
85- diagnostics = append (diagnostics , Diagnostic {
86- Range : Range {
87- Start : Position {Line : scanErr .Pos .Line - 1 , Character : scanErr .Pos .Column - 1 },
88- End : Position {Line : scanErr .Pos .Line - 1 , Character : scanErr .Pos .Column },
89- },
90- Severity : 1 ,
91- Source : "go-mini-syntax" ,
92- Message : scanErr .Msg ,
93- })
94- }
95- } else if err != nil && uri == targetURI {
96- diagnostics = append (diagnostics , Diagnostic {
80+ allDiagnostics [uri ] = append (allDiagnostics [uri ], Diagnostic {
81+ Range : Range {
82+ Start : Position {Line : scanErr .Pos .Line - 1 , Character : scanErr .Pos .Column - 1 },
83+ End : Position {Line : scanErr .Pos .Line - 1 , Character : scanErr .Pos .Column },
84+ },
85+ Severity : 1 ,
86+ Source : "go-mini-syntax" ,
87+ Message : scanErr .Msg ,
88+ })
89+ } else if err != nil {
90+ allDiagnostics [uri ] = append (allDiagnostics [uri ], Diagnostic {
9791 Range : FromInternalPos (& ast.Position {L : 1 , C : 1 }),
9892 Severity : 1 ,
9993 Source : "go-mini-syntax" ,
@@ -106,69 +100,56 @@ func (s *LSPServer) rebuildPackage(pkgName, targetURI string) ([]Diagnostic, err
106100 if combinedNode == nil {
107101 combinedNode = prog
108102 } else {
109- // 合并符号(借用我们在 cmd/exec 中定义的逻辑思路)
110103 mergeProgramStmts (combinedNode , prog )
111104 }
112105 }
113106 }
114107
115108 if combinedNode == nil {
116- return diagnostics , nil
109+ return allDiagnostics , nil
117110 }
118111
119112 // 运行校验以生成持久化 Scope
120113 prog , errs := s .executor .NewMiniProgramByProgramTolerant (combinedNode )
121114 pkg .combined = prog
122115
123- // 将当前触发文件的诊断信息返回
116+ // 收集所有文件的诊断信息
124117 for _ , err := range errs {
125118 if astErr , ok := err .(* ast.MiniAstError ); ok {
126119 for _ , log := range astErr .Logs {
127120 loc := log .Node .GetBase ().Loc
128- // 严格过滤文件路径,确保错误显示在正确的文件中
129- if loc != nil && loc .F == targetURI {
121+ if loc != nil && loc .F != "" {
130122 diag := Diagnostic {
131123 Range : FromInternalPos (loc ),
132124 Severity : 1 ,
133125 Source : "go-mini" ,
134126 Message : log .Message ,
135127 }
136- diagnostics = append (diagnostics , diag )
128+ allDiagnostics [ loc . F ] = append (allDiagnostics [ loc . F ] , diag )
137129 }
138130 }
139131 } else {
140- // 处理其他类型的运行时或执行错误
132+ // 处理运行时错误
141133 var vme * runtime.VMError
142134 if errors .As (err , & vme ) {
143- if len (vme .Frames ) > 0 && vme .Frames [0 ].Filename == targetURI {
135+ if len (vme .Frames ) > 0 {
136+ f := vme .Frames [0 ]
144137 diag := Diagnostic {
145138 Range : FromInternalPos (& ast.Position {
146- L : vme . Frames [ 0 ] .Line ,
147- C : vme . Frames [ 0 ] .Column ,
139+ L : f .Line ,
140+ C : f .Column ,
148141 }),
149142 Severity : 1 ,
150143 Source : "go-mini-runtime" ,
151144 Message : vme .Message ,
152145 }
153- for _ , f := range vme .Frames {
154- diag .RelatedInformation = append (diag .RelatedInformation , DiagnosticRelatedInformation {
155- Location : Location {
156- URI : f .Filename ,
157- Range : FromInternalPos (& ast.Position {
158- L : f .Line , C : f .Column ,
159- EL : f .Line , EC : f .Column + 1 ,
160- }),
161- },
162- Message : fmt .Sprintf ("at %s()" , f .Function ),
163- })
164- }
165- diagnostics = append (diagnostics , diag )
146+ allDiagnostics [f .Filename ] = append (allDiagnostics [f .Filename ], diag )
166147 }
167148 }
168149 }
169150 }
170151
171- return diagnostics , nil
152+ return allDiagnostics , nil
172153}
173154
174155func mergeProgramStmts (dest , src * ast.ProgramStmt ) {
0 commit comments