From 6ec0f2f44f74657799b4b215c913a67089110061 Mon Sep 17 00:00:00 2001 From: Denys Shabalin Date: Tue, 25 Feb 2014 13:03:41 +0100 Subject: [PATCH] SI-8333 can't use modifiers if class is in a block Was caused by the ordering of parser cases. Need to check for definition first due to the fact that modifiers unquote looks like identifier from parser point of view. --- src/compiler/scala/tools/nsc/ast/parser/Parsers.scala | 8 ++++---- .../scala/tools/reflect/quasiquotes/Parsers.scala | 2 ++ .../quasiquotes/DefinitionConstructionProps.scala | 6 +++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala index 3542fe594550..9e631febeecf 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala @@ -3096,10 +3096,6 @@ self => stats ++= importClause() acceptStatSepOpt() } - else if (isExprIntro) { - stats += statement(InBlock) - if (!isCaseDefEnd) acceptStatSep() - } else if (isDefIntro || isLocalModifier || isAnnotation) { if (in.token == IMPLICIT) { val start = in.skipToken() @@ -3110,6 +3106,10 @@ self => } acceptStatSepOpt() } + else if (isExprIntro) { + stats += statement(InBlock) + if (!isCaseDefEnd) acceptStatSep() + } else if (isStatSep) { in.nextToken() } diff --git a/src/compiler/scala/tools/reflect/quasiquotes/Parsers.scala b/src/compiler/scala/tools/reflect/quasiquotes/Parsers.scala index 3b93a8933d4a..a788a5edc239 100644 --- a/src/compiler/scala/tools/reflect/quasiquotes/Parsers.scala +++ b/src/compiler/scala/tools/reflect/quasiquotes/Parsers.scala @@ -118,6 +118,8 @@ trait Parsers { self: Quasiquotes => override def isTemplateIntro: Boolean = super.isTemplateIntro || (isHole && lookingAhead { isTemplateIntro }) + override def isDefIntro: Boolean = super.isDefIntro || (isHole && lookingAhead { isDefIntro }) + override def isDclIntro: Boolean = super.isDclIntro || (isHole && lookingAhead { isDclIntro }) override def isStatSep(token: Int) = token == EOF || super.isStatSep(token) diff --git a/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala b/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala index fdb0d8327733..c6ad453c4598 100644 --- a/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala +++ b/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala @@ -9,7 +9,7 @@ object DefinitionConstructionProps with ValDefConstruction with PatDefConstruction with DefConstruction - with PackageConstruction + with PackageConstruction with ImportConstruction { val x: Tree = q"val x: Int" @@ -81,6 +81,10 @@ trait ClassConstruction { self: QuasiquoteProperties => assertEqAst(q" class C($privx)", " class C(x: Int) ") assertEqAst(q"case class C($privx)", "case class C(private[this] val x: Int)") } + + property("SI-8333") = test { + assertEqAst(q"{ $NoMods class C }", "{ class C }") + } } trait TraitConstruction { self: QuasiquoteProperties =>