1- use emmylua_parser:: { LuaAst , LuaAstNode , LuaIndexExpr , LuaNameExpr } ;
1+ use emmylua_parser:: { LuaAst , LuaAstNode , LuaDocNameType , LuaIndexExpr , LuaNameExpr } ;
22
33use crate :: {
4- DiagnosticCode , LuaDeclId , LuaDeprecated , LuaMemberId , LuaSemanticDeclId , SemanticDeclLevel ,
5- SemanticModel ,
4+ DiagnosticCode , LuaDeclId , LuaDeprecated , LuaMemberId , LuaSemanticDeclId , LuaTypeDeclId ,
5+ SemanticDeclLevel , SemanticModel ,
66} ;
77
88use super :: { Checker , DiagnosticContext } ;
@@ -22,6 +22,9 @@ impl Checker for DeprecatedChecker {
2222 LuaAst :: LuaIndexExpr ( index_expr) => {
2323 check_index_expr ( context, semantic_model, index_expr) ;
2424 }
25+ LuaAst :: LuaDocNameType ( name_type) => {
26+ check_doc_name_type ( context, semantic_model, name_type) ;
27+ }
2528 _ => { }
2629 }
2730 }
@@ -74,6 +77,35 @@ fn check_index_expr(
7477 Some ( ( ) )
7578}
7679
80+ fn check_doc_name_type (
81+ context : & mut DiagnosticContext ,
82+ semantic_model : & SemanticModel ,
83+ name_type : LuaDocNameType ,
84+ ) -> Option < ( ) > {
85+ let semantic_decl = semantic_model. find_decl (
86+ rowan:: NodeOrToken :: Node ( name_type. syntax ( ) . clone ( ) ) ,
87+ SemanticDeclLevel :: default ( ) ,
88+ ) ?;
89+
90+ let LuaSemanticDeclId :: TypeDecl ( type_decl_id) = semantic_decl else {
91+ return Some ( ( ) ) ;
92+ } ;
93+
94+ if !is_type_decl_deprecated ( semantic_model, & type_decl_id) {
95+ return Some ( ( ) ) ;
96+ }
97+
98+ context. add_diagnostic (
99+ DiagnosticCode :: Deprecated ,
100+ name_type. get_range ( ) ,
101+ get_deprecated_message ( semantic_model, & LuaSemanticDeclId :: TypeDecl ( type_decl_id) )
102+ . unwrap_or_else ( || "deprecated" . to_string ( ) ) ,
103+ None ,
104+ ) ;
105+
106+ Some ( ( ) )
107+ }
108+
77109fn check_deprecated (
78110 context : & mut DiagnosticContext ,
79111 semantic_model : & SemanticModel ,
@@ -87,14 +119,11 @@ fn check_deprecated(
87119 let Some ( property) = property else {
88120 return ;
89121 } ;
90- if let Some ( deprecated) = property. deprecated ( ) {
91- let deprecated_message = match deprecated {
92- LuaDeprecated :: Deprecated => "deprecated" . to_string ( ) ,
93- LuaDeprecated :: DeprecatedWithMessage ( message) => message. to_string ( ) ,
94- } ;
95122
123+ if let Some ( deprecated_message) = get_deprecated_message ( semantic_model, semantic_decl) {
96124 context. add_diagnostic ( DiagnosticCode :: Deprecated , range, deprecated_message, None ) ;
97125 }
126+
98127 // 检查特性
99128 if let Some ( attribute_uses) = property. attribute_uses ( ) {
100129 for attribute_use in attribute_uses. iter ( ) {
@@ -105,3 +134,36 @@ fn check_deprecated(
105134 }
106135 }
107136}
137+
138+ fn is_type_decl_deprecated ( semantic_model : & SemanticModel , type_decl_id : & LuaTypeDeclId ) -> bool {
139+ matches ! (
140+ semantic_model
141+ . get_db( )
142+ . get_property_index( )
143+ . get_property( & LuaSemanticDeclId :: TypeDecl ( type_decl_id. clone( ) ) )
144+ . and_then( |property| property. deprecated( ) ) ,
145+ Some ( _)
146+ )
147+ }
148+
149+ fn get_deprecated_message (
150+ semantic_model : & SemanticModel ,
151+ semantic_decl : & LuaSemanticDeclId ,
152+ ) -> Option < String > {
153+ let property = semantic_model
154+ . get_db ( )
155+ . get_property_index ( )
156+ . get_property ( semantic_decl) ;
157+ let Some ( property) = property else {
158+ return None ;
159+ } ;
160+ if let Some ( deprecated) = property. deprecated ( ) {
161+ let deprecated_message = match deprecated {
162+ LuaDeprecated :: Deprecated => "deprecated" . to_string ( ) ,
163+ LuaDeprecated :: DeprecatedWithMessage ( message) => message. to_string ( ) ,
164+ } ;
165+ return Some ( deprecated_message) ;
166+ }
167+
168+ None
169+ }
0 commit comments