@@ -137,6 +137,18 @@ impl Document {
137
137
diff_size : TextSize ,
138
138
is_addition : bool ,
139
139
) -> Affected {
140
+ // special case: no previous statements -> always full range
141
+ if self . positions . is_empty ( ) {
142
+ let full_range = TextRange :: new ( 0 . into ( ) , content_size) ;
143
+ return Affected {
144
+ affected_range : full_range,
145
+ affected_indices : Vec :: new ( ) ,
146
+ prev_index : None ,
147
+ next_index : None ,
148
+ full_affected_range : full_range,
149
+ } ;
150
+ }
151
+
140
152
let mut start = change_range. start ( ) ;
141
153
let mut end = change_range. end ( ) . min ( content_size) ;
142
154
@@ -1422,4 +1434,102 @@ mod tests {
1422
1434
1423
1435
assert_document_integrity ( & doc) ;
1424
1436
}
1437
+
1438
+ #[ test]
1439
+ fn test_comments_only ( ) {
1440
+ let path = PgTPath :: new ( "test.sql" ) ;
1441
+ let initial_content = "-- atlas:import async_trigger/setup.sql\n -- atlas:import public/setup.sql\n -- atlas:import private/setup.sql\n -- atlas:import api/setup.sql\n -- atlas:import async_trigger/index.sql\n -- atlas:import public/enums/index.sql\n -- atlas:import public/types/index.sql\n -- atlas:import private/enums/index.sql\n -- atlas:import private/functions/index.sql\n -- atlas:import public/tables/index.sql\n -- atlas:import public/index.sql\n -- atlas:import private/index.sql\n -- atlas:import api/index.sql\n \n \n \n " ;
1442
+
1443
+ // Create a new document
1444
+ let mut doc = Document :: new ( initial_content. to_string ( ) , 0 ) ;
1445
+
1446
+ // First change: Delete some text at line 2, character 24-29
1447
+ let change1 = ChangeFileParams {
1448
+ path : path. clone ( ) ,
1449
+ version : 3 ,
1450
+ changes : vec ! [ ChangeParams {
1451
+ text: "" . to_string( ) ,
1452
+ range: Some ( TextRange :: new(
1453
+ // Calculate the correct position based on the content
1454
+ // Line 2, character 24
1455
+ 98 . into( ) ,
1456
+ // Line 2, character 29
1457
+ 103 . into( ) ,
1458
+ ) ) ,
1459
+ } ] ,
1460
+ } ;
1461
+
1462
+ let _changes1 = doc. apply_file_change ( & change1) ;
1463
+
1464
+ // Second change: Add 't' at line 2, character 24
1465
+ let change2 = ChangeFileParams {
1466
+ path : path. clone ( ) ,
1467
+ version : 4 ,
1468
+ changes : vec ! [ ChangeParams {
1469
+ text: "t" . to_string( ) ,
1470
+ range: Some ( TextRange :: new( 98 . into( ) , 98 . into( ) ) ) ,
1471
+ } ] ,
1472
+ } ;
1473
+
1474
+ let _changes2 = doc. apply_file_change ( & change2) ;
1475
+
1476
+ assert_eq ! (
1477
+ doc. positions. len( ) ,
1478
+ 0 ,
1479
+ "Document should have no statement after adding 't'"
1480
+ ) ;
1481
+
1482
+ // Third change: Add 'e' at line 2, character 25
1483
+ let change3 = ChangeFileParams {
1484
+ path : path. clone ( ) ,
1485
+ version : 5 ,
1486
+ changes : vec ! [ ChangeParams {
1487
+ text: "e" . to_string( ) ,
1488
+ range: Some ( TextRange :: new( 99 . into( ) , 99 . into( ) ) ) ,
1489
+ } ] ,
1490
+ } ;
1491
+
1492
+ let _changes3 = doc. apply_file_change ( & change3) ;
1493
+ assert_eq ! (
1494
+ doc. positions. len( ) ,
1495
+ 0 ,
1496
+ "Document should still have no statement"
1497
+ ) ;
1498
+
1499
+ // Fourth change: Add 's' at line 2, character 26
1500
+ let change4 = ChangeFileParams {
1501
+ path : path. clone ( ) ,
1502
+ version : 6 ,
1503
+ changes : vec ! [ ChangeParams {
1504
+ text: "s" . to_string( ) ,
1505
+ range: Some ( TextRange :: new( 100 . into( ) , 100 . into( ) ) ) ,
1506
+ } ] ,
1507
+ } ;
1508
+
1509
+ let _changes4 = doc. apply_file_change ( & change4) ;
1510
+ assert_eq ! (
1511
+ doc. positions. len( ) ,
1512
+ 0 ,
1513
+ "Document should still have no statement"
1514
+ ) ;
1515
+
1516
+ // Fifth change: Add 't' at line 2, character 27
1517
+ let change5 = ChangeFileParams {
1518
+ path : path. clone ( ) ,
1519
+ version : 7 ,
1520
+ changes : vec ! [ ChangeParams {
1521
+ text: "t" . to_string( ) ,
1522
+ range: Some ( TextRange :: new( 101 . into( ) , 101 . into( ) ) ) ,
1523
+ } ] ,
1524
+ } ;
1525
+
1526
+ let _changes5 = doc. apply_file_change ( & change5) ;
1527
+ assert_eq ! (
1528
+ doc. positions. len( ) ,
1529
+ 0 ,
1530
+ "Document should still have no statement"
1531
+ ) ;
1532
+
1533
+ assert_document_integrity ( & doc) ;
1534
+ }
1425
1535
}
0 commit comments