summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/runtime/JavaMirrors.scala
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2012-07-11 14:46:01 +0200
committerEugene Burmako <xeno.by@gmail.com>2012-07-17 15:25:07 +0200
commitbab827a5426aeb654006573712eb7aabc047db36 (patch)
treeb302480d37b362777f5f7fa2737df756c5d88fac /src/reflect/scala/reflect/runtime/JavaMirrors.scala
parent0cfd858a38ddf0ac83d9bbefe85110f88dc707c0 (diff)
downloadscala-bab827a5426aeb654006573712eb7aabc047db36.tar.gz
scala-bab827a5426aeb654006573712eb7aabc047db36.tar.bz2
scala-bab827a5426aeb654006573712eb7aabc047db36.zip
SI-5895 fixes FieldMirrors
reflectField now accepts getters and setters along with the field symbols, it also checks whether a field has a reasonable binary representation (this is necessary, because ctor parameters that are unused outside of their declaring constructors don't get compiled down to Java fields/methods).
Diffstat (limited to 'src/reflect/scala/reflect/runtime/JavaMirrors.scala')
-rw-r--r--src/reflect/scala/reflect/runtime/JavaMirrors.scala25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/reflect/scala/reflect/runtime/JavaMirrors.scala b/src/reflect/scala/reflect/runtime/JavaMirrors.scala
index 185621efa4..1c5ea9caba 100644
--- a/src/reflect/scala/reflect/runtime/JavaMirrors.scala
+++ b/src/reflect/scala/reflect/runtime/JavaMirrors.scala
@@ -133,15 +133,22 @@ trait JavaMirrors extends internal.SymbolTable with api.JavaUniverse { self: Sym
def symbol = wholemirror.classSymbol(obj.getClass)
def reflectField(field: TermSymbol): FieldMirror = {
// [Eugene+++] check whether `field` represents a member of a `symbol`
- if (field.isMethod || field.isModule) throw new Error(s"""
- |expected a field symbol, you provided a ${field.kind} symbol
- |A typical cause of this problem is using a field accessor symbol instead of a field symbol.
- |To obtain a field symbol append nme.LOCAL_SUFFIX_STRING to the name of the field,
- |when searching for a member with Type.members or Type.declarations.
- |This is a temporary inconvenience that will be resolved before 2.10.0-final.
- |More information can be found here: https://issues.scala-lang.org/browse/SI-5895.
- """.trim.stripMargin)
- new JavaFieldMirror(obj, field)
+ if ((field.isMethod && !field.isAccessor) || field.isModule) throw new Error(s"expected a field or accessor method symbol, you provided a ${field.kind} symbol")
+ val name =
+ if (field.isGetter) nme.getterToLocal(field.name)
+ else if (field.isSetter) nme.getterToLocal(nme.setterToGetter(field.name))
+ else field.name
+ val field1 = (field.owner.info decl name).asTermSymbol
+ try fieldToJava(field1)
+ catch {
+ case _: NoSuchFieldException =>
+ throw new Error(s"""
+ |this Scala field isn't represented as a Java field, neither it has a Java accessor method
+ |note that private parameters of class constructors don't get mapped onto fields and/or accessors,
+ |unless they are used outside of their declaring constructors.
+ """.trim.stripMargin)
+ }
+ new JavaFieldMirror(obj, field1)
}
def reflectMethod(method: MethodSymbol): MethodMirror = {
// [Eugene+++] check whether `method` represents a member of a `symbol`