Skip to content

Commit 4b2497e

Browse files
authored
Merge pull request #4326 from dotty-staging/dep-package
Refine dependency extraction: Ignore packages
2 parents 42a0ea0 + 8115009 commit 4b2497e

File tree

8 files changed

+68
-2
lines changed

8 files changed

+68
-2
lines changed

compiler/src/dotty/tools/dotc/sbt/ExtractDependencies.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,12 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
295295
val fromClass = resolveDependencySource
296296
if (fromClass.exists) { // can happen when visiting imports
297297
assert(fromClass.isClass)
298-
_dependencies += ClassDependency(fromClass, enclOrModuleClass, DependencyByMemberRef)
298+
299299
addUsedName(fromClass, mangledName(sym), UseScope.Default)
300+
// packages have class symbol. Only record them as used names but not dependency
301+
if (!sym.is(Package)) {
302+
_dependencies += ClassDependency(fromClass, enclOrModuleClass, DependencyByMemberRef)
303+
}
300304
}
301305
}
302306

@@ -315,7 +319,6 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
315319
!sym.exists ||
316320
sym.unforcedIsAbsent || // ignore dependencies that have a symbol but do not exist.
317321
// e.g. java.lang.Object companion object
318-
sym.is(PackageClass) ||
319322
sym.isEffectiveRoot ||
320323
sym.isAnonymousFunction ||
321324
sym.isAnonymousClass

sbt-bridge/test/xsbt/DependencySpecification.scala

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,25 @@ class DependencySpecification {
145145
assertEquals(Set("abc.A"), deps("H"))
146146
}
147147

148+
@Test
149+
def extractedClassDependenciesOnPackageObject = {
150+
val srcA = "package object foo { def bar = 1 }"
151+
val srcB =
152+
"""|package foo
153+
|
154+
|class Test {
155+
| bar
156+
|}
157+
""".stripMargin
158+
159+
val compilerForTesting = new ScalaCompilerForUnitTesting
160+
val classDependencies =
161+
compilerForTesting.extractDependenciesFromSrcs(srcA, srcB)
162+
163+
val memberRef = classDependencies.memberRef
164+
assertEquals(Set("foo.package"), memberRef("foo.Test"))
165+
}
166+
148167
private def extractClassDependenciesPublic: ExtractedClassDependencies = {
149168
val srcA = "class A"
150169
val srcB = "class B extends D[A]"

sbt-bridge/test/xsbt/ExtractUsedNamesSpecification.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,21 @@ class ExtractUsedNamesSpecification {
275275
assertEquals(Set(), findPatMatUsages(notUsedInPatternMatch))
276276
}
277277

278+
@Test
279+
def extractedNamesInImport = {
280+
val src =
281+
"""|import java.util.List
282+
|
283+
|class Test
284+
""".stripMargin
285+
286+
val compilerForTesting = new ScalaCompilerForUnitTesting
287+
val usedNames = compilerForTesting.extractUsedNamesFromSrc(src)
288+
289+
val expectedNames = standardNames ++ Set("java", "util", "List")
290+
assertEquals(expectedNames, usedNames("Test"))
291+
}
292+
278293
/**
279294
* Standard names that appear in every compilation unit that has any class
280295
* definition.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package foo
2+
3+
object Test {
4+
def test(implicit x: Int = 1): String = x.toString
5+
def main(args: Array[String]): Unit = test
6+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package object foo {
2+
implicit val x: Int = ???
3+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
> run
2+
3+
$ copy-file changes/package.scala package.scala
4+
5+
# New implicit in scope from package object that makes run throws
6+
# clean run fails correctly
7+
-> run
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import sbt._
2+
import Keys._
3+
4+
object DottyInjectedPlugin extends AutoPlugin {
5+
override def requires = plugins.JvmPlugin
6+
override def trigger = allRequirements
7+
8+
override val projectSettings = Seq(
9+
scalaVersion := sys.props("plugin.scalaVersion"),
10+
scalacOptions += "-language:Scala2"
11+
)
12+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % sys.props("plugin.version"))

0 commit comments

Comments
 (0)