summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/api/Symbols.scala
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2014-01-28 11:29:28 +0300
committerEugene Burmako <xeno.by@gmail.com>2014-02-14 14:08:57 +0100
commit51b16e421ddd4e6c7e90ba945addf39ffcb4fa41 (patch)
treed002d3dccfe613f830862a259957154523a21488 /src/reflect/scala/reflect/api/Symbols.scala
parentedadc01df2cbac2c8a00c2e0cc520713690418b9 (diff)
downloadscala-51b16e421ddd4e6c7e90ba945addf39ffcb4fa41.tar.gz
scala-51b16e421ddd4e6c7e90ba945addf39ffcb4fa41.tar.bz2
scala-51b16e421ddd4e6c7e90ba945addf39ffcb4fa41.zip
SI-8192 adds ClassSymbol.isPrimaryConstructor
Exposes a popular code pattern in macros as a dedicated reflection API. This simple commit, however, ended up being not so simple, as it often happens with our compiler. When writing a test for the new API, I realized that our (pre-existing) MethodSymbol.isPrimaryConstructor API returns nonsensical results for implementation artifacts (trait mixin ctors, module class ctors). What’s even more funny is that according to our reflection internals, even Java classes have primary constructors. Well, that’s not surprising, because `primaryConstructor` is just `decl(ctorName).alternatives.head`. Good thing that package classes don’t have constructors or that would elevate the situation to three fries short of a happy meal. At the moment, I’m too scared to fiddle with internal#Symbol.primaryConstructor, because that could easily break someone right before RC1, so I simply documented the findings in SI-8193 and postponed the actual work, except for one thing - isJavaDefined symbols no longer have primary constructors.
Diffstat (limited to 'src/reflect/scala/reflect/api/Symbols.scala')
-rw-r--r--src/reflect/scala/reflect/api/Symbols.scala13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/api/Symbols.scala b/src/reflect/scala/reflect/api/Symbols.scala
index 6fff965de1..8e26679e62 100644
--- a/src/reflect/scala/reflect/api/Symbols.scala
+++ b/src/reflect/scala/reflect/api/Symbols.scala
@@ -952,6 +952,19 @@ trait Symbols { self: Universe =>
* @group Class
*/
def typeParams: List[Symbol]
+
+ /** For a Scala class or module class, the primary constructor of the class.
+ * For a Scala trait, its mixin constructor.
+ * For a Scala package class, NoSymbol.
+ * For a Java class, NoSymbol.
+ *
+ * @group Class
+ */
+ // TODO: SI-8193 I think we should only return a non-empty symbol if called for Scala classes
+ // returning something for traits and module classes is outright confusing
+ // This, however, will require some refactoring in the compiler, so I'll leave it for later
+ // as at the moment we don't have time or risk tolerance for that
+ def primaryConstructor: Symbol
}
/** The API of free term symbols.