Skip to content

Commit

Permalink
Ensure that field/values list is not empty
Browse files Browse the repository at this point in the history
  • Loading branch information
OlegIlyenko committed Mar 14, 2016
1 parent 166ecf9 commit cfdc408
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 31 deletions.
70 changes: 39 additions & 31 deletions src/main/scala/sangria/macros/derive/DeriveMacro.scala
Original file line number Diff line number Diff line change
Expand Up @@ -154,41 +154,49 @@ class DeriveMacro(context: blackbox.Context) extends {
"""
}

Right(classFields ++ additionalFields(config))
val allFields = classFields ++ additionalFields(config)

if (allFields.nonEmpty) Right(allFields)
else Left(List(c.enclosingPosition "Field list is empty"))
case errors Left(errors)
}
}

private def collectEnumValues(values: List[Symbol], config: Seq[MacroDeriveEnumTypeConfig], t: Type): List[Tree] =
extractEnumValues(values, config) map { value
val name = value.name.decodedName.toString.trim
val annotationName = symbolName(value.annotations)
val configName = config.collect{case MacroRenameValue(`name`, tree, _) tree}.lastOption
val actualName =
if (config.exists(_.isInstanceOf[MacroUppercaseValues]))
q"sangria.util.StringUtil.camelCaseToUpperCase(${configName orElse annotationName getOrElse q"$name"})"
else
q"${configName orElse annotationName getOrElse q"$name"}"

val annotationDescr = symbolDescription(value.annotations)
val configDescr = config.collect{case MacroDocumentValue(`name`, tree, _, _) tree}.lastOption

val annotationDepr = symbolDeprecation(value.annotations)
val configDocDepr = config.collect{case MacroDocumentValue(`name`, _, reason, _) reason}.lastOption getOrElse q"None"
val configDepr = config.collect{case MacroDeprecateValue(`name`, reason, _) reason}.lastOption getOrElse q"None"

val actualValue =
if (value.isModuleClass) q"${value.name.toTermName}"
else q"${t.asInstanceOf[TypeRef].pre.typeSymbol.name.toTermName}.${value.asTerm.getter}"

q"""
EnumValue[$t](
$actualName,
${configDescr orElse annotationDescr},
$actualValue,
$configDocDepr orElse $configDepr orElse $annotationDepr)
"""
}
private def collectEnumValues(values: List[Symbol], config: Seq[MacroDeriveEnumTypeConfig], t: Type): List[Tree] = {
val extractedValues = extractEnumValues(values, config)

if (extractedValues.isEmpty) reportErrors(List(c.enclosingPosition "Enum value list is empty"))
else
extractedValues map { value
val name = value.name.decodedName.toString.trim
val annotationName = symbolName(value.annotations)
val configName = config.collect{case MacroRenameValue(`name`, tree, _) tree}.lastOption
val actualName =
if (config.exists(_.isInstanceOf[MacroUppercaseValues]))
q"sangria.util.StringUtil.camelCaseToUpperCase(${configName orElse annotationName getOrElse q"$name"})"
else
q"${configName orElse annotationName getOrElse q"$name"}"

val annotationDescr = symbolDescription(value.annotations)
val configDescr = config.collect{case MacroDocumentValue(`name`, tree, _, _) tree}.lastOption

val annotationDepr = symbolDeprecation(value.annotations)
val configDocDepr = config.collect{case MacroDocumentValue(`name`, _, reason, _) reason}.lastOption getOrElse q"None"
val configDepr = config.collect{case MacroDeprecateValue(`name`, reason, _) reason}.lastOption getOrElse q"None"

val actualValue =
if (value.isModuleClass) q"${value.name.toTermName}"
else q"${t.asInstanceOf[TypeRef].pre.typeSymbol.name.toTermName}.${value.asTerm.getter}"

q"""
EnumValue[$t](
$actualName,
${configDescr orElse annotationDescr},
$actualValue,
$configDocDepr orElse $configDepr orElse $annotationDepr)
"""
}
}

private def upperCaseName(name: String) = name // TODO

Expand Down
2 changes: 2 additions & 0 deletions src/test/scala/sangria/macros/derive/DeriveMacroSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ class DeriveMacroSpec extends WordSpec with Matchers with FutureResultSupport {
"""deriveObjectType[Unit, TestSubject](RenameField("id1", "foo"))""" shouldNot compile
"""deriveObjectType[Unit, TestSubject](FieldTags("id1", CachedTag))""" shouldNot compile
"""deriveObjectType[Unit, TestSubject](DeprecateField("id1", "test"))""" shouldNot compile
"""deriveObjectType[Unit, TestSubjectAnnotated](ExcludeFields("id", "list", "excluded"))""" shouldNot compile
}

"respect whitelist and blacklist provided via config" in {
Expand Down Expand Up @@ -455,6 +456,7 @@ class DeriveMacroSpec extends WordSpec with Matchers with FutureResultSupport {
"""deriveEnumType[Fruit](DeprecateValue("Test", "Fooo"))""" shouldNot compile
"""deriveEnumType[Fruit](RenameValue("Test", "Fooo"))""" shouldNot compile
"""deriveEnumType[Fruit](UppercaseValues, RenameValue("RedApple", "Fooo"))""" shouldNot compile
"""deriveEnumType[Fruit](ExcludeValues("RedApple", "SuperBanana", "MegaOrange", "Guave"))""" shouldNot compile
}

"respect whitelist and blacklist provided via config" in {
Expand Down

0 comments on commit cfdc408

Please sign in to comment.