2013-04-15 6 views
7

Censé J'ai la classe java suivante:Comportement étrange de la compilation de boîte à outils pour faire référence à une classe java statique intérieure

package com.test; 
public class Outer { 
    public static class Inner { public static final String VAL = "Inner"; } 
} 

je peux faire référence à la constante VAL à partir du code scala comme on peut s'y attendre, mais lorsque je tente de compiler le code qui fait référence à ce champ à l'aide du compilateur de la boîte à outils scala, il échoue. (stacktrace suit l'exemple ci-dessous).

Ce code a démontré ce que je veux dire:

import scala.reflect.runtime.universe 
import scala.tools.reflect.ToolBox 
object Issue extends App { 
    val mirror = universe.runtimeMirror(getClass.getClassLoader) 
    val toolbox = ToolBox(mirror).mkToolBox() 
    println     (com.test.Outer.Inner.VAL) // prints 'Inner' 
    val tree = toolbox.parse("com.test.Outer.Inner.VAL") 
    val compiled = toolbox.compile(tree)() // fails to compile 
} 

C'est la trace d'exception que je reçois:

Exception in thread "main" scala.tools.reflect.ToolBoxError: reflective compilation has failed: 

value Inner is not a member of object com.test.Outer 
    at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.throwIfErrors(ToolBoxFactory.scala:319) 
    at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.compile(ToolBoxFactory.scala:252) 
    at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.compile(ToolBoxFactory.scala:416) 
    at Issue$delayedInit$body.apply(Issue.scala:8) 
    at scala.Function0$class.apply$mcV$sp(Function0.scala:40) 
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) 
    at scala.App$$anonfun$main$1.apply(App.scala:71) 
    at scala.App$$anonfun$main$1.apply(App.scala:71) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32) 
    at scala.App$class.main(App.scala:71) 
    at Issue$.main(Issue.scala:3) 
    at Issue.main(Issue.scala) 

Quelqu'un at-il rencontré avant? Y at-il quelque chose que je peux changer (par exemple, les options du compilateur) pour que cela fonctionne?

Merci.

EDIT

C'est ce que je reçois quand je compilez avec "verbose -Yissue-debug":

[reflect-compiler] made Scala package scala 
[reflect-compiler] unpickling Scala package package and package scala, owner = package scala 
[reflect-compiler] made Scala package java 
[reflect-compiler] made Scala package lang 
[reflect-compiler] made Scala package runtime 
[reflect-compiler] made Scala package annotation 
[reflect-compiler] unpickling Scala package package and package runtime, owner = package runtime 
[reflect-compiler] made Scala package collection 
[reflect-compiler] unpickling Scala package package and package collection, owner = package collection 
[reflect-compiler] translating reflection info for Java class java.lang.Object 
[reflect-compiler] unpickling Scala class Unit and object Unit, owner = package scala 
[reflect-compiler] translating reflection info for Java class java.lang.Throwable 
[reflect-compiler] unpickling Scala class Long and object Long, owner = package scala 
[reflect-compiler] translating reflection info for Java class java.lang.InterruptedException 
[reflect-compiler] unpickling Scala class Int and object Int, owner = package scala 
[reflect-compiler] unpickling Scala class Boolean and object Boolean, owner = package scala 
[reflect-compiler] translating reflection info for Java class java.lang.String 
[reflect-compiler] translating reflection info for Java class java.lang.CloneNotSupportedException 
[reflect-compiler] made Scala package io 
[reflect-compiler] translating reflection info for Java interface java.io.Serializable 
[reflect-compiler] translating reflection info for Java interface java.lang.CharSequence 
[reflect-compiler] unpickling Scala class Char and object Char, owner = package scala 
[reflect-compiler] translating reflection info for Java class java.io.ObjectStreamField 
[reflect-compiler] made Scala package util 
[reflect-compiler] unpickling Scala class Float and object Float, owner = package scala 
[reflect-compiler] unpickling Scala class Double and object Double, owner = package scala 
[reflect-compiler] unpickling Scala class Byte and object Byte, owner = package scala 
[reflect-compiler] translating reflection info for Java class java.lang.StringBuffer 
[reflect-compiler] translating reflection info for Java class java.util.Locale 
[reflect-compiler] translating reflection info for Java class java.io.UnsupportedEncodingException 
[reflect-compiler] made Scala package nio 
[reflect-compiler] made Scala package charset 
[reflect-compiler] translating reflection info for Java class java.nio.charset.Charset 
[reflect-compiler] translating reflection info for Java class java.lang.StringBuilder 
[reflect-compiler] translating reflection info for Java interface java.lang.Comparable 
[reflect-compiler] made Scala package beans 
parsing com.test.Outer.Inner.VAL 
importing com.test.Outer.Inner.VAL 
compiling com.test.Outer.Inner.VAL 
[reflect-compiler] unpickling Scala class Predef and object Predef, owner = package scala 
[reflect-compiler] unpickling Scala class ClassfileAnnotation and object ClassfileAnnotation, owner = package annotation 
[reflect-compiler] unpickling Scala class Annotation and object Annotation, owner = package annotation 
[reflect-compiler] unpickling Scala class StaticAnnotation and object StaticAnnotation, owner = package annotation 
[reflect-compiler] made Scala package reflect 
[reflect-compiler] unpickling Scala package package and package reflect, owner = package reflect 
[reflect-compiler] made Scala package api 
[reflect-compiler] unpickling Scala package package and package api, owner = package api 
[reflect-compiler] unpickling Scala class Universe and object Universe, owner = package api 
[reflect-compiler] unpickling Scala class Symbols and object Symbols, owner = package api 
[reflect-compiler] unpickling Scala class Types and object Types, owner = package api 
[reflect-compiler] unpickling Scala class FlagSets and object FlagSets, owner = package api 
[reflect-compiler] unpickling Scala class Scopes and object Scopes, owner = package api 
[reflect-compiler] unpickling Scala class Names and object Names, owner = package api 
[reflect-compiler] unpickling Scala class Trees and object Trees, owner = package api 
[reflect-compiler] unpickling Scala class Constants and object Constants, owner = package api 
[reflect-compiler] unpickling Scala class Annotations and object Annotations, owner = package api 
[reflect-compiler] unpickling Scala class Positions and object Positions, owner = package api 
[reflect-compiler] unpickling Scala class Exprs and object Exprs, owner = package api 
[reflect-compiler] unpickling Scala class TypeTags and object TypeTags, owner = package api 
[reflect-compiler] unpickling Scala class TagInterop and object TagInterop, owner = package api 
[reflect-compiler] unpickling Scala class StandardDefinitions and object StandardDefinitions, owner = package api 
[reflect-compiler] unpickling Scala class StandardNames and object StandardNames, owner = package api 
[reflect-compiler] unpickling Scala class BuildUtils and object BuildUtils, owner = package api 
[reflect-compiler] unpickling Scala class Mirrors and object Mirrors, owner = package api 
[reflect-compiler] unpickling Scala class Printers and object Printers, owner = package api 
[reflect-compiler] unpickling Scala class Importers and object Importers, owner = package api 
[reflect-compiler] made Scala package runtime 
[reflect-compiler] unpickling Scala package package and package runtime, owner = package runtime 
[reflect-compiler] unpickling Scala class StringContext and object StringContext, owner = package scala 
[reflect-compiler] unpickling Scala class Product and object Product, owner = package scala 
[reflect-compiler] unpickling Scala class Equals and object Equals, owner = package scala 
[reflect-compiler] unpickling Scala class Serializable and object Serializable, owner = package scala 
[reflect-compiler] made Scala package immutable 
[reflect-compiler] unpickling Scala package package and package immutable, owner = package immutable 
[reflect-compiler] unpickling Scala class Array and object Array, owner = package scala 
[reflect-compiler] translating reflection info for Java interface java.lang.Cloneable 
[reflect-compiler] unpickling Scala class AnyVal and object AnyVal, owner = package scala 
[reflect-compiler] unpickling Scala class NotNull and object NotNull, owner = package scala 
[reflect-compiler] unpickling Scala class LowPriorityImplicits and object LowPriorityImplicits, owner = package scala 
[reflect-compiler] made Scala package com 
[reflect-compiler] unpickling Scala class Dynamic and object Dynamic, owner = package scala 
[reflect-compiler] made Scala package test 
[reflect-compiler] translating reflection info for Java class com.test.Outer 
[reflect-compiler] *** missing: Inner/true/object Outer/false/class scala.reflect.runtime.SynchronizedOps$$anon$1 
java.lang.Exception 
    at scala.tools.nsc.typechecker.Contexts$Context.issue(Contexts.scala:399) 
    at scala.tools.nsc.typechecker.ContextErrors$ErrorUtils$.issueTypeError(ContextErrors.scala:84) 
    at scala.tools.nsc.typechecker.ContextErrors$ErrorUtils$.issueNormalTypeError(ContextErrors.scala:69) 
    at scala.tools.nsc.typechecker.ContextErrors$TyperContextErrors$TyperErrorGen$.NotAMemberError(ContextErrors.scala:331) 
    at scala.tools.nsc.typechecker.Typers$Typer.handleMissing$1(Typers.scala:4846) 
    at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedSelect$1(Typers.scala:4851) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedSelectOrSuperCall$1(Typers.scala:4938) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5551) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5630) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedQualifier(Typers.scala:5710) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedQualifier(Typers.scala:5716) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedSelectOrSuperCall$1(Typers.scala:4918) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5551) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5630) 
    at scala.tools.nsc.typechecker.Typers$Typer.transformedOrTyped(Typers.scala:5825) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedDefDef(Typers.scala:2250) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5557) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5630) 
    at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedStat$1(Typers.scala:2921) 
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$62.apply(Typers.scala:3025) 
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$62.apply(Typers.scala:3025) 
    at scala.collection.immutable.List.loop$1(List.scala:170) 
    at scala.collection.immutable.List.mapConserve(List.scala:186) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3025) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedTemplate(Typers.scala:1914) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedModuleDef(Typers.scala:1794) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5572) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5630) 
    at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$typedStat$1(Typers.scala:2921) 
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$62.apply(Typers.scala:3025) 
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$62.apply(Typers.scala:3025) 
    at scala.collection.immutable.List.loop$1(List.scala:170) 
    at scala.collection.immutable.List.mapConserve(List.scala:186) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3025) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedPackageDef$1(Typers.scala:5288) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5575) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5630) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5687) 
    at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.apply(Analyzer.scala:99) 
    at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:463) 
    at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3$$anonfun$run$1.apply(Analyzer.scala:91) 
    at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3$$anonfun$run$1.apply(Analyzer.scala:91) 
    at scala.collection.Iterator$class.foreach(Iterator.scala:727) 
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1157) 
    at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.run(Analyzer.scala:91) 
    at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1582) 
    at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1556) 
    at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.compile(ToolBoxFactory.scala:251) 
    at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.compile(ToolBoxFactory.scala:416) 
    at Issue$delayedInit$body.apply(Issue.scala:8) 
    at scala.Function0$class.apply$mcV$sp(Function0.scala:40) 
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) 
    at scala.App$$anonfun$main$1.apply(App.scala:71) 
    at scala.App$$anonfun$main$1.apply(App.scala:71) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32) 
    at scala.App$class.main(App.scala:71) 
    at Issue$.main(Issue.scala:3) 
    at Issue.main(Issue.scala) 
Exception in thread "main" scala.tools.reflect.ToolBoxError: reflective compilation has failed: 

[namer in 31ms] 
[packageobjects in 0ms] 
value Inner is not a member of object com.test.Outer 
[typer in 211ms] 
[total in 247ms] 
[reset] recursing in package <root> 
    at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.throwIfErrors(ToolBoxFactory.scala:319) 
    at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal.compile(ToolBoxFactory.scala:252) 
    at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.compile(ToolBoxFactory.scala:416) 
    at Issue$delayedInit$body.apply(Issue.scala:8) 
    at scala.Function0$class.apply$mcV$sp(Function0.scala:40) 
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) 
    at scala.App$$anonfun$main$1.apply(App.scala:71) 
    at scala.App$$anonfun$main$1.apply(App.scala:71) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32) 
    at scala.App$class.main(App.scala:71) 
    at Issue$.main(Issue.scala:3) 
    at Issue.main(Issue.scala) 

EDIT 2

Je pense que c'est un bug dans l'API de réflexion mais je ne suis pas sûr. J'ai débogués la phase de frappe et je suis venu avec les éléments suivants:

Après com.test.Outer a été affectée à un symbole approprié, nous arrivons à la phase de frappe de com.test.Outer.Inner. Il y recherche un symbole pour Inner en utilisant scala.reflect.internal.Scopes.Scope#lookupEntry(Name).

Inspecter la regardait portée révèle qu'elle ne contient un paramètre ScopeEntry pour une ClassSymbol de Inner, mais les tests d'égalité entre le nom du symbole de la portée et les méthodes name se fait à l'aide Object#equals (c.-à-equals n'a pas été overriden), et deux instances de noms ne sont pas identiques. Une dernière remarque concernant le nom du symbole et le paramètre du nom passé est que je vois qu'ils ont le même champ index. Je ne suis pas sûr de ce que cela signifie, mais j'ai l'impression que cela signifie qu'ils se réfèrent au même nom dans la table des noms, donc ils sont égaux (?) (Il y a une différence entre les deux, l'un est TermName le nom du symbole est un TypeName).

Quoi qu'il en soit, je vais probablement ouvrir un bug bug tracker de Scala, je voulais juste conclure les choses ici.

+0

Essayez 'toolbox.parse (" com.test.Outer # Inner.VAL ")'? – Impredicative

+0

Oui, s'il vous plaît, soumettez un bug, et je vais jeter un coup d'oeil. Merci pour l'analyse détaillée! –

+0

@EugeneBurmako Merci, juste ouvert SI-7378 – dankilman

Répondre

0

Correct - il semble que l'API de réflexion Scala/JVM ne puisse pas déterminer que VAR est un membre statique de la classe Inner imbriquée.

Questions connexes