diff options
Diffstat (limited to 'project/ParserUtil.scala')
-rw-r--r-- | project/ParserUtil.scala | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/project/ParserUtil.scala b/project/ParserUtil.scala index f6658b146b..cdaf8831a5 100644 --- a/project/ParserUtil.scala +++ b/project/ParserUtil.scala @@ -9,41 +9,39 @@ object ParserUtil { p.map(x => x._1 + x._2) } - def EitherOr(a: Parser[String], b: Parser[String]): Parser[String] = { - a.flatMap[String] { - case "" => b - case x: String => - concat(Space.string ~ b).map[String]((s: String) => x + s) - } - } def Opt(a: Parser[String]) = a.?.map(_.getOrElse("")) val StringBasicNotStartingWithDash = notStartingWith(StringBasic, '-') val IsDirectoryFilter = new SimpleFileFilter(_.isDirectory) val JarOrDirectoryParser = FileParser(GlobFilter("*.jar") || IsDirectoryFilter) - def FileParser(filter: FileFilter, dirFilter: FileFilter = AllPassFilter, base: File = file(".")) = { + def FileParser(fileFilter: FileFilter, dirFilter: FileFilter = AllPassFilter, base: File = file(".")) = { def matching(prefix: String): List[String] = { val preFile = file(prefix) val cwd = base val parent = Option(preFile.getParentFile).getOrElse(cwd) if (preFile.exists) { if (preFile.isDirectory) { - preFile.*(IsDirectoryFilter.&&(dirFilter) || filter).get.map(_.getPath).toList + preFile.*(IsDirectoryFilter.&&(dirFilter) || fileFilter).get.map(_.getPath).toList } else { - List(preFile).filter(filter.accept).map(_.getPath) + List(preFile).filter(fileFilter.accept).map(_.getPath) } } else if (parent != null) { def ensureSuffix(s: String, suffix: String) = if (s.endsWith(suffix)) s else s + suffix - def pathOf(f: File): String = if (f.isDirectory && !filter.accept(f)) ensureSuffix(f.getPath, "/") else f.getPath - parent.*(GlobFilter(preFile.name + "*") && ((IsDirectoryFilter && dirFilter) || filter)).get.map(x => pathOf(if (parent == cwd) x.relativeTo(cwd).get else x)).toList + def pathOf(f: File): String = { + val f1 = if (preFile.getParentFile == null) f.relativeTo(cwd).getOrElse(f) else f + if (f1.isDirectory && !fileFilter.accept(f1)) ensureSuffix(f1.getPath, "/") else f1.getPath + } + val childFilter = GlobFilter(preFile.name + "*") && ((IsDirectoryFilter && dirFilter) || fileFilter) + val children = parent.*(childFilter).get + children.map(pathOf).toList } else Nil } def displayPath = Completions.single(Completion.displayOnly("<path>")) token(StringBasic, TokenCompletions.fixed((seen, level) => if (seen.isEmpty) displayPath else matching(seen) match { case Nil => displayPath case x :: Nil => - if (filter.accept(file(x))) + if (fileFilter.accept(file(x))) Completions.strict(Set(Completion.tokenDisplay(x.stripPrefix(seen), x))) else Completions.strict(Set(Completion.suggestion(x.stripPrefix(seen)))) |