@@ -1177,18 +1177,34 @@ func (b *Buffer) isLocInStringOrComment(loc Loc, sortedIndices []int) bool {
11771177 return false
11781178}
11791179
1180- func (b * Buffer ) FindOpeningBrace (braceType [2 ]rune , start Loc ) (Loc , bool ) {
1181- startChar := []rune (string (b .LineBytes (start .Y )))[start .X ]
1182- var i int
1183- if startChar == braceType [1 ] {
1184- i = 0
1185- } else {
1186- i = 1
1180+ func (b * Buffer ) findOpeningBrace (braceType [2 ]rune , start Loc ) (Loc , bool ) {
1181+ // Bound guard
1182+ start = clamp (start , b .LineArray )
1183+ if len (b .lines ) == 0 {
1184+ return start , false
1185+ }
1186+ lineLen := len ([]rune (string (b .LineBytes (start .Y ))))
1187+ if start .X >= lineLen {
1188+ start .X = lineLen - 1
1189+ }
1190+ if start .X < 0 {
1191+ start .X = 0
1192+ }
1193+
1194+ var i int = 1
1195+ if lineLen > 0 {
1196+ startChar := []rune (string (b .LineBytes (start .Y )))[start .X ]
1197+ if startChar == braceType [1 ] {
1198+ i = 0
1199+ }
11871200 }
11881201 for y := start .Y ; y >= 0 ; y -- {
11891202 var sortedGroups []int
11901203 sortedGroupsPopulated := false
11911204 l := []rune (string (b .lines [y ].data ))
1205+ if len (l ) == 0 {
1206+ continue
1207+ }
11921208 xInit := len (l ) - 1
11931209 if y == start .Y {
11941210 xInit = start .X
@@ -1220,13 +1236,49 @@ func (b *Buffer) FindOpeningBrace(braceType [2]rune, start Loc) (Loc, bool) {
12201236 return start , false
12211237}
12221238
1223- func (b * Buffer ) FindClosingBrace (braceType [2 ]rune , start Loc ) (Loc , bool ) {
1224- startChar := []rune (string (b .LineBytes (start .Y )))[start .X ]
1225- var i int
1226- if startChar == braceType [0 ] {
1227- i = 0
1239+ // Returns the opening brace in current brace scope starting at the start location and a boolean
1240+ // indicating if an opening brace is found
1241+ func (b * Buffer ) FindOpeningBrace (start Loc ) (Loc , bool ) {
1242+ currentDist := - 1
1243+ currentMb := Loc {- 1 , - 1 }
1244+ for _ , bp := range BracePairs {
1245+ mb , found := b .findOpeningBrace (bp , start )
1246+ if found {
1247+ dist := DiffLA (start , mb , b .LineArray )
1248+ if currentDist < 0 || dist < currentDist {
1249+ currentMb = mb
1250+ currentDist = dist
1251+ }
1252+ }
1253+ }
1254+
1255+ if currentDist == - 1 {
1256+ return start , false
12281257 } else {
1229- i = 1
1258+ return currentMb , true
1259+ }
1260+ }
1261+
1262+ func (b * Buffer ) findClosingBrace (braceType [2 ]rune , start Loc ) (Loc , bool ) {
1263+ // Bound guard
1264+ start = clamp (start , b .LineArray )
1265+ if len (b .lines ) == 0 {
1266+ return start , false
1267+ }
1268+ lineLen := len ([]rune (string (b .LineBytes (start .Y ))))
1269+ if start .X >= lineLen {
1270+ start .X = lineLen - 1
1271+ }
1272+ if start .X < 0 {
1273+ start .X = 0
1274+ }
1275+
1276+ var i int = 1
1277+ if lineLen > 0 {
1278+ startChar := []rune (string (b .LineBytes (start .Y )))[start .X ]
1279+ if startChar == braceType [0 ] {
1280+ i = 0
1281+ }
12301282 }
12311283 for y := start .Y ; y < b .LinesNum (); y ++ {
12321284 var sortedGroups []int
@@ -1263,14 +1315,37 @@ func (b *Buffer) FindClosingBrace(braceType [2]rune, start Loc) (Loc, bool) {
12631315 return start , false
12641316}
12651317
1318+ // Returns the closing brace in current brace scope starting at the start location and a boolean
1319+ // indicating if an closing brace is found
1320+ func (b * Buffer ) FindClosingBrace (start Loc ) (Loc , bool ) {
1321+ currentDist := - 1
1322+ currentMb := Loc {- 1 , - 1 }
1323+ for _ , bp := range BracePairs {
1324+ mb , found := b .findClosingBrace (bp , start )
1325+ if found {
1326+ dist := DiffLA (start , mb , b .LineArray )
1327+ if currentDist < 0 || dist < currentDist {
1328+ currentMb = mb
1329+ currentDist = dist
1330+ }
1331+ }
1332+ }
1333+
1334+ if currentDist == - 1 {
1335+ return start , false
1336+ } else {
1337+ return currentMb , true
1338+ }
1339+ }
1340+
12661341func (b * Buffer ) findMatchingBrace (braceType [2 ]rune , start Loc , char rune ) (Loc , bool ) {
12671342 if b .isLocInStringOrComment (start , nil ) {
12681343 return start , false
12691344 }
12701345 if char == braceType [0 ] {
1271- return b .FindClosingBrace (braceType , start )
1346+ return b .findClosingBrace (braceType , start )
12721347 } else if char == braceType [1 ] {
1273- return b .FindOpeningBrace (braceType , start )
1348+ return b .findOpeningBrace (braceType , start )
12741349 }
12751350 return start , false
12761351}
0 commit comments