From 5ebfac3ec7bbcd073bcb14c66aff90d922b427cb Mon Sep 17 00:00:00 2001 From: Natsu Kagami Date: Sat, 15 Jun 2024 17:39:17 +0200 Subject: [PATCH 1/3] Clarify that tryFindSynthetic is for Apply | TypeApply tree --- .../src/dotty/tools/dotc/semanticdb/SyntheticsExtractor.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/src/dotty/tools/dotc/semanticdb/SyntheticsExtractor.scala b/compiler/src/dotty/tools/dotc/semanticdb/SyntheticsExtractor.scala index af38315a857e..8fbd45e9a224 100644 --- a/compiler/src/dotty/tools/dotc/semanticdb/SyntheticsExtractor.scala +++ b/compiler/src/dotty/tools/dotc/semanticdb/SyntheticsExtractor.scala @@ -13,7 +13,8 @@ class SyntheticsExtractor: val visited = collection.mutable.HashSet[Tree]() - def tryFindSynthetic(tree: Tree)(using Context, SemanticSymbolBuilder, TypeOps): Option[s.Synthetic] = + /** Attempt to format the given tree as a Synthetic apply, if applicable. */ + def tryFindSynthetic(tree: Apply | TypeApply)(using Context, SemanticSymbolBuilder, TypeOps): Option[s.Synthetic] = extension (synth: s.Synthetic) def toOpt: Some[s.Synthetic] = Some(synth) From 7cbfa7b4c9fff205dd4f732a4b7e311cbb2bec4a Mon Sep 17 00:00:00 2001 From: Natsu Kagami Date: Sat, 15 Jun 2024 20:27:01 +0200 Subject: [PATCH 2/3] Consider the original span for synthetics for registering Ident use --- .../dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala b/compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala index 357202229e50..17632f24db0c 100644 --- a/compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala +++ b/compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala @@ -394,7 +394,12 @@ object ExtractSemanticDB: case tree: Ident => if tree.name != nme.WILDCARD then val sym = tree.symbol.adjustIfCtorTyparam - registerUseGuarded(None, sym, tree.span, tree.source) + val span = + if tree.span.isSynthetic then + // use synthetic's definition span instead of the original span, if exists + localBodies.get(tree.symbol).map(_.span).filter(_.exists).getOrElse(tree.span) + else tree.span + registerUseGuarded(None, sym, span, tree.source) case tree: Select => val qual = tree.qualifier val qualSpan = qual.span From 2d914c9d910ced8b8aac5cb00d697af9547a9fab Mon Sep 17 00:00:00 2001 From: Natsu Kagami Date: Sat, 15 Jun 2024 20:29:30 +0200 Subject: [PATCH 3/3] Update tests --- tests/semanticdb/expect/NamedApplyBlock.expect.scala | 2 +- tests/semanticdb/metac.expect | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/semanticdb/expect/NamedApplyBlock.expect.scala b/tests/semanticdb/expect/NamedApplyBlock.expect.scala index f47393b0322a..021d618c66b3 100644 --- a/tests/semanticdb/expect/NamedApplyBlock.expect.scala +++ b/tests/semanticdb/expect/NamedApplyBlock.expect.scala @@ -4,7 +4,7 @@ object NamedApplyBlockMethods/*<-example::NamedApplyBlockMethods.*/ { val local/*<-example::NamedApplyBlockMethods.local.*/ = 1 def foo/*<-example::NamedApplyBlockMethods.foo().*/(a/*<-example::NamedApplyBlockMethods.foo().(a)*/: Int/*->scala::Int#*/ = 1, b/*<-example::NamedApplyBlockMethods.foo().(b)*/: Int/*->scala::Int#*/ = 2, c/*<-example::NamedApplyBlockMethods.foo().(c)*/: Int/*->scala::Int#*/ = 3): Int/*->scala::Int#*/ = a/*->example::NamedApplyBlockMethods.foo().(a)*/ +/*->scala::Int#`+`(+4).*/ b/*->example::NamedApplyBlockMethods.foo().(b)*/ +/*->scala::Int#`+`(+4).*/ c/*->example::NamedApplyBlockMethods.foo().(c)*/ def baseCase/*<-example::NamedApplyBlockMethods.baseCase().*/ = foo/*->example::NamedApplyBlockMethods.foo().*/(local/*->example::NamedApplyBlockMethods.local.*/, c/*->example::NamedApplyBlockMethods.foo().(c)*/ = 3) - def recursive/*<-example::NamedApplyBlockMethods.recursive().*/ = foo/*->example::NamedApplyBlockMethods.foo().*/(local/*->example::NamedApplyBlockMethods.local.*/, c/*->example::NamedApplyBlockMethods.foo().(c)*/ = foo/*->example::NamedApplyBlockMethods.foo().*/(local/*->example::NamedApplyBlockMethods.local.*/, c/*->example::NamedApplyBlockMethods.foo().(c)*/ = 3)) + def recursive/*<-example::NamedApplyBlockMethods.recursive().*/ = foo/*->example::NamedApplyBlockMethods.foo().*//*->local1*/(local/*->example::NamedApplyBlockMethods.local.*/, c/*->example::NamedApplyBlockMethods.foo().(c)*/ = foo/*->example::NamedApplyBlockMethods.foo().*/(local/*->example::NamedApplyBlockMethods.local.*/, c/*->example::NamedApplyBlockMethods.foo().(c)*/ = 3)) } object NamedApplyBlockCaseClassConstruction/*<-example::NamedApplyBlockCaseClassConstruction.*/ { diff --git a/tests/semanticdb/metac.expect b/tests/semanticdb/metac.expect index 84c3e7c6a110..769085647b99 100644 --- a/tests/semanticdb/metac.expect +++ b/tests/semanticdb/metac.expect @@ -2841,7 +2841,7 @@ Uri => NamedApplyBlock.scala Text => empty Language => Scala Symbols => 43 entries -Occurrences => 41 entries +Occurrences => 42 entries Symbols: example/NamedApplyBlockCaseClassConstruction. => final object NamedApplyBlockCaseClassConstruction extends Object { self: NamedApplyBlockCaseClassConstruction.type => +6 decls } @@ -2911,6 +2911,7 @@ Occurrences: [5:28..5:29): c -> example/NamedApplyBlockMethods.foo().(c) [6:6..6:15): recursive <- example/NamedApplyBlockMethods.recursive(). [6:18..6:21): foo -> example/NamedApplyBlockMethods.foo(). +[6:18..6:21): foo -> local1 [6:22..6:27): local -> example/NamedApplyBlockMethods.local. [6:29..6:30): c -> example/NamedApplyBlockMethods.foo().(c) [6:33..6:36): foo -> example/NamedApplyBlockMethods.foo().