logo

class

compiler::ReflectPod

sys::Obj
  compiler::ReflectPod : compiler::CPod
  1  //
  2  // Copyright (c) 2006, Brian Frank and Andy Frank
  3  // Licensed under the Academic Free License version 3.0
  4  //
  5  // History:
  6  //   4 Jun 06  Brian Frank  Creation
  7  //
  8  
  9  **
 10  ** ReflectPod is the CPod wrapper for a dependent Pod loaded via reflection.
 11  **
 12  class ReflectPod : CPod
 13  {
 14  
 15    new make(ReflectNamespace ns, Pod pod)
 16    {
 17      this.ns = ns
 18      this.pod = pod
 19    }
 20  
 21    override readonly ReflectNamespace ns
 22  
 23    override Str name() { return pod.name }
 24  
 25    override Version version() { return pod.version }
 26  
 27    override readonly CType[] types
 28    {
 29      get
 30      {
 31        if (!loadedAllTypes)
 32        {
 33          loadedAllTypes = true
 34          pod.types.each |Type t| { resolveType(t.name, true) }
 35        }
 36        return typeMap.values
 37      }
 38    }
 39  
 40    override ReflectType resolveType(Str typeName, Bool checked)
 41    {
 42      // check cache first
 43      rt := typeMap[typeName]
 44      if (rt != null) return rt
 45  
 46      // use reflection
 47      t := pod.findType(typeName, checked)
 48      if (t == null) return null
 49  
 50      // make ReflectType and add to both
 51      // my own and my namespace cache
 52      rt = ReflectType.make(ns, t)
 53      typeMap[typeName] = rt
 54      ns.types[t.signature] = rt
 55      return rt
 56    }
 57  
 58    override Str toStr()
 59    {
 60      return name
 61    }
 62  
 63    readonly Pod pod
 64    private Str:ReflectType typeMap := Str:ReflectType[:]
 65    private Bool loadedAllTypes := false
 66  
 67  }