diff --git a/src/nimblepkg/declarativeparser.nim b/src/nimblepkg/declarativeparser.nim index 16cd595a7..b018bf82e 100644 --- a/src/nimblepkg/declarativeparser.nim +++ b/src/nimblepkg/declarativeparser.nim @@ -4,8 +4,8 @@ import std/strutils import compiler/[ast, idents, msgs, syntaxes, options, pathutils, lineinfos] -import version, packageinfotypes, packageinfo, options, packageparser -import std/[tables, sequtils, strscans, strformat] +import version, packageinfotypes, packageinfo, options, packageparser, cli +import std/[tables, sequtils, strscans, strformat, os] type NimbleFileInfo* = object nimbleFile*: string @@ -207,25 +207,27 @@ iterator tokenizeRequires*(s: string): string = yield tok -proc parseRequiresWithFeatures(require: string): (PkgTuple, seq[string]) = +proc parseRequiresWithFeatures(require: string): seq[(PkgTuple, seq[string])] = #features are expressed like this: require[feature1, feature2] - var featuresStr: string - var requireStr: string - var features = newSeq[string]() - if scanf(require, "$*[$*]", requireStr, featuresStr): - features = featuresStr.split(",") - return (parseRequires(requireStr), features) - else: - return (parseRequires(require), @[]) + result = newSeq[(PkgTuple, seq[string])]() + for req in require.split(",").mapIt(it.strip): + var featuresStr: string + var requireStr: string + var features = newSeq[string]() + if scanf(req, "$*[$*]", requireStr, featuresStr): + features = featuresStr.split(",") + result.add((parseRequires(requireStr), features)) + else: + result.add((parseRequires(req), @[])) proc getRequires*(nimbleFileInfo: NimbleFileInfo, pkgActiveFeatures: var Table[PkgTuple, seq[string]]): seq[PkgTuple] = for require in nimbleFileInfo.requires: - let (pkgTuple, activeFeatures) = parseRequiresWithFeatures(require) - if activeFeatures.len > 0: - # displayInfo &"Package {nimbleFileInfo.nimbleFile} Found active features {activeFeatures} for {pkgTuple}", priority = HighPriority - pkgActiveFeatures[pkgTuple] = activeFeatures + for (pkgTuple, activeFeatures) in parseRequiresWithFeatures(require): + if activeFeatures.len > 0: + # displayInfo &"Package {nimbleFileInfo.nimbleFile} Found active features {activeFeatures} for {pkgTuple}", priority = HighPriority + pkgActiveFeatures[pkgTuple] = activeFeatures - result.add(pkgTuple) + result.add(pkgTuple) proc getFeatures*(nimbleFileInfo: NimbleFileInfo): Table[string, seq[PkgTuple]] = result = initTable[string, seq[PkgTuple]]() @@ -238,6 +240,10 @@ proc toRequiresInfo*(pkgInfo: PackageInfo, options: Options): PackageInfo = if pkgInfo.basicInfo.name.isNim: return pkgInfo.toFullInfo(options) + if pkgInfo.myPath.splitFile.ext == ".babel": + displayWarning &"Package {pkgInfo.basicInfo.name} is a babel package, skipping declarative parser", priority = HighPriority + return pkgInfo.toFullInfo(options) + let nimbleFileInfo = extractRequiresInfo(pkgInfo.myPath) result = pkgInfo result.requires = getRequires(nimbleFileInfo, result.activeFeatures) diff --git a/src/nimblepkg/options.nim b/src/nimblepkg/options.nim index dafaa8a86..c7a8f9109 100644 --- a/src/nimblepkg/options.nim +++ b/src/nimblepkg/options.nim @@ -818,7 +818,8 @@ proc initOptions*(): Options = startDir: getCurrentDir(), nimBinariesDir: getHomeDir() / ".nimble" / "nimbinaries", maxTaggedVersions: 4, - useSatSolver: true + useSatSolver: true, + useDeclarativeParser: false ) proc handleUnknownFlags(options: var Options) = diff --git a/tests/sattests/cycletest/cycletest.nimble b/tests/sattests/cycletest/cycletest.nimble index 89ce7ee0c..72b4eff15 100644 --- a/tests/sattests/cycletest/cycletest.nimble +++ b/tests/sattests/cycletest/cycletest.nimble @@ -9,4 +9,4 @@ srcDir = "src" # Dependencies -requires "https://github.com/disruptek/frosty" +requires "nim", "https://github.com/disruptek/frosty"