@@ -1005,7 +1005,11 @@ impl Evaluation {
1005
1005
if !attributes. is_empty ( ) {
1006
1006
let is_instance = ibase. as_weak ( ) . instance . unwrap_or ( false ) ;
1007
1007
attributes. iter ( ) . for_each ( |attribute|{
1008
- let mut eval = Evaluation :: eval_from_symbol ( & Rc :: downgrade ( attribute) , None ) ;
1008
+ let instance = match attribute. borrow ( ) . typ ( ) {
1009
+ SymType :: CLASS => Some ( false ) ,
1010
+ _ => None
1011
+ } ;
1012
+ let mut eval = Evaluation :: eval_from_symbol ( & Rc :: downgrade ( attribute) , instance) ;
1009
1013
match eval. symbol . sym {
1010
1014
EvaluationSymbolPtr :: WEAK ( ref mut weak) => {
1011
1015
weak. context . insert ( S ! ( "base_attr" ) , ContextValue :: SYMBOL ( Rc :: downgrade ( & base_loc) ) ) ;
@@ -1059,13 +1063,17 @@ impl Evaluation {
1059
1063
return AnalyzeAstResult :: from_only_diagnostics ( diagnostics) ;
1060
1064
}
1061
1065
for inferred_sym in inferred_syms. symbols . iter ( ) {
1062
- evals. push ( Evaluation :: eval_from_symbol ( & Rc :: downgrade ( inferred_sym) , None ) ) ;
1066
+ let instance = match inferred_sym. borrow ( ) . typ ( ) {
1067
+ SymType :: CLASS => Some ( false ) ,
1068
+ _ => None
1069
+ } ;
1070
+ evals. push ( Evaluation :: eval_from_symbol ( & Rc :: downgrade ( inferred_sym) , instance) ) ;
1063
1071
}
1064
1072
if !inferred_syms. always_defined {
1065
1073
evals. push ( Evaluation :: new_unbound ( name) ) ;
1066
1074
}
1067
1075
} ,
1068
- ExprOrIdent :: Expr ( Expr :: Subscript ( sub) ) => {
1076
+ ExprOrIdent :: Expr ( Expr :: Subscript ( sub) ) => ' subscript_block : {
1069
1077
let ( eval_left, diags) = Evaluation :: eval_from_ast ( session, & sub. value , parent. clone ( ) , max_infer, required_dependencies) ;
1070
1078
diagnostics. extend ( diags) ;
1071
1079
// TODO handle multiple eval_left
@@ -1080,20 +1088,38 @@ impl Evaluation {
1080
1088
if bases. len ( ) != 1 {
1081
1089
return AnalyzeAstResult :: from_only_diagnostics ( diagnostics) ;
1082
1090
}
1083
- let parent_file_or_func = parent. clone ( ) . borrow ( ) . parent_file_or_function ( ) . as_ref ( ) . unwrap ( ) . upgrade ( ) . unwrap ( ) ;
1084
- let is_in_validation = match parent_file_or_func. borrow ( ) . typ ( ) . clone ( ) {
1085
- SymType :: FILE | SymType :: PACKAGE ( _) | SymType :: FUNCTION => {
1086
- parent_file_or_func. borrow ( ) . build_status ( BuildSteps :: VALIDATION ) == BuildStatus :: IN_PROGRESS
1087
- } ,
1088
- _ => { false }
1089
- } ;
1091
+ let base = & bases[ 0 ] ;
1092
+ match base {
1093
+ EvaluationSymbolPtr :: WEAK ( base_sym_weak_eval) if base_sym_weak_eval. instance == Some ( false ) => {
1094
+ if let Some ( SymType :: CLASS ) = base. upgrade_weak ( ) . map ( |s| s. borrow ( ) . typ ( ) ) {
1095
+ // This is a Generic type (Field[int], or List[int]), for now we just return the main type/Class (Field/List)
1096
+ // TODO: handle generic types
1097
+ evals. push ( Evaluation {
1098
+ symbol : EvaluationSymbol {
1099
+ sym : base. clone ( ) ,
1100
+ get_symbol_hook : None ,
1101
+ } ,
1102
+ value : None ,
1103
+ range : Some ( sub. range ( ) )
1104
+ } ) ;
1105
+ break ' subscript_block;
1106
+ }
1107
+ }
1108
+ _ => { }
1109
+ }
1090
1110
let value = Evaluation :: expr_to_str ( session, & sub. slice , parent. clone ( ) , max_infer, & mut diagnostics) ;
1091
1111
diagnostics. extend ( value. 1 ) ;
1092
1112
if let Some ( value) = value. 0 {
1093
- let base = & bases[ 0 ] ;
1094
1113
if !base. is_weak ( ) {
1095
1114
return AnalyzeAstResult :: from_only_diagnostics ( diagnostics) ;
1096
1115
}
1116
+ let parent_file_or_func = parent. clone ( ) . borrow ( ) . parent_file_or_function ( ) . as_ref ( ) . unwrap ( ) . upgrade ( ) . unwrap ( ) ;
1117
+ let is_in_validation = match parent_file_or_func. borrow ( ) . typ ( ) . clone ( ) {
1118
+ SymType :: FILE | SymType :: PACKAGE ( _) | SymType :: FUNCTION => {
1119
+ parent_file_or_func. borrow ( ) . build_status ( BuildSteps :: VALIDATION ) == BuildStatus :: IN_PROGRESS
1120
+ } ,
1121
+ _ => { false }
1122
+ } ;
1097
1123
let base = base. upgrade_weak ( ) . unwrap ( ) ;
1098
1124
let get_item = base. borrow ( ) . get_content_symbol ( "__getitem__" , u32:: MAX ) . symbols ;
1099
1125
if get_item. len ( ) == 1 {
0 commit comments