diff options
author | Simon Hafner <hafnersimon@gmail.com> | 2015-05-08 06:40:34 +0500 |
---|---|---|
committer | Simon Hafner <hafnersimon@gmail.com> | 2015-05-08 06:40:34 +0500 |
commit | f5cca89610905f35b50259cfe81e6d1d4153d39c (patch) | |
tree | 3c49f45590875e4eab78ae976d6ac254030e62af /compiler/plugins.nim | |
parent | 2474c1bb111b38ddef64659c893722b357a27384 (diff) | |
parent | c384f05e49e0716cc99042491f65bcc7d415d4c3 (diff) | |
download | Nim-f5cca89610905f35b50259cfe81e6d1d4153d39c.tar.gz |
merged devel into epc
Diffstat (limited to 'compiler/plugins.nim')
-rw-r--r-- | compiler/plugins.nim | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/compiler/plugins.nim b/compiler/plugins.nim new file mode 100644 index 000000000..1c9b7b77b --- /dev/null +++ b/compiler/plugins.nim @@ -0,0 +1,43 @@ +# +# +# The Nim Compiler +# (c) Copyright 2015 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## Plugin support for the Nim compiler. Right now there are no plugins and they +## need to be build with the compiler, no DLL support. + +import ast, semdata, idents + +type + Transformation* = proc (c: PContext; n: PNode): PNode {.nimcall.} + Plugin = ref object + fn, module, package: PIdent + t: Transformation + next: Plugin + +proc pluginMatches(p: Plugin; s: PSym): bool = + if s.name.id != p.fn.id: return false + let module = s.owner + if module == nil or module.kind != skModule or + module.name.id != p.module.id: return false + let package = module.owner + if package == nil or package.kind != skPackage or + package.name.id != p.package.id: return false + return true + +var head: Plugin + +proc getPlugin*(fn: PSym): Transformation = + var it = head + while it != nil: + if pluginMatches(it, fn): return it.t + it = it.next + +proc registerPlugin*(package, module, fn: string; t: Transformation) = + let oldHead = head + head = Plugin(fn: getIdent(fn), module: getIdent(module), + package: getIdent(package), t: t, next: oldHead) |