[Monodevelop-patches-list] r1634 - in trunk/MonoDevelop/src/Main/Base: . Internal/Parser/PersistenceLayer Services/ParserService

commit-watcher at mono-cvs.ximian.com commit-watcher at mono-cvs.ximian.com
Tue May 25 19:29:24 EDT 2004


Author: lluis
Date: 2004-05-25 19:29:23 -0400 (Tue, 25 May 2004)
New Revision: 1634

Modified:
   trunk/MonoDevelop/src/Main/Base/ChangeLog
   trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentClass.cs
   trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentEvent.cs
   trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentField.cs
   trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentIndexer.cs
   trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentMethod.cs
   trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentParameter.cs
   trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentProperty.cs
   trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentReturnType.cs
   trunk/MonoDevelop/src/Main/Base/Services/ParserService/CodeCompletionDatabase.cs
   trunk/MonoDevelop/src/Main/Base/Services/ParserService/DefaultParserService.cs
Log:
	* Services/ParserService/DefaultParserService.cs: Type names for fields,
	  parameters, base classes and so on come unresolved from the parser
	  (without namespace information). They must be resolved before adding them
	  to the database. This is done through the method ResolveTypes.
	* CodeCompletionDatabase.cs: Resolve type names before adding the class to
	  the database.
	* PersistentIndexer.cs, PersistentParameter.cs, PersistentMethod.cs,
	  PersistentReturnType.cs, PersistentEvent.cs, PersistentField.cs,
	  PersistentProperty.cs, PersistentClass.cs: Added method for resolving
	  the type names.



Modified: trunk/MonoDevelop/src/Main/Base/ChangeLog
===================================================================
--- trunk/MonoDevelop/src/Main/Base/ChangeLog	2004-05-25 20:16:04 UTC (rev 1633)
+++ trunk/MonoDevelop/src/Main/Base/ChangeLog	2004-05-25 23:29:23 UTC (rev 1634)
@@ -1,3 +1,16 @@
+2004-05-26  Lluis Sanchez Gual  <lluis at ximian.com>
+
+	* Services/ParserService/DefaultParserService.cs: Type names for fields,
+	  parameters, base classes and so on come unresolved from the parser
+	  (without namespace information). They must be resolved before adding them
+	  to the database. This is done through the method ResolveTypes.
+	* CodeCompletionDatabase.cs: Resolve type names before adding the class to
+	  the database.
+	* PersistentIndexer.cs, PersistentParameter.cs, PersistentMethod.cs,
+	  PersistentReturnType.cs, PersistentEvent.cs, PersistentField.cs,
+	  PersistentProperty.cs, PersistentClass.cs: Added method for resolving
+	  the type names.
+
 2004-05-25  Todd Berman  <tberman at sevenl.net>
 
 	* Services/ParserService/DefaultParserService.cs: create the directory

Modified: trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentClass.cs
===================================================================
--- trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentClass.cs	2004-05-25 20:16:04 UTC (rev 1633)
+++ trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentClass.cs	2004-05-25 23:29:23 UTC (rev 1634)
@@ -24,6 +24,41 @@
 			}
 		}
 
+		public static PersistentClass Resolve (IClass sclass, ITypeResolver typeResolver)
+		{
+			PersistentClass cls = new PersistentClass ();
+			
+			cls.FullyQualifiedName = sclass.FullyQualifiedName;
+			cls.Documentation = sclass.Documentation;
+			
+			cls.modifiers          = sclass.Modifiers;
+			cls.classType          = sclass.ClassType;
+
+			foreach (string t in sclass.BaseTypes)
+				cls.baseTypes.Add (typeResolver.Resolve (t));
+			
+			foreach (IClass c in sclass.InnerClasses)
+				cls.innerClasses.Add (PersistentClass.Resolve (c,typeResolver));
+
+			foreach (IField f in sclass.Fields)
+				cls.fields.Add (PersistentField.Resolve (f, typeResolver));
+
+			foreach (IProperty p in sclass.Properties)
+				cls.properties.Add (PersistentProperty.Resolve (p, typeResolver));
+
+			foreach (IMethod m in sclass.Methods)
+				cls.methods.Add (PersistentMethod.Resolve (m, typeResolver));
+
+			foreach (IEvent e in sclass.Events)
+				cls.events.Add (PersistentEvent.Resolve (e, typeResolver));
+
+			foreach (IIndexer i in sclass.Indexer)
+				cls.indexer.Add (PersistentIndexer.Resolve (i, typeResolver));
+			
+			cls.region = sclass.Region;
+			return cls;
+		}
+		
 		public static PersistentClass Read (BinaryReader reader, INameDecoder nameTable)
 		{
 			PersistentClass cls = new PersistentClass ();

Modified: trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentEvent.cs
===================================================================
--- trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentEvent.cs	2004-05-25 20:16:04 UTC (rev 1633)
+++ trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentEvent.cs	2004-05-25 23:29:23 UTC (rev 1634)
@@ -14,6 +14,17 @@
 	[Serializable]
 	public sealed class PersistentEvent : AbstractEvent
 	{
+		public static PersistentEvent Resolve (IEvent source, ITypeResolver typeResolver)
+		{
+			PersistentEvent ev = new PersistentEvent();
+			ev.FullyQualifiedName = source.FullyQualifiedName;
+			ev.Documentation = source.Documentation;
+			ev.modifiers = source.Modifiers;
+			ev.returnType = PersistentReturnType.Resolve (source.ReturnType, typeResolver);
+			ev.region = source.Region;
+			return ev;
+		}
+		
 		public static PersistentEvent Read (BinaryReader reader, INameDecoder nameTable)
 		{
 			PersistentEvent ev = new PersistentEvent();

Modified: trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentField.cs
===================================================================
--- trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentField.cs	2004-05-25 20:16:04 UTC (rev 1633)
+++ trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentField.cs	2004-05-25 23:29:23 UTC (rev 1634)
@@ -14,6 +14,17 @@
 	[Serializable]
 	public sealed class PersistentField : AbstractField
 	{
+		public static PersistentField Resolve (IField source, ITypeResolver typeResolver)
+		{
+			PersistentField field = new PersistentField ();
+			field.FullyQualifiedName = source.FullyQualifiedName;
+			field.Documentation = source.Documentation;
+			field.modifiers = source.Modifiers;
+			field.returnType = PersistentReturnType.Resolve (source.ReturnType, typeResolver);
+			field.region = source.Region;
+			return field;
+		}
+		
 		public static PersistentField Read (BinaryReader reader, INameDecoder nameTable)
 		{
 			PersistentField field = new PersistentField ();

Modified: trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentIndexer.cs
===================================================================
--- trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentIndexer.cs	2004-05-25 20:16:04 UTC (rev 1633)
+++ trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentIndexer.cs	2004-05-25 23:29:23 UTC (rev 1634)
@@ -14,6 +14,21 @@
 	[Serializable]
 	public sealed class PersistentIndexer : AbstractIndexer
 	{
+		public static PersistentIndexer Resolve (IIndexer source, ITypeResolver typeResolver)
+		{
+			PersistentIndexer ind = new PersistentIndexer();
+			ind.FullyQualifiedName = source.FullyQualifiedName;
+			ind.Documentation = source.Documentation;
+			ind.modifiers = source.Modifiers;
+			ind.returnType = PersistentReturnType.Resolve (source.ReturnType, typeResolver);
+
+			foreach (IParameter p in source.Parameters)
+				ind.parameters.Add (PersistentParameter.Resolve (p, typeResolver));
+
+			ind.region = source.Region;
+			return ind;
+		}
+		
 		public static PersistentIndexer Read (BinaryReader reader, INameDecoder nameTable)
 		{
 			PersistentIndexer ind = new PersistentIndexer();

Modified: trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentMethod.cs
===================================================================
--- trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentMethod.cs	2004-05-25 20:16:04 UTC (rev 1633)
+++ trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentMethod.cs	2004-05-25 23:29:23 UTC (rev 1634)
@@ -15,6 +15,21 @@
 	[Serializable]
 	public sealed class PersistentMethod : AbstractMethod
 	{
+		public static PersistentMethod Resolve (IMethod source, ITypeResolver typeResolver)
+		{
+			PersistentMethod met = new PersistentMethod ();
+			met.FullyQualifiedName = source.FullyQualifiedName;
+			met.Documentation = source.Documentation;
+			met.modifiers = source.Modifiers;
+			met.returnType = PersistentReturnType.Resolve (source.ReturnType, typeResolver);
+			
+			foreach (IParameter p in source.Parameters)
+				met.parameters.Add (PersistentParameter.Resolve (p, typeResolver));
+
+			met.region = source.Region;
+			return met;
+		}
+		
 		public static PersistentMethod Read (BinaryReader reader, INameDecoder nameTable)
 		{
 			PersistentMethod met = new PersistentMethod ();

Modified: trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentParameter.cs
===================================================================
--- trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentParameter.cs	2004-05-25 20:16:04 UTC (rev 1633)
+++ trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentParameter.cs	2004-05-25 23:29:23 UTC (rev 1634)
@@ -14,6 +14,16 @@
 	[Serializable]
 	public sealed class PersistentParameter : AbstractParameter
 	{
+		public static PersistentParameter Resolve (IParameter source, ITypeResolver typeResolver)
+		{
+			PersistentParameter par = new PersistentParameter ();
+			par.name = source.Name;
+			par.documentation = source.Documentation;
+			par.modifier = source.Modifier;
+			par.returnType = PersistentReturnType.Resolve (source.ReturnType, typeResolver);
+			return par;
+		}
+		
 		public static PersistentParameter Read (BinaryReader reader, INameDecoder nameTable)
 		{
 			PersistentParameter par = new PersistentParameter ();

Modified: trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentProperty.cs
===================================================================
--- trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentProperty.cs	2004-05-25 20:16:04 UTC (rev 1633)
+++ trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentProperty.cs	2004-05-25 23:29:23 UTC (rev 1634)
@@ -32,6 +32,19 @@
 			}
 		}
 		
+		public static PersistentProperty Resolve (IProperty source, ITypeResolver typeResolver)
+		{
+			PersistentProperty pro = new PersistentProperty ();
+			pro.FullyQualifiedName = source.FullyQualifiedName;
+			pro.Documentation = source.Documentation;
+			pro.modifiers = source.Modifiers;
+			pro.returnType = PersistentReturnType.Resolve (source.ReturnType, typeResolver);
+			pro.canGet = source.CanGet;
+			pro.canSet = source.CanSet;
+			pro.region = source.Region;
+			return pro;
+		}
+		
 		public static PersistentProperty Read (BinaryReader reader, INameDecoder nameTable)
 		{
 			PersistentProperty pro = new PersistentProperty ();

Modified: trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentReturnType.cs
===================================================================
--- trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentReturnType.cs	2004-05-25 20:16:04 UTC (rev 1633)
+++ trunk/MonoDevelop/src/Main/Base/Internal/Parser/PersistenceLayer/PersistentReturnType.cs	2004-05-25 23:29:23 UTC (rev 1634)
@@ -13,6 +13,17 @@
 	[Serializable]
 	public sealed class PersistentReturnType : AbstractReturnType
 	{
+		public static PersistentReturnType Resolve (IReturnType source, ITypeResolver typeResolver)
+		{
+			if (source == null) return null;
+			
+			PersistentReturnType rt = new PersistentReturnType ();
+			rt.FullyQualifiedName = typeResolver.Resolve (source.FullyQualifiedName);
+			rt.pointerNestingLevel = source.PointerNestingLevel;
+			rt.arrayDimensions = source.ArrayDimensions;
+			return rt;
+		}
+
 		public static PersistentReturnType Read (BinaryReader reader, INameDecoder nameTable)
 		{
 			if (PersistentHelper.ReadNull (reader)) return null;

Modified: trunk/MonoDevelop/src/Main/Base/Services/ParserService/CodeCompletionDatabase.cs
===================================================================
--- trunk/MonoDevelop/src/Main/Base/Services/ParserService/CodeCompletionDatabase.cs	2004-05-25 20:16:04 UTC (rev 1633)
+++ trunk/MonoDevelop/src/Main/Base/Services/ParserService/CodeCompletionDatabase.cs	2004-05-25 23:29:23 UTC (rev 1634)
@@ -611,7 +611,10 @@
 		{
 			IParseInformation parserInfo = parserService.DoParseFile ((string)fileName, null);
 			ICompilationUnit cu = (ICompilationUnit)parserInfo.BestCompilationUnit;
-			ClassUpdateInformation res = UpdateClassInformation (cu.Classes, fileName);
+
+			ClassCollection resolved = parserService.ResolveTypes (project, cu, cu.Classes);
+			ClassUpdateInformation res = UpdateClassInformation (resolved, fileName);
+			
 			parserService.NotifyParseInfoChange (fileName, res);
 		}
 	}

Modified: trunk/MonoDevelop/src/Main/Base/Services/ParserService/DefaultParserService.cs
===================================================================
--- trunk/MonoDevelop/src/Main/Base/Services/ParserService/DefaultParserService.cs	2004-05-25 20:16:04 UTC (rev 1633)
+++ trunk/MonoDevelop/src/Main/Base/Services/ParserService/DefaultParserService.cs	2004-05-25 23:29:23 UTC (rev 1634)
@@ -50,6 +50,30 @@
 			public WaitCallback ParseCallback;
 		}
 
+		class CompilationUnitTypeResolver: ITypeResolver
+		{
+			public IClass CallingClass;
+			IProject project;
+			ICompilationUnit unit;
+			DefaultParserService parserService;
+			
+			public CompilationUnitTypeResolver (IProject project, ICompilationUnit unit, DefaultParserService parserService)
+			{
+				this.project = project;
+				this.unit = unit;
+				this.parserService = parserService;
+			}
+			
+			public string Resolve (string typeName)
+			{
+				IClass c = parserService.SearchType (project, typeName, CallingClass, unit);
+				if (c != null)
+					return c.FullyQualifiedName;
+				else
+					return typeName;
+			}
+		}
+		
 		Hashtable lastUpdateSize = new Hashtable();
 		Hashtable parsings = new Hashtable ();
 		
@@ -526,7 +550,8 @@
 						ProjectCodeCompletionDatabase db = GetProjectDatabase (viewContent.Project);
 						if (db != null) {
 							ICompilationUnit cu = (ICompilationUnit)parseInformation.BestCompilationUnit;
-							ClassUpdateInformation res = db.UpdateClassInformation (cu.Classes, fileName);
+							ClassCollection resolved = ResolveTypes (viewContent.Project, cu, cu.Classes);
+							ClassUpdateInformation res = db.UpdateClassInformation (resolved, fileName);
 							NotifyParseInfoChange (fileName, res);
 						}
 						lastUpdateSize[fileName] = text.GetHashCode();
@@ -693,6 +718,45 @@
 			return null;
 		}
 
+		/// <remarks>
+		/// use the usings and the name of the namespace to find a class
+		/// </remarks>
+		public IClass SearchType (IProject project, string name, IClass callingClass, ICompilationUnit unit)
+		{
+			if (name == null || name == String.Empty)
+				return null;
+				
+			IClass c;
+			c = GetClass(project, name);
+			if (c != null)
+				return c;
+
+			if (unit != null) {
+				foreach (IUsing u in unit.Usings) {
+					if (u != null) {
+						c = SearchType(project, u, name);
+						if (c != null) {
+							return c;
+						}
+					}
+				}
+			}
+			if (callingClass == null) {
+				return null;
+			}
+			string fullname = callingClass.FullyQualifiedName;
+			string[] namespaces = fullname.Split(new char[] {'.'});
+			string curnamespace = namespaces[0] + '.';
+			for (int i = 1; i < namespaces.Length; ++i) {
+				c = GetClass(project, curnamespace + name);
+				if (c != null) {
+					return c;
+				}
+				curnamespace += namespaces[i] + '.';
+			}
+			return null;
+		}
+		
 		public IClass SearchType(IProject project, IUsing iusing, string partitialTypeName)
 		{
 			return SearchType(project, iusing, partitialTypeName, true);
@@ -755,6 +819,19 @@
 			return null;
 		}
 		
+		public ClassCollection ResolveTypes (IProject project, ICompilationUnit unit, ClassCollection types)
+		{
+			CompilationUnitTypeResolver tr = new CompilationUnitTypeResolver (project, unit, this);
+			
+			ClassCollection col = new ClassCollection ();
+			foreach (IClass c in types) {
+				tr.CallingClass = c;
+				col.Add (PersistentClass.Resolve (c, tr));
+			}
+				
+			return col;
+		}
+		
 		public IEnumerable GetClassInheritanceTree (IProject project, IClass cls)
 		{
 			return new ClassInheritanceEnumerator (this, project, cls);
@@ -1114,4 +1191,9 @@
 			get { return modified; }
 		}
 	}
+	
+	public interface ITypeResolver
+	{
+		string Resolve (string typeName);
+	}
 }




More information about the Monodevelop-patches-list mailing list