diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-12-13 11:14:25 -0800 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-12-13 11:14:25 -0800 |
commit | f8b56c86a4625e032198b5104e71be7a4d101fab (patch) | |
tree | 8f264815c20e5021ad202bc77c6192a7f82de636 /src | |
parent | f1131b60a2f8cd4cafc42073ee1f2f4bdd0c983d (diff) | |
parent | 760df9843a910d6c3618e490c752eb03fb6924bd (diff) | |
download | scala-f8b56c86a4625e032198b5104e71be7a4d101fab.tar.gz scala-f8b56c86a4625e032198b5104e71be7a4d101fab.tar.bz2 scala-f8b56c86a4625e032198b5104e71be7a4d101fab.zip |
Merge pull request #3262 from densh/si/8030
SI-8030 force symbols on presentation compiler initialization
Diffstat (limited to 'src')
-rw-r--r-- | src/interactive/scala/tools/nsc/interactive/Global.scala | 12 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/TreeGen.scala | 5 |
2 files changed, 14 insertions, 3 deletions
diff --git a/src/interactive/scala/tools/nsc/interactive/Global.scala b/src/interactive/scala/tools/nsc/interactive/Global.scala index 92c69dfcde..27f10ff00a 100644 --- a/src/interactive/scala/tools/nsc/interactive/Global.scala +++ b/src/interactive/scala/tools/nsc/interactive/Global.scala @@ -1238,6 +1238,18 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "") } } + // We need to force a number of symbols that might be touched by a parser. + // Otherwise thread safety property of parseTree method would be violated. + protected def forceSymbolsUsedByParser(): Unit = { + val symbols = + Set(UnitClass, BooleanClass, ByteClass, + ShortClass, IntClass, LongClass, FloatClass, + DoubleClass, NilModule, ListClass) ++ TupleClass.seq + symbols.foreach(_.initialize) + } + + forceSymbolsUsedByParser() + /** The compiler has been initialized. Constructors are evaluated in textual order, * so this is set to true only after all super constructors and the primary constructor * have been executed. diff --git a/src/reflect/scala/reflect/internal/TreeGen.scala b/src/reflect/scala/reflect/internal/TreeGen.scala index a0bd64f850..6269004298 100644 --- a/src/reflect/scala/reflect/internal/TreeGen.scala +++ b/src/reflect/scala/reflect/internal/TreeGen.scala @@ -16,8 +16,7 @@ abstract class TreeGen extends macros.TreeBuilder { def rootScalaDot(name: Name) = Select(rootId(nme.scala_) setSymbol ScalaPackage, name) def scalaDot(name: Name) = Select(Ident(nme.scala_) setSymbol ScalaPackage, name) def scalaAnnotationDot(name: Name) = Select(scalaDot(nme.annotation), name) - def scalaAnyRefConstrRaw = scalaDot(tpnme.AnyRef) - def scalaAnyRefConstr = scalaAnyRefConstrRaw setSymbol AnyRefClass // used in ide + def scalaAnyRefConstr = scalaDot(tpnme.AnyRef) // used in ide def scalaFunctionConstr(argtpes: List[Tree], restpe: Tree, abstractFun: Boolean = false): Tree = { val cls = if (abstractFun) @@ -393,7 +392,7 @@ abstract class TreeGen extends macros.TreeBuilder { def mkParents(ownerMods: Modifiers, parents: List[Tree], parentPos: Position = NoPosition) = if (ownerMods.isCase) parents ::: List(scalaDot(tpnme.Product), scalaDot(tpnme.Serializable)) - else if (parents.isEmpty) atPos(parentPos)(scalaAnyRefConstrRaw) :: Nil + else if (parents.isEmpty) atPos(parentPos)(scalaAnyRefConstr) :: Nil else parents def mkClassDef(mods: Modifiers, name: TypeName, tparams: List[TypeDef], templ: Template): ClassDef = { |