//recursively get all the types this object represents. private SortedSet <Type> GetTypesForImport(Object value) { Type valueType = value.GetType(); SortedSet <Type> set = new SortedSet <Type>(); IEnumerable collection = value as IEnumerable; if (collection != null) { foreach (var item in collection) { set.UnionWith(GetTypesForImport(item)); } } else if (valueType.IsGenericType) { Type generictype = valueType.GetGenericTypeDefinition(); set.UnionWith(generictype.GetGenericArguments()); //also add the valueType to be used as raw data set.Add(valueType); } else { set.Add(CLRObjectMarshaler.GetPublicType(valueType)); } return(set); }
internal ImportNode Compile(ImportModuleHandler importer) { ImportNode impNode = null; foreach (var item in mData) { SortedSet <Type> types = GetTypesForImport(item.Value.Data); foreach (var type in types) { if (CLRObjectMarshaler.IsMarshaledAsNativeType(type)) { continue; } ImportNode node = importer.Import(type.Assembly.Location, type.FullName, ""); if (impNode != null && node != null) { impNode.CodeNode.Body.AddRange(node.CodeNode.Body); } else { impNode = node; } } if (impNode == null) { impNode = new ImportNode() { ModuleName = "ExternalContext", CodeNode = new ProtoCore.AST.AssociativeAST.CodeBlockNode() } } ; impNode.CodeNode.Body.Add(ContextDataMethodCallNode(item.Value)); } return(impNode); }