public ClassEntry(IClass cls, FileEntry fileEntry, NamespaceEntry namespaceRef) { this.cls = cls; this.fileEntry = fileEntry; this.namespaceRef = namespaceRef; this.name = cls.Name; position = -1; }
bool GetBestNamespaceEntry(string[] path, int length, bool createPath, bool caseSensitive, out NamespaceEntry lastEntry, out int numMatched) { lastEntry = rootNamespace; if (length == 0 || (length == 1 && path[0] == "")) { numMatched = length; return true; } else { for (int n=0; n<length; n++) { NamespaceEntry nh = lastEntry.GetNamespace (path[n], caseSensitive); if (nh == null) { if (!createPath) { numMatched = n; return false; } nh = new NamespaceEntry (); lastEntry.Add (path[n], nh); } lastEntry = nh; } numMatched = length; return true; } }
public ClassUpdateInformation UpdateClassInformation(ClassCollection newClasses, string fileName) { lock (rwlock) { ClassUpdateInformation res = new ClassUpdateInformation (); FileEntry fe = files [fileName] as FileEntry; if (fe == null) return null; bool[] added = new bool [newClasses.Count]; NamespaceEntry[] newNss = new NamespaceEntry [newClasses.Count]; for (int n=0; n<newClasses.Count; n++) { string[] path = newClasses[n].Namespace.Split ('.'); newNss[n] = GetNamespaceEntry (path, path.Length, true, true); } ArrayList newFileClasses = new ArrayList (); if (fe != null) { ClassEntry ce = fe.FirstClass; while (ce != null) { IClass newClass = null; for (int n=0; n<newClasses.Count && newClass == null; n++) { IClass uc = newClasses [n]; if (uc.Name == ce.Name && newNss[n] == ce.NamespaceRef) { newClass = uc; added[n] = true; } } if (newClass != null) { // Class found, replace it ce.Class = CopyClass (newClass); ce.LastGetTime = currentGetTime++; newFileClasses.Add (ce); res.Modified.Add (ce.Class); } else { // Class not found, it has to be deleted, unless it has // been added in another file if (ce.FileEntry == fe) { IClass c = ce.Class; if (c == null) c = ReadClass (ce); res.Removed.Add (c); ce.NamespaceRef.Remove (ce.Name); } } ce = ce.NextInFile; } } if (fe == null) { fe = new FileEntry (fileName); files [fileName] = fe; } for (int n=0; n<newClasses.Count; n++) { if (!added[n]) { IClass c = CopyClass (newClasses[n]); ClassEntry ce = new ClassEntry (c, fe, newNss[n]); ce.LastGetTime = currentGetTime++; newNss[n].Add (c.Name, ce); newFileClasses.Add (ce); res.Added.Add (c); } } fe.SetClasses (newFileClasses); rootNamespace.Clean (); fe.LastParseTime = DateTime.Now; modified = true; Flush (); return res; } }
public virtual void Read() { if (basePath == null) throw new InvalidOperationException ("Location not set"); if (!File.Exists (dataFile)) return; lock (rwlock) { FileStream ifile = null; try { modified = false; currentGetTime = 0; CloseReader (); Runtime.LoggingService.Info ("Reading " + dataFile); ifile = new FileStream (dataFile, FileMode.Open, FileAccess.Read, FileShare.Read); BinaryFormatter bf = new BinaryFormatter (); // Read the headers headers = (Hashtable) bf.Deserialize (ifile); int ver = (int) headers["Version"]; if (ver != FORMAT_VERSION) throw new Exception ("Expected version " + FORMAT_VERSION + ", found version " + ver); // Move to the index offset and read the index BinaryReader br = new BinaryReader (ifile); long indexOffset = br.ReadInt64 (); ifile.Position = indexOffset; object[] data = (object[]) bf.Deserialize (ifile); Queue dataQueue = new Queue (data); references = (ArrayList) dataQueue.Dequeue (); rootNamespace = (NamespaceEntry) dataQueue.Dequeue (); files = (Hashtable) dataQueue.Dequeue (); DeserializeData (dataQueue); ifile.Close (); } catch (Exception ex) { if (ifile != null) ifile.Close (); Runtime.LoggingService.Info ("PIDB file '" + dataFile + "' couldn not be loaded: '" + ex.Message + "'. The file will be recreated"); rootNamespace = new NamespaceEntry (); files = new Hashtable (); references = new ArrayList (); headers = new Hashtable (); } } }
public void Clear() { rootNamespace = new NamespaceEntry (); files = new Hashtable (); references = new ArrayList (); headers = new Hashtable (); }
public CodeCompletionDatabase(ParserDatabase parserDatabase) { this.parserDatabase = parserDatabase; rootNamespace = new NamespaceEntry (); files = new Hashtable (); references = new ArrayList (); headers = new Hashtable (); }