@@ -1291,12 +1291,10 @@ impl<'a> AstTransformer for VarIdTyPass<'a> {
12911291 ) -> <Self :: OutputMetadata as AstMetadata >:: UnaryOpExpr {
12921292 match input. op {
12931293 UnaryOp :: Not => {
1294- if operand. ty ( ) != Ty :: Bool {
1295- self . errors . push ( StaticError {
1296- span : self . span ( operand. span ( ) ) ,
1297- kind : StaticErrorKind :: UnaryOpInvalidType ,
1298- } ) ;
1299- }
1294+ self . errors . push ( StaticError {
1295+ span : self . span ( input. span ) ,
1296+ kind : StaticErrorKind :: Unimplemented ,
1297+ } ) ;
13001298 Ty :: Bool
13011299 }
13021300 UnaryOp :: Neg => {
@@ -1881,6 +1879,7 @@ struct ExecScope {
18811879struct FallbackConstraint {
18821880 priority : i32 ,
18831881 constraint : LinearExpr ,
1882+ span : Span ,
18841883}
18851884
18861885impl PartialEq for FallbackConstraint {
@@ -1916,6 +1915,7 @@ struct CellState {
19161915 fallback_constraints : BinaryHeap < FallbackConstraint > ,
19171916 fallback_constraints_used : Vec < LinearExpr > ,
19181917 unsolved_vars : Option < IndexSet < Var > > ,
1918+ constraint_span_map : IndexMap < ConstraintId , Span > ,
19191919}
19201920
19211921struct ExecPass < ' a > {
@@ -2154,6 +2154,7 @@ impl<'a> ExecPass<'a> {
21542154 root_scope: root_scope_id,
21552155 unsolved_vars: Default :: default ( ) ,
21562156 objects: Default :: default ( ) ,
2157+ constraint_span_map: IndexMap :: new( ) ,
21572158 }
21582159 )
21592160 . is_none( )
@@ -2234,16 +2235,18 @@ impl<'a> ExecPass<'a> {
22342235 }
22352236 let mut constraint_added = false ;
22362237 let state = self . cell_state_mut ( cell_id) ;
2237- while let Some ( FallbackConstraint { constraint, .. } ) =
2238- state. fallback_constraints . pop ( )
2238+ while let Some ( FallbackConstraint {
2239+ constraint, span, ..
2240+ } ) = state. fallback_constraints . pop ( )
22392241 {
22402242 if constraint
22412243 . coeffs
22422244 . iter ( )
22432245 . any ( |( c, v) | c. abs ( ) > 1e-6 && !state. solver . is_solved ( * v) )
22442246 {
22452247 state. fallback_constraints_used . push ( constraint. clone ( ) ) ;
2246- state. solver . constrain_eq0 ( constraint) ;
2248+ let constraint_id = state. solver . constrain_eq0 ( constraint) ;
2249+ state. constraint_span_map . insert ( constraint_id, span) ;
22472250 constraint_added = true ;
22482251 break ;
22492252 }
@@ -2262,18 +2265,25 @@ impl<'a> ExecPass<'a> {
22622265 require_progress = true ;
22632266 }
22642267 }
2268+
22652269 let state = self . cell_state_mut ( cell_id) ;
22662270 if progress {
22672271 state. solve_iters += 1 ;
22682272 state. solver . solve ( ) ;
22692273 }
22702274 for constraint in state. solver . inconsistent_constraints ( ) . clone ( ) {
2275+ let span = self
2276+ . cell_state ( cell_id)
2277+ . constraint_span_map
2278+ . get ( & constraint)
2279+ . cloned ( ) ;
22712280 self . errors . push ( ExecError {
2272- span : None ,
2281+ span,
22732282 cell : cell_id,
22742283 kind : ExecErrorKind :: InconsistentConstraint ( constraint) ,
22752284 } ) ;
22762285 }
2286+
22772287 self . partial_cells
22782288 . pop_back ( )
22792289 . expect ( "failed to pop cell id" ) ;
@@ -2917,6 +2927,7 @@ impl<'a> ExecPass<'a> {
29172927 }
29182928 x => unreachable ! ( "unsupported kwarg `{x}`" ) ,
29192929 } ;
2930+ let span = self . span ( & vref. loc , kwarg. span ) ;
29202931 let defer = self . value_id ( ) ;
29212932 self . values . insert (
29222933 defer,
@@ -2926,6 +2937,7 @@ impl<'a> ExecPass<'a> {
29262937 rhs : * rhs,
29272938 fallback : kwarg. name . name . ends_with ( 'i' ) ,
29282939 priority,
2940+ span,
29292941 } ) ,
29302942 loc : vref. loc ,
29312943 } ) ,
@@ -3065,7 +3077,15 @@ impl<'a> ExecPass<'a> {
30653077 ) {
30663078 let expr = vl. as_ref ( ) . unwrap_linear ( ) . clone ( )
30673079 - vr. as_ref ( ) . unwrap_linear ( ) . clone ( ) ;
3068- state. solver . constrain_eq0 ( expr) ;
3080+ let constraint = state. solver . constrain_eq0 ( expr) ;
3081+
3082+ state. constraint_span_map . insert (
3083+ constraint,
3084+ Span {
3085+ path : state. scopes [ & vref. loc . scope ] . span . path . clone ( ) ,
3086+ span : c. expr . span ,
3087+ } ,
3088+ ) ;
30693089 self . values . insert ( vid, Defer :: Ready ( Value :: Nil ) ) ;
30703090 true
30713091 } else {
@@ -3174,6 +3194,7 @@ impl<'a> ExecPass<'a> {
31743194 constraint,
31753195 span : Some ( span. clone ( ) ) ,
31763196 } ;
3197+ state. constraint_span_map . insert ( constraint, span. clone ( ) ) ;
31773198 state. object_emit . push ( ObjectEmit {
31783199 scope : vref. loc . scope ,
31793200 object : dim. id ,
@@ -3304,6 +3325,7 @@ impl<'a> ExecPass<'a> {
33043325 }
33053326 _ => continue ,
33063327 } ;
3328+ let span = self . span ( & vref. loc , kwarg. span ) ;
33073329 let defer = self . value_id ( ) ;
33083330 self . values . insert (
33093331 defer,
@@ -3313,6 +3335,7 @@ impl<'a> ExecPass<'a> {
33133335 rhs : * rhs,
33143336 fallback : kwarg. name . name . ends_with ( 'i' ) ,
33153337 priority,
3338+ span,
33163339 } ) ,
33173340 loc : vref. loc ,
33183341 } ) ,
@@ -3773,9 +3796,11 @@ impl<'a> ExecPass<'a> {
37733796 state. fallback_constraints . push ( FallbackConstraint {
37743797 priority : c. priority ,
37753798 constraint : expr,
3799+ span : c. span . clone ( ) ,
37763800 } ) ;
37773801 } else {
3778- state. solver . constrain_eq0 ( expr) ;
3802+ let constraint = state. solver . constrain_eq0 ( expr) ;
3803+ state. constraint_span_map . insert ( constraint, c. span . clone ( ) ) ;
37793804 }
37803805 self . values . insert ( vid, DeferValue :: Ready ( Value :: Nil ) ) ;
37813806 true
@@ -4241,6 +4266,9 @@ pub enum StaticErrorKind {
42414266 /// Invalid LYP file.
42424267 #[ error( "invalid LYP file" ) ]
42434268 InvalidLyp ,
4269+ /// Unimplemented.
4270+ #[ error( "unimplemented" ) ]
4271+ Unimplemented ,
42444272}
42454273
42464274#[ derive( Debug , Clone , Serialize , Deserialize ) ]
@@ -4348,6 +4376,7 @@ struct PartialConstraint {
43484376 rhs : ValueId ,
43494377 fallback : bool ,
43504378 priority : i32 ,
4379+ span : Span ,
43514380}
43524381
43534382#[ derive( Debug , Clone ) ]
0 commit comments