@@ -67,6 +67,7 @@ pub enum DuplicateSymbolKind {
6767 Function ,
6868 Type ,
6969 Constructor ,
70+ Field ,
7071}
7172
7273#[ derive( Debug , Clone , PartialEq , Eq ) ]
@@ -104,6 +105,7 @@ impl Hir {
104105 hir. insert_function ( function_sig_from_decl ( function) ) ;
105106 }
106107 Item :: Type ( type_decl) => {
108+ record_duplicate_fields ( & mut hir. duplicate_symbols , type_decl) ;
107109 record_duplicate_symbol (
108110 & mut hir. duplicate_symbols ,
109111 & mut type_symbols,
@@ -223,6 +225,19 @@ fn record_duplicate_symbol(
223225 symbols. insert ( name. to_string ( ) , ( kind, span. clone ( ) ) ) ;
224226}
225227
228+ fn record_duplicate_fields ( duplicates : & mut Vec < DuplicateSymbol > , type_decl : & TypeDecl ) {
229+ let mut fields = HashMap :: new ( ) ;
230+ for field in & type_decl. fields {
231+ record_duplicate_symbol (
232+ duplicates,
233+ & mut fields,
234+ DuplicateSymbolKind :: Field ,
235+ & format ! ( "{}.{}" , type_decl. name, field. name) ,
236+ & field. span ,
237+ ) ;
238+ }
239+ }
240+
226241fn duplicate_symbol_kind (
227242 first : DuplicateSymbolKind ,
228243 duplicate : DuplicateSymbolKind ,
@@ -232,6 +247,7 @@ fn duplicate_symbol_kind(
232247 DuplicateSymbolKind :: Function
233248 }
234249 ( DuplicateSymbolKind :: Type , DuplicateSymbolKind :: Type ) => DuplicateSymbolKind :: Type ,
250+ ( DuplicateSymbolKind :: Field , DuplicateSymbolKind :: Field ) => DuplicateSymbolKind :: Field ,
235251 _ => DuplicateSymbolKind :: Constructor ,
236252 }
237253}
@@ -786,4 +802,28 @@ fn Image(path: read Path) -> Image {
786802 assert_eq ! ( duplicate. first_span. line, 4 ) ;
787803 assert_eq ! ( duplicate. duplicate_span. line, 8 ) ;
788804 }
805+
806+ #[ test]
807+ fn records_duplicate_fields ( ) {
808+ let source = r#"
809+ mode: managed
810+
811+ struct Response {
812+ status: Int
813+ status: String
814+ }
815+ "# ;
816+
817+ let program = parse_source ( "test.rss" , source) ;
818+ let hir = Hir :: from_syntax ( & program) ;
819+ let duplicate = hir
820+ . duplicate_symbols ( )
821+ . first ( )
822+ . expect ( "duplicate field is recorded" ) ;
823+
824+ assert_eq ! ( duplicate. kind, DuplicateSymbolKind :: Field ) ;
825+ assert_eq ! ( duplicate. name, "Response.status" ) ;
826+ assert_eq ! ( duplicate. first_span. line, 5 ) ;
827+ assert_eq ! ( duplicate. duplicate_span. line, 6 ) ;
828+ }
789829}
0 commit comments