Author: lluis
Date: 2007-10-15 19:29:02 -0400 (Mon, 15 Oct 2007)
New Revision: 87548
Added:
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/ITypeNameResolver.cs
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/TypeNameResolver.cs
Removed:
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Ambience/ITypeNameResolver.cs
Modified:
trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog
trunk/monodevelop/Core/src/MonoDevelop.Projects/Makefile.am
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/BaseRefactorer.cs
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/CodeRefactorer.cs
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/RefactorerContext.cs
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.mdp
Log:
* MonoDevelop.Projects.Ambience/ITypeNameResolver.cs,
MonoDevelop.Projects.mdp, Makefile.am,
MonoDevelop.Projects.Parser/ITypeNameResolver.cs: Moved
ITypeNameResolver class and interface to .Parser namespace.
* MonoDevelop.Projects.CodeGeneration/RefactorerContext.cs: Added
property for getting a type resolver for the context.
* MonoDevelop.Projects.CodeGeneration/CodeRefactorer.cs,
MonoDevelop.Projects.CodeGeneration/BaseRefactorer.cs: In generated
code, don't use full names when not necessary. Use the type name
resolver provided by the RefactorerContext for this.
* MonoDevelop.Projects.Parser/TypeNameResolver.cs: New class. An
implementation of ITypeNameResolver.
Modified: trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog
===================================================================
--- trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog 2007-10-15
22:52:58 UTC (rev 87547)
+++ trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog 2007-10-15
23:29:02 UTC (rev 87548)
@@ -1,3 +1,18 @@
+2007-10-16 Lluis Sanchez Gual <[EMAIL PROTECTED]>
+
+ * MonoDevelop.Projects.Ambience/ITypeNameResolver.cs,
+ MonoDevelop.Projects.mdp, Makefile.am,
+ MonoDevelop.Projects.Parser/ITypeNameResolver.cs: Moved
+ ITypeNameResolver class and interface to .Parser namespace.
+ * MonoDevelop.Projects.CodeGeneration/RefactorerContext.cs: Added
property
+ for getting a type resolver for the context.
+ * MonoDevelop.Projects.CodeGeneration/CodeRefactorer.cs,
+ MonoDevelop.Projects.CodeGeneration/BaseRefactorer.cs: In generated
+ code, don't use full names when not necessary. Use the type name
+ resolver provided by the RefactorerContext for this.
+ * MonoDevelop.Projects.Parser/TypeNameResolver.cs: New class. An
+ implementation of ITypeNameResolver.
+
2007-10-15 Lluis Sanchez Gual <[EMAIL PROTECTED]>
* MonoDevelop.Projects.Parser/ClassWrapper.cs: Make sure the wrapped
class
Modified: trunk/monodevelop/Core/src/MonoDevelop.Projects/Makefile.am
===================================================================
--- trunk/monodevelop/Core/src/MonoDevelop.Projects/Makefile.am 2007-10-15
22:52:58 UTC (rev 87547)
+++ trunk/monodevelop/Core/src/MonoDevelop.Projects/Makefile.am 2007-10-15
23:29:02 UTC (rev 87548)
@@ -18,7 +18,6 @@
MonoDevelop.Projects.Ambience/AmbienceService.cs \
MonoDevelop.Projects.Ambience/CodeDOMGeneratorUtility.cs \
MonoDevelop.Projects.Ambience/ConversionFlags.cs \
- MonoDevelop.Projects.Ambience/ITypeNameResolver.cs \
MonoDevelop.Projects.Ambience/NetAmbience.cs \
MonoDevelop.Projects.CodeGeneration/BaseRefactorer.cs \
MonoDevelop.Projects.CodeGeneration/CodeRefactorer.cs \
@@ -97,6 +96,7 @@
MonoDevelop.Projects.Parser/IProperty.cs \
MonoDevelop.Projects.Parser/IRegion.cs \
MonoDevelop.Projects.Parser/IReturnType.cs \
+ MonoDevelop.Projects.Parser/ITypeNameResolver.cs \
MonoDevelop.Projects.Parser/IUsing.cs \
MonoDevelop.Projects.Parser/IUsingCollection.cs \
MonoDevelop.Projects.Parser/LanguageItemCollection.cs \
@@ -137,6 +137,7 @@
MonoDevelop.Projects.Parser/Tag.cs \
MonoDevelop.Projects.Parser/TagCollection.cs \
MonoDevelop.Projects.Parser/TypedCSharpCollection.cs \
+ MonoDevelop.Projects.Parser/TypeNameResolver.cs \
MonoDevelop.Projects.Serialization/ArrayHandler.cs \
MonoDevelop.Projects.Serialization/ArrayListHandler.cs \
MonoDevelop.Projects.Serialization/ClassDataType.cs \
Deleted:
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Ambience/ITypeNameResolver.cs
===================================================================
---
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Ambience/ITypeNameResolver.cs
2007-10-15 22:52:58 UTC (rev 87547)
+++
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Ambience/ITypeNameResolver.cs
2007-10-15 23:29:02 UTC (rev 87548)
@@ -1,36 +0,0 @@
-// ITypeNameResolver.cs
-//
-// Author:
-// Lluis Sanchez Gual
-//
-// Copyright (c) 2007 Novell, Inc (http://www.novell.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-//
-//
-
-using System;
-
-namespace MonoDevelop.Projects.Ambience
-{
- public interface ITypeNameResolver
- {
- string ResolveName (string typeName);
- }
-}
Modified:
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/BaseRefactorer.cs
===================================================================
---
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/BaseRefactorer.cs
2007-10-15 22:52:58 UTC (rev 87547)
+++
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/BaseRefactorer.cs
2007-10-15 23:29:02 UTC (rev 87548)
@@ -109,7 +109,7 @@
}
return null;
}*/
- protected CodeTypeReference ReturnTypeToDom (IReturnType
declaredType)
+ protected CodeTypeReference ReturnTypeToDom (RefactorerContext
ctx, IReturnType declaredType)
{
CodeTypeReference [] argTypes = null;
IReturnType rtype = declaredType;
@@ -119,10 +119,10 @@
if (genericArgs != null && genericArgs.Count > 0) {
argTypes = new CodeTypeReference
[genericArgs.Count];
for (int i = 0; i < genericArgs.Count; i++) {
- argTypes[i] = ReturnTypeToDom
(genericArgs[i]);
+ argTypes[i] = ReturnTypeToDom (ctx,
genericArgs[i]);
}
}
- string name = rtype.FullyQualifiedName;
+ string name = ctx.TypeNameResolver.ResolveName
(rtype.FullyQualifiedName);
CodeTypeReference typeRef = argTypes != null ? new
CodeTypeReference (name, argTypes) : new CodeTypeReference (name);
if (rtype.ArrayCount == 0)
@@ -133,6 +133,12 @@
return typeRef;
}
+ protected CodeTypeReference TypeToDom (RefactorerContext ctx,
Type type)
+ {
+ string name = ctx.TypeNameResolver.ResolveName
(type.FullName);
+ return new CodeTypeReference (name);
+ }
+
public virtual IMember ImplementMember (RefactorerContext ctx,
IClass cls, string prefix, bool explicitly, IMember member)
{
CodeTypeMember m;
@@ -141,20 +147,20 @@
CodeMemberEvent mEvent = new CodeMemberEvent ();
m = (CodeTypeMember) mEvent;
- mEvent.Type = ReturnTypeToDom
(member.ReturnType);
+ mEvent.Type = ReturnTypeToDom (ctx,
member.ReturnType);
} else if (member is IMethod) {
CodeMemberMethod mMethod = new CodeMemberMethod
();
IMethod method = (IMethod) member;
m = (CodeMemberMethod) mMethod;
- mMethod.ReturnType = ReturnTypeToDom
(member.ReturnType);
- CodeExpression nieReference = new
CodeObjectCreateExpression (typeof (NotImplementedException));
+ mMethod.ReturnType = ReturnTypeToDom (ctx,
member.ReturnType);
+ CodeExpression nieReference = new
CodeObjectCreateExpression (TypeToDom (ctx, typeof (NotImplementedException)));
CodeStatement throwExpression = new
CodeThrowExceptionStatement (nieReference);
mMethod.Statements.Add (throwExpression);
foreach (IParameter param in method.Parameters)
{
CodeParameterDeclarationExpression par;
- par = new
CodeParameterDeclarationExpression (ReturnTypeToDom (param.ReturnType),
param.Name);
+ par = new
CodeParameterDeclarationExpression (ReturnTypeToDom (ctx, param.ReturnType),
param.Name);
mMethod.Parameters.Add (par);
}
} else if (member is IProperty) {
@@ -165,7 +171,7 @@
mProperty.HasGet = property.CanGet;
mProperty.HasSet = property.CanSet;
- mProperty.Type = ReturnTypeToDom
(member.ReturnType);
+ mProperty.Type = ReturnTypeToDom (ctx,
member.ReturnType);
} else {
return null;
}
@@ -357,7 +363,7 @@
CodeMemberProperty prop = new CodeMemberProperty ();
prop.Name = propName;
- prop.Type = ReturnTypeToDom (field.ReturnType);
+ prop.Type = ReturnTypeToDom (ctx, field.ReturnType);
prop.Attributes = MemberAttributes.Public |
MemberAttributes.Final;
if (field.IsStatic)
prop.Attributes |= MemberAttributes.Static;
Modified:
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/CodeRefactorer.cs
===================================================================
---
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/CodeRefactorer.cs
2007-10-15 22:52:58 UTC (rev 87547)
+++
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/CodeRefactorer.cs
2007-10-15 23:29:02 UTC (rev 87548)
@@ -63,7 +63,7 @@
public IClass CreateClass (Project project, string language,
string directory, string namspace, CodeTypeDeclaration type)
{
IParserContext ctx = pdb.GetProjectParserContext
(project);
- RefactorerContext gctx = new RefactorerContext (ctx,
fileProvider);
+ RefactorerContext gctx = new RefactorerContext (ctx,
fileProvider, null);
IRefactorer gen =
Services.Languages.GetRefactorerForLanguage (language);
IClass c = gen.CreateClass (gctx, directory, namspace,
type);
gctx.Save ();
@@ -535,17 +535,17 @@
RefactorerContext GetGeneratorContext (Project p)
{
IParserContext ctx = pdb.GetProjectParserContext (p);
- return new RefactorerContext (ctx, fileProvider);
+ return new RefactorerContext (ctx, fileProvider, null);
}
RefactorerContext GetGeneratorContext (IClass cls)
{
- return new RefactorerContext (GetParserContext (cls),
fileProvider);
+ return new RefactorerContext (GetParserContext (cls),
fileProvider, cls);
}
RefactorerContext GetGeneratorContext (LocalVariable var)
{
- return new RefactorerContext (GetParserContext (var),
fileProvider);
+ return new RefactorerContext (GetParserContext (var),
fileProvider, null);
}
IParserContext GetParserContext (IClass cls)
Modified:
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/RefactorerContext.cs
===================================================================
---
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/RefactorerContext.cs
2007-10-15 22:52:58 UTC (rev 87547)
+++
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.CodeGeneration/RefactorerContext.cs
2007-10-15 23:29:02 UTC (rev 87548)
@@ -29,6 +29,7 @@
using System.Collections;
using MonoDevelop.Projects.Parser;
using MonoDevelop.Projects.Text;
+using MonoDevelop.Projects.Ambience;
namespace MonoDevelop.Projects.CodeGeneration
{
@@ -37,11 +38,15 @@
ITextFileProvider files;
ArrayList textFiles = new ArrayList ();
IParserContext ctx;
+ static TypeNameResolver defaultResolver = new TypeNameResolver
();
+ ITypeNameResolver typeResolver;
- internal RefactorerContext (IParserContext ctx,
ITextFileProvider files)
+ internal RefactorerContext (IParserContext ctx,
ITextFileProvider files, IClass cls)
{
this.files = files;
this.ctx = ctx;
+ if (cls != null)
+ typeResolver = GetTypeNameResolver (cls);
}
public IParserContext ParserContext {
@@ -63,6 +68,27 @@
return file;
}
+ public ITypeNameResolver TypeNameResolver {
+ get {
+ return typeResolver ?? defaultResolver;
+ }
+ }
+
+ ITypeNameResolver GetTypeNameResolver (IClass cls)
+ {
+ if (cls.Region == null || cls.Region.FileName == null)
+ return null;
+ string file = cls.Region.FileName;
+ IParseInformation pi = ctx.GetParseInformation (file);
+ if (pi == null)
+ return null;
+ ICompilationUnit unit = pi.MostRecentCompilationUnit as
ICompilationUnit;
+ if (unit != null)
+ return new TypeNameResolver (unit, cls);
+ else
+ return null;
+ }
+
internal void Save ()
{
foreach (TextFile file in textFiles) {
Added:
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/ITypeNameResolver.cs
===================================================================
---
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/ITypeNameResolver.cs
2007-10-15 22:52:58 UTC (rev 87547)
+++
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/ITypeNameResolver.cs
2007-10-15 23:29:02 UTC (rev 87548)
@@ -0,0 +1,36 @@
+// ITypeNameResolver.cs
+//
+// Author:
+// Lluis Sanchez Gual
+//
+// Copyright (c) 2007 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+//
+
+using System;
+
+namespace MonoDevelop.Projects.Parser
+{
+ public interface ITypeNameResolver
+ {
+ string ResolveName (string typeName);
+ }
+}
Added:
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/TypeNameResolver.cs
===================================================================
---
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/TypeNameResolver.cs
2007-10-15 22:52:58 UTC (rev 87547)
+++
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/TypeNameResolver.cs
2007-10-15 23:29:02 UTC (rev 87548)
@@ -0,0 +1,108 @@
+// TypeNameResolver.cs
+//
+// Author:
+// Lluis Sanchez Gual
+//
+// Copyright (c) 2007 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+//
+
+using System;
+using System.Collections.Generic;
+
+namespace MonoDevelop.Projects.Parser
+{
+ public class TypeNameResolver: ITypeNameResolver
+ {
+ protected Dictionary<string,string> names = new
Dictionary<string,string> ();
+
+ public TypeNameResolver ()
+ {
+ }
+
+ public TypeNameResolver (ICompilationUnit unit, IClass cls)
+ {
+ AddNames (unit, cls.Region.BeginLine,
cls.Region.BeginColumn);
+ }
+
+ public TypeNameResolver (ICompilationUnit unit, int caretLine,
int caretColumn)
+ {
+ AddNames (unit, caretLine, caretColumn);
+ }
+
+ void AddNames (ICompilationUnit unit, int caretLine, int
caretColumn)
+ {
+ foreach (IClass cls in unit.Classes) {
+ if ((cls.Region != null && cls.Region.IsInside
(caretLine, caretColumn)) || (cls.BodyRegion != null && cls.BodyRegion.IsInside
(caretLine, caretColumn))) {
+ // Enclosing namespace:
+ AddName (cls.Namespace, "");
+ // For inner classes:
+ AddName (cls.FullyQualifiedName, "");
+ }
+ }
+
+ foreach (IUsing u in unit.Usings) {
+ if (u != null && (u.Region == null ||
u.Region.IsInside(caretLine, caretColumn))) {
+ foreach (string us in u.Usings)
+ AddName (us, "");
+ }
+ }
+
+ // Namespace aliases
+ foreach (IUsing u in unit.Usings) {
+ if (u != null && (u.Region == null ||
u.Region.IsInside(caretLine, caretColumn))) {
+ foreach (string e in u.Aliases)
+ AddName (u.GetAlias
(e).FullyQualifiedName, e);
+ }
+ }
+ }
+
+ public void AddName (string name, string resolved)
+ {
+ names [name] = resolved;
+ }
+
+ public virtual string ResolveName (string typeName)
+ {
+ // Resolve complete class names (aliases replace
complete class names)
+ string res;
+ if (names.TryGetValue (typeName, out res))
+ return res;
+
+ // Try replacing the namespace
+
+ int i = typeName.LastIndexOf ('.');
+ if (i == -1)
+ return typeName;
+
+ string ns = typeName.Substring (0, i);
+
+ if (names.TryGetValue (ns, out res)) {
+ if (res.Length > 0)
+ return res + "." + typeName.Substring
(i+1);
+ else
+ return typeName.Substring (i+1);
+ }
+ else
+ return typeName;
+ }
+ }
+}
Modified:
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.mdp
===================================================================
--- trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.mdp
2007-10-15 22:52:58 UTC (rev 87547)
+++ trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.mdp
2007-10-15 23:29:02 UTC (rev 87548)
@@ -237,7 +237,8 @@
<File name="./MonoDevelop.Projects.Parser.Cecil/SymbolWriterImpl.cs"
subtype="Code" buildaction="Compile" />
<File name="./MonoDevelop.Projects.addin.xml" subtype="Code"
buildaction="EmbedAsResource" />
<File name="./MonoDevelop.Projects.Text/TextFileService.cs" subtype="Code"
buildaction="Compile" />
- <File name="./MonoDevelop.Projects.Ambience/ITypeNameResolver.cs"
subtype="Code" buildaction="Compile" />
+ <File name="./MonoDevelop.Projects.Parser/TypeNameResolver.cs"
subtype="Code" buildaction="Compile" />
+ <File name="./MonoDevelop.Projects.Parser/ITypeNameResolver.cs"
subtype="Code" buildaction="Compile" />
</Contents>
<References>
<ProjectReference type="Gac" localcopy="False" refto="monodoc,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches