@@ -21,6 +21,9 @@ import scala.build.options.{BuildOptions, SourceGeneratorOptions, GeneratorConfi
2121import scala .build .options .GeneratorConfig
2222import scala .build .{Positioned , options }
2323import scala .build .directives .DirectiveValueParser .WithScopePath
24+ import scala .util .matching .Regex
25+ import java .nio .file .Paths
26+ import scala .build .options .InternalOptions
2427
2528@ DirectiveGroupName (" SourceGenerator" )
2629@ DirectivePrefix (" sourceGenerator." )
@@ -35,19 +38,17 @@ final case class SourceGenerator(
3538 excludeScripts : Option [Boolean ] = None ,
3639 inputDirectory : DirectiveValueParser .WithScopePath [Option [Positioned [String ]]] =
3740 DirectiveValueParser .WithScopePath .empty(None ),
38- glob : Option [Positioned [String ]] = None ,
41+ glob : Option [Positioned [String ]] = None
3942) extends HasBuildOptions {
4043 def buildOptions : Either [BuildException , BuildOptions ] =
41- // println(s"ScopePath of Scripts: ${scripts.scopePath}")
42- // println(s"Values of Scripts: ${scripts.value(0).value}")
43- // println(s"Values of InputDir: ${inputDirectory.value}")
44- SourceGenerator .buildOptions(scripts)
44+ SourceGenerator .buildOptions(scripts, excludeScripts)
4545}
4646
4747object SourceGenerator {
4848 val handler : DirectiveHandler [SourceGenerator ] = DirectiveHandler .derive
4949 def buildOptions (
50- scripts : DirectiveValueParser .WithScopePath [List [Positioned [String ]]]
50+ scripts : DirectiveValueParser .WithScopePath [List [Positioned [String ]]],
51+ excludeScripts : Option [Boolean ]
5152 ): Either [BuildException , BuildOptions ] = {
5253 val proc = UsingDirectivesProcessor ()
5354 val scriptConvert = scripts.value
@@ -57,9 +58,12 @@ object SourceGenerator {
5758 .map(proc.extract(_).asScala)
5859 .map(_.headOption)
5960
60- // println(scriptConvert.size)
61+ val scriptsValue = scripts.value
62+ .map(script =>
63+ os.Path (script.value)
64+ )
6165
62- def modify (script : Option [UsingDirectives ]) = {
66+ def modify (script : Option [UsingDirectives ]) =
6367 script.toSeq.flatMap { directives =>
6468 def toStrictValue (value : UsingValue ): Seq [Value [_]] = value match {
6569 case uvs : UsingValues => uvs.values.asScala.toSeq.flatMap(toStrictValue)
@@ -79,6 +83,20 @@ object SourceGenerator {
7983 case uds : UsingDefs => uds.getUsingDefs.asScala.toSeq.map(toStrictDirective)
8084 case _ => Nil // There should be nothing else here other than UsingDefs
8185 }
86+
87+ def replaceSpecialSyntax (directiveValue : String , path : os.Path ): String = {
88+ val pattern = """ (((?:\$)+)(\{\.\}))""" .r
89+ pattern.replaceAllIn(
90+ directiveValue,
91+ (m : Regex .Match ) => {
92+ val dollarSigns = m.group(2 )
93+ val dollars = " \\ $" * (dollarSigns.length / 2 )
94+ if (dollarSigns.length % 2 == 0 )
95+ s " $dollars${m.group(3 )}"
96+ else
97+ s " $dollars${path / os.up}"
98+ }
99+ )
82100 }
83101
84102 val componentKeyword = Seq (" inputDirectory" , " glob" )
@@ -90,31 +108,26 @@ object SourceGenerator {
90108 )
91109 )
92110
93- // generatorComponents.map(f => f.map(g => println(g.values)))
111+ val pathModifier = scriptsValue.iterator
94112 val directive = generatorComponents.collect {
95113 case Seq (inputDir, glob) =>
114+ val relPath = pathModifier.next()
96115 GeneratorConfig (
97- inputDir.values.mkString,
116+ replaceSpecialSyntax( inputDir.values.mkString, relPath) ,
98117 List (glob.values.mkString),
99118 scripts.value(0 ).value,
100119 scripts.scopePath.subPath
101120 )
102121 }
103122
104- // val sourceGenValue = sourceGenerator.value
105- // sourceGenValue
106- // .map(config => GeneratorConfig.parse(config, sourceGenerator.scopePath.subPath))
107- // .sequence
108- // .left.map(CompositeBuildException(_))
109- // .map { configs =>
110- // BuildOptions(sourceGeneratorOptions =
111- // SourceGeneratorOptions(generatorConfig = configs)
112- // )
113- // }
114- // directive.map { f => println(f)}
123+ val excludedGeneratorPath = excludeScripts.match {
124+ case Some (true ) => scripts.value
125+ case _ => List .empty[Positioned [String ]]
126+ }
115127
116- Right (BuildOptions (sourceGeneratorOptions =
117- SourceGeneratorOptions (generatorConfig = directive)
128+ Right (BuildOptions (
129+ sourceGeneratorOptions = SourceGeneratorOptions (generatorConfig = directive),
130+ internal = InternalOptions (exclude = excludedGeneratorPath)
118131 ))
119132 }
120133}
0 commit comments