sbt:OrderService> scalafix RemoveUnused
[info] Running scalafix on 10 Scala sources
[info] Running scalafix on 6 Scala sources
[info] Running scalafix on 3 Scala sources
[info] Running scalafix on 50 Scala sources
[success] Total time: 1 s, completed Dec 17, 2019 12:35:41 PM
@BBartosz you can generate programs by constructing trees and printing them with Scalameta. Macros allow you to do roughly the same thing, except you do it during the compilation of your program
How exactly you generate them? I understand that you use quasiquotes to build your tree and then you save it to file, kinda like string?
Hi all, wondering if someone could clarify the behavior of the semanticdb-scalac plugin for me. I'm running this command:
$ ~/Downloads/scala-2.13.1/bin/scalac -Xplugin:$(realpath ~/Downloads/semanticdb-scalac_2.13.1-4.3.0.jar) -Yrangepos -Xplugin-require:semanticdb HelloWorld.scala
I'm expecting to see semanticdb files in META-INF/semanticdb
, but I do not. In fact, if I create the META-INF/semanticdb
directory before running the above command, the semanticdb
directory is deleted.
targetroot
option as well❯ cs launch scala:2.13.1 -- -Xplugin:$(cs fetch --intransitive org.scalameta:semanticdb-scalac_2.13.1:4.3.7) -Yrangepos -Xplugin-require:semanticdb -P:semanticdb:targetroot:$(pwd) foo.scala
❯ tree
.
├── foo.scala
└── META-INF
└── semanticdb
└── foo.scala.semanticdb
cs
is coursier from https://get-coursier.io/docs/cli-overview
Source.toString
gives you the code that you can feed to eval
trait NullaryEtaExpansionScala[A] {
def prop: A
def meth(): A
def def_prop = prop _
def def_meth = meth _
}
$ type metac
metac is aliased to `coursier launch org.scalameta:metac_2.12.11:4.3.7 -- -cp /Users/dnw/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.11/scala-library-2.12.11.jar'
$ type metap
metap is aliased to `coursier launch -M scala.meta.cli.Metap org.scalameta:scalameta_2.12:4.3.7 --'
$ metac -P:semanticdb:synthetics:on NullaryEtaExpansionScala.scala
$ tree META-INF/
META-INF/
└── semanticdb
└── NullaryEtaExpansionScala.scala.semanticdb
1 directory, 1 file
$ metap .
NullaryEtaExpansionScala.scala
------------------------------
Summary:
Schema => SemanticDB v4
Uri => NullaryEtaExpansionScala.scala
Text => empty
Language => Scala
Symbols => 6 entries
Occurrences => 10 entries
Symbols:
_empty_/NullaryEtaExpansionScala# => trait NullaryEtaExpansionScala[A] extends AnyRef { +4 decls }
_empty_/NullaryEtaExpansionScala#[A] => typeparam A
_empty_/NullaryEtaExpansionScala#def_meth(). => method def_meth: Function0[A]
_empty_/NullaryEtaExpansionScala#def_prop(). => method def_prop: Function0[A]
_empty_/NullaryEtaExpansionScala#meth(). => abstract method meth(): A
_empty_/NullaryEtaExpansionScala#prop(). => abstract method prop: A
Occurrences:
[0:6..0:30) <= _empty_/NullaryEtaExpansionScala#
[0:31..0:32) <= _empty_/NullaryEtaExpansionScala#[A]
[1:6..1:10) <= _empty_/NullaryEtaExpansionScala#prop().
[1:12..1:13) => _empty_/NullaryEtaExpansionScala#[A]
[2:6..2:10) <= _empty_/NullaryEtaExpansionScala#meth().
[2:14..2:15) => _empty_/NullaryEtaExpansionScala#[A]
[4:6..4:14) <= _empty_/NullaryEtaExpansionScala#def_prop().
[4:17..4:21) => local0
[5:6..5:14) <= _empty_/NullaryEtaExpansionScala#def_meth().
[5:17..5:21) => local1
$
prop().
and no link from symbol local0
, right?
$ m Foo.java
package pkg;
interface Foo {
String foo();
}
$ m scratch.scala
package pkg
class CM extends Foo { def foo() = "" }
class CP extends Foo { def foo = "" }
$ l
.
├── [ 48] Foo.java
└── [ 93] scratch.scala
0 directories, 2 files
$ metac Foo.java scratch.scala
$ metap .
scratch.scala
-------------
Summary:
Schema => SemanticDB v4
Uri => scratch.scala
Text => empty
Language => Scala
Symbols => 6 entries
Occurrences => 11 entries
Symbols:
pkg/CM# => class CM extends Object with Foo { +2 decls }
pkg/CM#`<init>`(). => primary ctor <init>()
pkg/CM#foo(). => method foo(): String
pkg/CP# => class CP extends Object with Foo { +2 decls }
pkg/CP#`<init>`(). => primary ctor <init>()
pkg/CP#foo(). => method foo(): String
Occurrences:
[0:8..0:11) <= pkg/
[2:6..2:8) <= pkg/CM#
[2:9..2:9) <= pkg/CM#`<init>`().
[2:17..2:20) => pkg/Foo#
[2:21..2:21) => java/lang/Object#`<init>`().
[2:27..2:30) <= pkg/CM#foo().
[3:6..3:8) <= pkg/CP#
[3:9..3:9) <= pkg/CP#`<init>`().
[3:17..3:20) => pkg/Foo#
[3:21..3:21) => java/lang/Object#`<init>`().
[3:27..3:30) <= pkg/CP#foo().
Is there no information in the Semanticdb that that the foo
method in CM
and CP
is implementing/overridingFoo#foo().
?
$ m scratch.scala
package pkg
trait Foo { def foo(): String }
class CM extends Foo { def foo() = "" }
class CP extends Foo { def foo = "" }
$ metap .
scratch.scala
-------------
Summary:
Schema => SemanticDB v4
Uri => scratch.scala
Text => empty
Language => Scala
Symbols => 8 entries
Occurrences => 14 entries
Symbols:
pkg/CM# => class CM extends AnyRef with Foo { +2 decls }
pkg/CM#`<init>`(). => primary ctor <init>()
pkg/CM#foo(). => method foo(): String
pkg/CP# => class CP extends AnyRef with Foo { +2 decls }
pkg/CP#`<init>`(). => primary ctor <init>()
pkg/CP#foo(). => method foo(): String
pkg/Foo# => trait Foo extends AnyRef { +1 decls }
pkg/Foo#foo(). => abstract method foo(): String
Occurrences:
[0:8..0:11) <= pkg/
[2:6..2:9) <= pkg/Foo#
[2:16..2:19) <= pkg/Foo#foo().
[2:23..2:29) => scala/Predef.String#
[4:6..4:8) <= pkg/CM#
[4:9..4:9) <= pkg/CM#`<init>`().
[4:17..4:20) => pkg/Foo#
[4:21..4:21) => java/lang/Object#`<init>`().
[4:27..4:30) <= pkg/CM#foo().
[5:6..5:8) <= pkg/CP#
[5:9..5:9) <= pkg/CP#`<init>`().
[5:17..5:20) => pkg/Foo#
[5:21..5:21) => java/lang/Object#`<init>`().
[5:27..5:30) <= pkg/CP#foo().
metap
outputs all the information available.
[4:17..4:20) => pkg/Foo#
to determine if the method is implementing/overriding??
Type.Apply(Type.Name("Bytes"), List(Lit.Int(32)))
I get that exceptionException in thread "main" org.scalameta.invariants.InvariantFailedException: invariant failed:
when verifying og.categories.intersect[String](ig.categories).nonEmpty
found that og.categories.intersect[String](ig.categories).nonEmpty is false
where ig = Literal
where og = Typ