Любая информация о переносе плагина Scala 2.9 компилятора на 2.10? - программирование
Подтвердить что ты не робот

Любая информация о переносе плагина Scala 2.9 компилятора на 2.10?

У меня есть плагин для компилятора Scala 2.9 (исходный код) и отлично работает в 2.9, но даже не компилируется с 2.10. Есть десятки (может быть, 100+) ошибок такого же типа, как:

    [scalac] C:\***.scala:31: error: illegal cyclic reference involving class Global
    [scalac]   val fileSeparator = System.getProperty("file.separator");
    [scalac]                       ^

... который заканчивается с:

    [scalac] scala.reflect.internal.Types$TypeError: illegal cyclic reference involving class Global
    [scalac]     at scala.reflect.internal.Types$class.defineBaseClassesOfCompoundType(Types.scala:1731)
    [scalac]     at scala.reflect.internal.SymbolTable.defineBaseClassesOfCompoundType(SymbolTable.scala:12)
    [scalac]     at scala.reflect.internal.Types$CompoundType.baseClasses(Types.scala:1581)
    [scalac]     at scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2369)
    [scalac]     at scala.reflect.internal.Types$SimpleTypeProxy$class.baseClasses(Types.scala:248)
    [scalac]     at scala.reflect.internal.Types$SingletonType.baseClasses(Types.scala:1292)
    [scalac]     at scala.reflect.internal.Types$Type.findMembers(Types.scala:1058)
    [scalac]     at scala.reflect.internal.Types$Type.membersBasedOnFlags(Types.scala:683)
    [scalac]     at scala.reflect.internal.Types$Type.implicitMembers(Types.scala:637)
    [scalac]     at scala.tools.nsc.typechecker.Contexts$Context.collect$1(Contexts.scala:630)
    [scalac]     at scala.tools.nsc.typechecker.Contexts$Context.collectImplicitImports(Contexts.scala:642)
    [scalac]     at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:670)
    [scalac]     at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
    [scalac]     at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
    [scalac]     at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
    [scalac]     at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
    [scalac]     at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
    [scalac]     at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
    [scalac]     at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
    [scalac]     at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
    [scalac]     at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
    [scalac]     at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
    [scalac]     at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.bestImplicit(Implicits.scala:1378)
    [scalac]     at scala.tools.nsc.typechecker.Implicits$class.inferImplicit(Implicits.scala:82)
    [scalac]     at scala.tools.nsc.Global$$anon$1.inferImplicit(Global.scala:490)
    [scalac]     at scala.tools.nsc.typechecker.Implicits$class.inferImplicit(Implicits.scala:37)
    [scalac]     at scala.tools.nsc.Global$$anon$1.inferImplicit(Global.scala:490)
    [scalac]     at scala.tools.nsc.typechecker.Typers$Typer.hasImport$1(Typers.scala:764)
    [scalac]     at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$action$1(Typers.scala:766)
    [scalac]     at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$checkFeature$1.apply$mcV$sp(Typers.scala:788)
    [scalac]     at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3$$anonfun$apply$1.apply(Analyzer.scala:100)
    [scalac]     at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3$$anonfun$apply$1.apply(Analyzer.scala:100)
    [scalac]     at scala.collection.immutable.List.foreach(List.scala:309)
    [scalac]     at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32)
    [scalac]     at scala.collection.mutable.ListBuffer.foreach(ListBuffer.scala:45)
    [scalac]     at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.apply(Analyzer.scala:100)
    [scalac]     at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:461)
    [scalac]     at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3$$anonfun$run$1.apply(Analyzer.scala:90)
    [scalac]     at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3$$anonfun$run$1.apply(Analyzer.scala:90)
    [scalac]     at scala.collection.Iterator$class.foreach(Iterator.scala:727)
    [scalac]     at scala.collection.AbstractIterator.foreach(Iterator.scala:1156)
    [scalac]     at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.run(Analyzer.scala:90)
    [scalac]     at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1574)
    [scalac]     at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1548)
    [scalac]     at scala.tools.nsc.Global$Run.compileSources(Global.scala:1544)
    [scalac]     at scala.tools.nsc.Global$Run.compile(Global.scala:1654)
    [scalac]     at scala.tools.ant.Scalac.executeInternal(Scalac.scala:699)
    [scalac]     at scala.tools.ant.Scalac.execute(Scalac.scala:647)
    ...

Мне нужна информация или помощь относительно того, что изменилось в 2.10 или как с этим справиться... Я попытался разобраться с Google и посмотреть в форумах, но нашел очень мало информации по этому вопросу.

Будем благодарны за любую помощь!

EDIT: Дополнительная информация. Это, очевидно, использует задачу ant (см. Трассировку стека). Эта задача определена:

    <taskdef resource="scala/tools/ant/antlib.xml">
        <classpath>
          <pathelement location=".../scala-library.jar"   />
          <pathelement location=".../scala-reflect.jar"   />
          <pathelement location=".../scala-compiler.jar"  />
        </classpath>
    </taskdef>

EDIT 2: дополнительная информация: мне удалось получить этот плагин скомпилировать (еще не запускал его, поскольку другие вещи не удались) с помощью компилятора командной строки 2.10 (помните - все в порядке в 2.9 world) - построенная на основе ant конструкция продолжает терпеть неудачу одинаково (ошибка?). Мне пришлось сделать два изменения. Сначала имеет дело с varargs. Существует такой метод, как:

    def foo(arg: String*) { ... }

Существует еще один метод, который фактически является синонимом для этого объявления был, написанным в 2.9 Scala как:

    def bar = foo _;

Мне пришлось изменить это на следующее, чтобы заставить его работать:

    def bar(arg: String*) = foo(arg: *);

Другое дело с 'hasAssignedAnnotations' больше не присутствует в ValOrDefDef.symbol(я просто прокомментировал это, чтобы его компилировать, а не реальное исправление).

Опять же, кто-нибудь знает веб-сайт или документ, который может помочь мне с миграцией - то есть, что изменилось с 2.9 до 2.10 в том, что мне нужно, включая плагины компилятора.

Спасибо!

4b9b3361

Ответ 1

Я не думаю, что есть какая-либо полезная документация. Если я правильно помню, Мартин Одерский сказал в этой презентации, было отредактировано более 1000 файлов. Для 2.10 они переписали большие части компилятора для поддержки лучшего отражения. Как побочный эффект macros появился. Другим побочным эффектом, конечно же, является то, что многие плагины компилятора перестали работать.

В теории вы можете просматривать/искать историю git scala исходный код, на практике это, скорее всего, будет слишком кропотливый. Некоторые плагины компилятора были преобразованы в макросы, так как их немного легче отправить. Я не знаю, подходит ли это вам.

Лучше всего посмотреть на изменения, внесенные в плагины, поставляемые с scala. Я нашел this commit (новое отражение - отображение 190 измененных файлов с 9 001 дополнениями и 6403 удалениями) плагина продолжения, который содержит много информации и изменения. Надеюсь, это поможет.