public static string FollowLink(this IMEPackage pcc, int uIndex) { if (pcc.isUExport(uIndex)) { ExportEntry parent = pcc.getUExport(uIndex); return(pcc.FollowLink(parent.idxLink) + parent.ObjectName + "."); } if (pcc.isImport(uIndex)) { ImportEntry parent = pcc.getImport(uIndex); return(pcc.FollowLink(parent.idxLink) + parent.ObjectName + "."); } return(""); }
private string relinkObjectProperty(IMEPackage importingPCC, IMEPackage destinationPCC, ObjectProperty objProperty, List <KeyValuePair <int, int> > crossPCCObjectMappingList) { if (objProperty.Value == 0) { return(null); //do not relink 0 } if (importingPCC == destinationPCC && objProperty.Value < 0) { return(null); //do not relink same-pcc imports. } int sourceObjReference = objProperty.Value; if (sourceObjReference > 0) { sourceObjReference--; //make 0 based for mapping. } if (sourceObjReference < 0) { sourceObjReference++; //make 0 based for mapping. } //if (objProperty.Name != null) //{ // Debug.WriteLine(objProperty.Name); //} KeyValuePair <int, int> mapping = crossPCCObjectMappingList.Where(pair => pair.Key == sourceObjReference).FirstOrDefault(); var defaultKVP = default(KeyValuePair <int, int>); //struct comparison if (!mapping.Equals(defaultKVP)) { //relink int newval = 0; if (mapping.Value > 0) { newval = mapping.Value + 1; //reincrement } else if (mapping.Value < 0) { newval = mapping.Value - 1; //redecrement } objProperty.Value = (newval); IEntry entry = destinationPCC.getEntry(newval); string s = ""; if (entry != null) { s = entry.GetFullPath; } Debug.WriteLine("Relink hit: " + sourceObjReference + objProperty.Name + ": " + s); } else if (objProperty.Value < 0) //It's an unmapped import { //objProperty is currently pointing to importingPCC as that is where we read the properties from int n = objProperty.Value; int origvalue = n; int importZeroIndex = Math.Abs(n) - 1; //Debug.WriteLine("Relink miss, attempting JIT relink on " + n + " " + rootNode.Text); if (n < 0 && importZeroIndex < importingPCC.ImportCount) { //Get the original import ImportEntry origImport = importingPCC.getImport(importZeroIndex); string origImportFullName = origImport.GetFullPath; //Debug.WriteLine("We should import " + origImport.GetFullPath); ImportEntry crossImport = null; string linkFailedDueToError = null; try { crossImport = getOrAddCrossImport(origImportFullName, importingPCC, destinationPCC); } catch (Exception e) { //Error during relink KFreonLib.Debugging.DebugOutput.StartDebugger("PCC Relinker"); DebugOutput.PrintLn("Exception occured during relink: "); DebugOutput.PrintLn(ExceptionHandlerDialogWPF.FlattenException(e)); DebugOutput.PrintLn("You may want to consider discarding this sessions' changes as relinking was not able to properly finish."); linkFailedDueToError = e.Message; } if (crossImport != null) { //cache item. Imports are stored +1, Exports-1. Someday I will go back and make this just 0 indexed crossPCCObjectMappingList.Add(new KeyValuePair <int, int>(sourceObjReference, crossImport.UIndex + 1)); //add to mapping to speed up future relinks objProperty.Value = crossImport.UIndex; Debug.WriteLine("Relink hit: Dynamic CrossImport for " + origvalue + " " + importingPCC.getEntry(origvalue).GetFullPath + " -> " + objProperty.Value); } else { if (linkFailedDueToError != null) { Debug.WriteLine("Relink failed: CrossImport porting failed for " + objProperty.Name + " " + objProperty.Value + ": " + importingPCC.getEntry(origvalue).GetFullPath); return("Relink failed for " + objProperty.Name + " " + objProperty.Value + ": " + linkFailedDueToError); } else if (destinationPCC.getEntry(objProperty.Value) != null) { Debug.WriteLine("Relink failed: CrossImport porting failed for " + objProperty.Name + " " + objProperty.Value + ": " + importingPCC.getEntry(origvalue).GetFullPath); return("Relink failed: CrossImport porting failed for " + objProperty.Name + " " + objProperty.Value + " " + destinationPCC.getEntry(objProperty.Value).GetFullPath); } else { return("Relink failed: New export does not exist - this is probably a bug in cross import code for " + objProperty.Name + " " + objProperty.Value); } } } } else { string path = importingPCC.getEntry(objProperty.Value) != null?importingPCC.getEntry(objProperty.Value).GetFullPath : "Entry not found: " + objProperty.Value; Debug.WriteLine("Relink failed: " + objProperty.Name + " " + objProperty.Value + " " + path); return("Relink failed: " + objProperty.Name + " " + objProperty.Value + " " + path); } return(null); }
private void importImport(IMEPackage importpcc, int n, int link) { ImportEntry imp = importpcc.getImport(n); ImportEntry nimp = new ImportEntry(pcc, imp.header); nimp.idxLink = link; nimp.idxClassName = pcc.FindNameOrAdd(importpcc.getNameEntry(imp.idxClassName)); nimp.idxObjectName = pcc.FindNameOrAdd(importpcc.getNameEntry(imp.idxObjectName)); nimp.idxPackageFile = pcc.FindNameOrAdd(importpcc.getNameEntry(imp.idxPackageFile)); pcc.addImport(nimp); }