diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-07-07 01:02:12 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-07-07 01:02:12 +0200 |
commit | e9eab32e54815bfad09fb0120aa4b024106f00ba (patch) | |
tree | 3b9a9f9e749d1000c74943253e57aee97428c394 | |
parent | 28940ce457e7a7f3e2d1d6cc0223bc0282ce509e (diff) | |
download | Nim-e9eab32e54815bfad09fb0120aa4b024106f00ba.tar.gz |
new language feature: explicit 'import system' statements are allowed
-rw-r--r-- | compiler/modules.nim | 4 | ||||
-rw-r--r-- | compiler/sem.nim | 25 | ||||
-rw-r--r-- | compiler/semdata.nim | 1 | ||||
-rw-r--r-- | tests/modules/texplicit_system_import.nim | 9 | ||||
-rw-r--r-- | web/news/version_0_15_released.rst | 3 |
5 files changed, 37 insertions, 5 deletions
diff --git a/compiler/modules.nim b/compiler/modules.nim index 8ac964321..03b9dc9f0 100644 --- a/compiler/modules.nim +++ b/compiler/modules.nim @@ -184,8 +184,8 @@ proc importModule*(s: PSym, fileIdx: int32): PSym {.procvar.} = # this is called by the semantic checking phase result = compileModule(fileIdx, {}) if optCaasEnabled in gGlobalOptions: addDep(s, fileIdx) - if sfSystemModule in result.flags: - localError(result.info, errAttemptToRedefine, result.name.s) + #if sfSystemModule in result.flags: + # localError(result.info, errAttemptToRedefine, result.name.s) # restore the notes for outer module: gNotes = if s.owner.id == gMainPackageId: gMainPackageNotes else: ForeignPackageNotes diff --git a/compiler/sem.nim b/compiler/sem.nim index 6e462dec4..bd7c97fcb 100644 --- a/compiler/sem.nim +++ b/compiler/sem.nim @@ -418,9 +418,6 @@ proc myOpen(module: PSym): PPassContext = c.importTable.addSym(module) # a module knows itself if sfSystemModule in module.flags: magicsys.systemModule = module # set global variable! - else: - c.importTable.addSym magicsys.systemModule # import the "System" identifier - importAllSymbols(c, magicsys.systemModule) c.topLevelScope = openScope(c) # don't be verbose unless the module belongs to the main package: if module.owner.id == gMainPackageId: @@ -434,7 +431,29 @@ proc myOpenCached(module: PSym, rd: PRodReader): PPassContext = result = myOpen(module) for m in items(rd.methods): methodDef(m, true) +proc isImportSystemStmt(n: PNode): bool = + if magicsys.systemModule == nil: return false + case n.kind + of nkImportStmt: + for x in n: + let f = checkModuleName(x) + if f == magicsys.systemModule.info.fileIndex: + return true + of nkImportExceptStmt, nkFromStmt: + let f = checkModuleName(n[0]) + if f == magicsys.systemModule.info.fileIndex: + return true + else: discard + proc semStmtAndGenerateGenerics(c: PContext, n: PNode): PNode = + if c.topStmts == 0 and not isImportSystemStmt(n): + if sfSystemModule notin c.module.flags and + n.kind notin {nkEmpty, nkCommentStmt}: + c.importTable.addSym magicsys.systemModule # import the "System" identifier + importAllSymbols(c, magicsys.systemModule) + inc c.topStmts + else: + inc c.topStmts if sfNoForward in c.module.flags: result = semAllTypeSections(c, n) else: diff --git a/compiler/semdata.nim b/compiler/semdata.nim index 91a1ebf86..52b5dc274 100644 --- a/compiler/semdata.nim +++ b/compiler/semdata.nim @@ -99,6 +99,7 @@ type unknownIdents*: IntSet # ids of all unknown identifiers to prevent # naming it multiple times generics*: seq[TInstantiationPair] # pending list of instantiated generics to compile + topStmts*: int # counts the number of encountered top level statements lastGenericIdx*: int # used for the generics stack hloLoopDetector*: int # used to prevent endless loops in the HLO inParallelStmt*: int diff --git a/tests/modules/texplicit_system_import.nim b/tests/modules/texplicit_system_import.nim new file mode 100644 index 000000000..bc4d018bf --- /dev/null +++ b/tests/modules/texplicit_system_import.nim @@ -0,0 +1,9 @@ +##. +import system except `+` +discard """ + errormsg: "undeclared identifier: '+'" + line: 9 +""" +# Testament requires that the initial """ occurs before the 40th byte +# in the file. No kidding... +echo 4+5 diff --git a/web/news/version_0_15_released.rst b/web/news/version_0_15_released.rst index e85582d97..e940a2da8 100644 --- a/web/news/version_0_15_released.rst +++ b/web/news/version_0_15_released.rst @@ -54,6 +54,9 @@ Language Additions - Added ``{.intdefine.}`` and ``{.strdefine.}`` macros to make use of (optional) compile time defines. +- If the first statement is an ``import system`` statement then ``system`` + is not imported implicitly anymore. This allows for code like + ``import system except echo`` or ``from system import nil``. Bugfixes -------- |