2013-04-15 10 views
7

Podobno mam następujące klasy Java:Dziwne zachowanie przybornika kompilacji po przedstawieniu wewnętrzną statyczną klasy java

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

mogę odwołać VAL stała od kodu scala prostu jak można się spodziewać, ale gdy próbuję kod kompilacji który odwołuje się do tego pola za pomocą kompilatora SCALA toolbox, to się nie powiedzie. (stacktrace podąża za przykładem poniżej).

Kod ten wykazał, co mam na myśli:

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 
} 

To jest ślad wyjątek uzyskać:

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) 

Czy ktoś napotkał tego wcześniej? Czy jest coś, co mogę zmienić (np. Opcje kompilatora), aby to zadziałało?

Dzięki.

EDIT

To co mam, kiedy mogę skompilować z "-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

myślę, że to jest błąd w API refleksji, ale nie jestem pewien. Mam debugowany fazy pisania i mają pochodzić z następujących czynności:

Po com.test.Outer został przydzielony z odpowiednim symbolem, sięgamy fazę typowania com.test.Outer.Inner.

Tutaj wyszukuje symbol dla Inner przy użyciu scala.reflect.internal.Scopes.Scope#lookupEntry(Name).

Kontrola poprawności spojrzał na zakres ujawnia, że ​​nie zawierają ScopeEntry dla ClassSymbol z Inner ale testowania równości nazwy symbolu zakres i metody name parametrów odbywa się za pomocą Object#equals (tj equals nie zostały nadpisane), a dwie instancje nazw nie są takie same.

Ostatnia uwaga dotycząca nazwy symbolu i parametru przekazanego nazwy jest taka, że ​​widzę, że mają one to samo pole index. Nie jestem pewien, co to oznacza, ale mam wrażenie, że oznacza to, że odnoszą się do tej samej nazwy w tabeli nazw, więc są one równe (?) (Istnieje jedna różnica między tymi dwoma, jeden jest TermName i nazwa symbolu to TypeName).

W każdym razie prawdopodobnie otworzę błąd w oprogramowaniu do śledzenia błędów Scala, chciałem tylko podsumować tutaj.

+0

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

+0

Tak, proszę, prześlij błąd, a ja popatrzę. Dzięki za szczegółową analizę! –

+0

@EugeneBurmako Dzięki, właśnie otworzyłem SI-7378 – dankilman

Odpowiedz

0

Prawidłowo - wygląda na to, że interfejs API do analizy Scala/JVM nie jest w stanie określić, że VAR jest statycznym elementem zagnieżdżonej klasy Inner.