@@ -302,11 +302,24 @@ object AutoImports:
302302 }.headOption
303303 case _ => None
304304
305- def skipUsingDirectivesOffset =
305+ def firstMemberDefinitionStart (tree : Tree )(using Context ): Option [Int ] =
306+ tree match
307+ case PackageDef (_, stats) =>
308+ stats.flatMap {
309+ case s : PackageDef => firstMemberDefinitionStart(s)
310+ case stat if stat.span.exists => Some (stat.span.start)
311+ case _ => None
312+ }.headOption
313+ case _ => None
314+
315+
316+ def skipUsingDirectivesOffset (
317+ firstObjectPos : Int = firstMemberDefinitionStart(tree).getOrElse(0 )
318+ ): Int =
319+ val firstObjectLine = pos.source.offsetToLine(firstObjectPos)
306320 comments
307321 .takeWhile(comment =>
308- ! comment.isDocComment && comment.span.end < firstObjectBody(tree)
309- .fold(0 )(_.span.start)
322+ ! comment.isDocComment && pos.source.offsetToLine(comment.span.end) + 1 < firstObjectLine
310323 )
311324 .lastOption
312325 .fold(0 )(_.span.end + 1 )
@@ -318,7 +331,7 @@ object AutoImports:
318331 val (lineNumber, padTop) = lastImportStatement match
319332 case Some (stm) => (stm.endPos.line + 1 , false )
320333 case None if pkg.pid.symbol.isEmptyPackage =>
321- (pos.source.offsetToLine(skipUsingDirectivesOffset), false )
334+ (pos.source.offsetToLine(skipUsingDirectivesOffset() ), false )
322335 case None =>
323336 val pos = pkg.pid.endPos
324337 val line =
@@ -330,7 +343,7 @@ object AutoImports:
330343 new AutoImportPosition (offset, text, padTop)
331344 }
332345
333- def forScript (isAmmonite : Boolean ): Option [AutoImportPosition ] =
346+ def forScript (path : String ): Option [AutoImportPosition ] =
334347 firstObjectBody(tree).map { tmpl =>
335348 val lastImportStatement =
336349 tmpl.body.takeWhile(_.isInstanceOf [Import ]).lastOption
@@ -340,10 +353,11 @@ object AutoImports:
340353 offset
341354 case None =>
342355 val scriptOffset =
343- if isAmmonite then
344- ScriptFirstImportPosition .ammoniteScStartOffset(text, comments)
345- else
346- ScriptFirstImportPosition .scalaCliScStartOffset(text, comments)
356+ if path.isAmmoniteGeneratedFile
357+ then ScriptFirstImportPosition .ammoniteScStartOffset(text, comments)
358+ else if path.isScalaCLIGeneratedFile
359+ then ScriptFirstImportPosition .scalaCliScStartOffset(text, comments)
360+ else Some (skipUsingDirectivesOffset(tmpl.span.start))
347361
348362 scriptOffset.getOrElse {
349363 val tmplPoint = tmpl.self.srcPos.span.point
@@ -359,14 +373,16 @@ object AutoImports:
359373
360374 def fileStart =
361375 AutoImportPosition (
362- skipUsingDirectivesOffset,
376+ skipUsingDirectivesOffset() ,
363377 0 ,
364378 padTop = false
365379 )
366380
367381 val scriptPos =
368- if path.isAmmoniteGeneratedFile then forScript(isAmmonite = true )
369- else if path.isScalaCLIGeneratedFile then forScript(isAmmonite = false )
382+ if path.isAmmoniteGeneratedFile ||
383+ path.isScalaCLIGeneratedFile ||
384+ path.isWorksheet
385+ then forScript(path)
370386 else None
371387
372388 scriptPos
0 commit comments