//
// Copyright (c) 2006, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 15 Sep 05 Brian Frank Creation
// 29 Aug 06 Brian Frank Ported from Java to Fan
//
**
** ReflectNamespace implements Namespace using reflection to
** compile against the VM's current pod repository.
**
class ReflectNamespace : CNamespace
{
//////////////////////////////////////////////////////////////////////////
// Constructor
//////////////////////////////////////////////////////////////////////////
**
** Construct a ReflectNamespace
**
new make()
{
this.pods = Str:ReflectPod[:]
init
}
//////////////////////////////////////////////////////////////////////////
// CNamespace
//////////////////////////////////////////////////////////////////////////
**
** Map an imported Pod into a CPod
**
protected override ReflectPod? findPod(Str podName)
{
// try to load it
pod := Pod.find(podName, false)
if (pod == null) return null
return ReflectPod(this, pod)
}
//////////////////////////////////////////////////////////////////////////
// Mapping
//////////////////////////////////////////////////////////////////////////
**
** Map an imported Pod into a CPod
**
ReflectPod importPod(Pod pod)
{
return resolvePod(pod.name, null)
}
**
** Map an imported Type into a CType
**
CType? importType(Type? t)
{
if (t == null) return null
return resolveType(t.signature)
}
**
** Map a list of imported Types into a CTypes
**
CType[] importTypes(Type[] t)
{
t.map |Type x->CType| { importType(x) }
}
**
** Map an imported Slot into a CSlot
**
CSlot importSlot(Slot slot)
{
if (slot is Method)
return importMethod((Method)slot)
else
return importField((Field)slot)
}
**
** Map an imported Field into a CField
**
CField importField(Field f)
{
ReflectField(this, importType(f.parent), f)
}
**
** Map an imported Method into a CMethod
**
CMethod importMethod(Method m)
{
ReflectMethod(this, importType(m.parent), m)
}
//////////////////////////////////////////////////////////////////////////
// Fields
//////////////////////////////////////////////////////////////////////////
private Str:ReflectPod pods // keyed by pod name
}