Browse Source

Reduce usage of ProjectContentRegistry.Mscorlib - we'll support multiple mscorlib project contents later (compact framework, older .NET versions etc.)

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1421 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
e6865a4baa
  1. 18
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs
  2. 2
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs
  3. 19
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs
  4. 18
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ElementReturnType.cs
  5. 6
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs
  6. 25
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs
  7. 5
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs
  8. 10
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs
  9. 6
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/CodeDomVisitor.cs
  10. 17
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs
  11. 6
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs
  12. 2
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/ExpressionFinder.cs
  13. 17
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetAmbience.cs
  14. 1
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  15. 62
      src/Main/Base/Project/Src/Dom/IReturnType.cs
  16. 30
      src/Main/Base/Project/Src/Dom/Implementations/AbstractReturnType.cs
  17. 17
      src/Main/Base/Project/Src/Dom/Implementations/AnonymousMethodReturnType.cs
  18. 79
      src/Main/Base/Project/Src/Dom/Implementations/ArrayReturnType.cs
  19. 55
      src/Main/Base/Project/Src/Dom/Implementations/ConstructedReturnType.cs
  20. 16
      src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs
  21. 2
      src/Main/Base/Project/Src/Dom/Implementations/DefaultCompilationUnit.cs
  22. 2
      src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs
  23. 12
      src/Main/Base/Project/Src/Dom/Implementations/DefaultTypeParameter.cs
  24. 31
      src/Main/Base/Project/Src/Dom/Implementations/GenericReturnType.cs
  25. 96
      src/Main/Base/Project/Src/Dom/Implementations/ProxyReturnType.cs
  26. 128
      src/Main/Base/Project/Src/Dom/Implementations/SystemTypes.cs
  27. 108
      src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs
  28. 2
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs
  29. 10
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs
  30. 28
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs
  31. 33
      src/Main/Base/Project/Src/Dom/ReflectionLayer/DomPersistence.cs
  32. 15
      src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs
  33. 2
      src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionEvent.cs
  34. 2
      src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionField.cs
  35. 2
      src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionLoader.cs
  36. 6
      src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionMethod.cs
  37. 2
      src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionParameter.cs
  38. 2
      src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionProperty.cs
  39. 135
      src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionReturnType.cs
  40. 6
      src/Main/Base/Project/Src/Dom/ResolveResult.cs
  41. 6
      src/Main/Base/Project/Src/Gui/Pads/FileScout.cs
  42. 1
      src/Main/Base/Project/Src/Services/AmbienceService/AmbienceReflectionDecorator.cs
  43. 32
      src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs
  44. 8
      src/Main/Base/Project/Src/Services/ParserService/IProjectContent.cs
  45. 13
      src/Main/Base/Project/Src/Services/ParserService/ProjectContentRegistry.cs
  46. 14
      src/Main/Base/Project/Src/Services/ParserService/ReflectionProjectContent.cs
  47. 13
      src/Main/Base/Project/Src/Services/RefactoringService/CodeGenerator.cs

18
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/BooAmbience.cs

@ -492,20 +492,22 @@ namespace Grunwald.BooBinding @@ -492,20 +492,22 @@ namespace Grunwald.BooBinding
void UnpackNestedType(StringBuilder builder, IReturnType returnType)
{
if (returnType.ArrayDimensions > 0) {
if (returnType.IsArrayReturnType) {
ArrayReturnType art = returnType.CastToArrayReturnType();
builder.Append('(');
UnpackNestedType(builder, returnType.ArrayElementType);
if (returnType.ArrayDimensions > 1) {
UnpackNestedType(builder, art.ArrayElementType);
if (art.ArrayDimensions > 1) {
builder.Append(',');
builder.Append(returnType.ArrayDimensions);
builder.Append(art.ArrayDimensions);
}
builder.Append(')');
} else if (returnType.TypeArguments != null) {
UnpackNestedType(builder, returnType.UnboundType);
} else if (returnType.IsConstructedReturnType) {
ConstructedReturnType crt = returnType.CastToConstructedReturnType();
UnpackNestedType(builder, crt.UnboundType);
builder.Append("[of ");
for (int i = 0; i < returnType.TypeArguments.Count; ++i) {
for (int i = 0; i < crt.TypeArguments.Count; ++i) {
if (i > 0) builder.Append(", ");
builder.Append(Convert(returnType.TypeArguments[i]));
builder.Append(Convert(crt.TypeArguments[i]));
}
builder.Append(']');
} else {

2
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs

@ -207,7 +207,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -207,7 +207,7 @@ namespace Grunwald.BooBinding.CodeCompletion
if (expr == null)
return null;
if (expr is AST.IntegerLiteralExpression)
return new IntegerLiteralResolveResult(callingClass, callingMember);
return new IntegerLiteralResolveResult(callingClass, callingMember, pc.SystemTypes.Int32);
if (expressionResult.Context == ExpressionFinder.BooAttributeContext.Instance) {
AST.MethodInvocationExpression mie = expr as AST.MethodInvocationExpression;

19
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs

@ -221,7 +221,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -221,7 +221,7 @@ namespace Grunwald.BooBinding.CodeCompletion
if (project != null && project.Ducky)
return new BooResolver.DuckClass(new DefaultCompilationUnit(projectContent)).DefaultReturnType;
else
return ReflectionReturnType.Object;
return projectContent.SystemTypes.Object;
}
public static IReturnType CreateReturnType(AST.TypeReference reference, IClass callingClass,
@ -234,7 +234,8 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -234,7 +234,8 @@ namespace Grunwald.BooBinding.CodeCompletion
}
if (reference is AST.ArrayTypeReference) {
AST.ArrayTypeReference arr = (AST.ArrayTypeReference)reference;
return new ArrayReturnType(CreateReturnType(arr.ElementType, callingClass, callingMember,
return new ArrayReturnType(projectContent,
CreateReturnType(arr.ElementType, callingClass, callingMember,
caretLine, caretColumn, projectContent),
(arr.Rank != null) ? (int)arr.Rank.Value : 1);
} else if (reference is AST.SimpleTypeReference) {
@ -275,10 +276,6 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -275,10 +276,6 @@ namespace Grunwald.BooBinding.CodeCompletion
{
return CreateReturnType(reference, null);
}
IReturnType CreateReturnType(Type type)
{
return ReflectionReturnType.CreatePrimitive(type);
}
IReturnType CreateReturnType(AST.Field field)
{
if (field.Type == null) {
@ -309,7 +306,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -309,7 +306,7 @@ namespace Grunwald.BooBinding.CodeCompletion
DomRegion region = GetRegion(node);
DefaultClass c = new DefaultClass(_cu, ClassType.Delegate, GetModifier(node), region, OuterClass);
ConvertAttributes(node, c);
c.BaseTypes.Add(ReflectionReturnType.CreatePrimitive(typeof(Delegate)));
c.BaseTypes.Add(c.ProjectContent.SystemTypes.Delegate);
c.FullyQualifiedName = node.FullName;
if (_currentClass.Count > 0) {
OuterClass.InnerClasses.Add(c);
@ -322,16 +319,16 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -322,16 +319,16 @@ namespace Grunwald.BooBinding.CodeCompletion
DefaultMethod invokeMethod = new DefaultMethod("Invoke", returnType, ModifierEnum.Public, DomRegion.Empty, DomRegion.Empty, c);
ConvertParameters(node.Parameters, invokeMethod);
c.Methods.Add(invokeMethod);
invokeMethod = new DefaultMethod("BeginInvoke", CreateReturnType(typeof(IAsyncResult)), ModifierEnum.Public, DomRegion.Empty, DomRegion.Empty, c);
invokeMethod = new DefaultMethod("BeginInvoke", c.ProjectContent.SystemTypes.IAsyncResult, ModifierEnum.Public, DomRegion.Empty, DomRegion.Empty, c);
ConvertParameters(node.Parameters, invokeMethod);
if (invokeMethod.Parameters == DefaultParameter.EmptyParameterList) {
invokeMethod.Parameters = new List<IParameter>();
}
invokeMethod.Parameters.Add(new DefaultParameter("callback", CreateReturnType(typeof(AsyncCallback)), DomRegion.Empty));
invokeMethod.Parameters.Add(new DefaultParameter("object", ReflectionReturnType.Object, DomRegion.Empty));
invokeMethod.Parameters.Add(new DefaultParameter("callback", c.ProjectContent.SystemTypes.AsyncCallback, DomRegion.Empty));
invokeMethod.Parameters.Add(new DefaultParameter("object", c.ProjectContent.SystemTypes.Object, DomRegion.Empty));
c.Methods.Add(invokeMethod);
invokeMethod = new DefaultMethod("EndInvoke", returnType, ModifierEnum.Public, DomRegion.Empty, DomRegion.Empty, c);
invokeMethod.Parameters.Add(new DefaultParameter("result", CreateReturnType(typeof(IAsyncResult)), DomRegion.Empty));
invokeMethod.Parameters.Add(new DefaultParameter("result", c.ProjectContent.SystemTypes.IAsyncResult, DomRegion.Empty));
c.Methods.Add(invokeMethod);
_currentClass.Pop();
}

18
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ElementReturnType.cs

@ -18,37 +18,41 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -18,37 +18,41 @@ namespace Grunwald.BooBinding.CodeCompletion
public class ElementReturnType : ProxyReturnType
{
IReturnType listType;
IProjectContent pc;
public ElementReturnType(IReturnType listType)
public ElementReturnType(IProjectContent pc, IReturnType listType)
{
if (pc == null)
throw new ArgumentNullException("pc");
// listType is probably an InferredReturnType
this.listType = listType;
this.pc = pc;
}
public override IReturnType BaseType {
get {
// get element type from listType
if (listType.ArrayDimensions > 0)
return listType.ArrayElementType;
if (listType.IsArrayReturnType)
return listType.CastToArrayReturnType().ArrayElementType;
IClass c = listType.GetUnderlyingClass();
if (c == null)
return null;
IClass genumerable = ProjectContentRegistry.Mscorlib.GetClass("System.Collections.Generic.IEnumerable", 1);
IClass genumerable = pc.GetClass("System.Collections.Generic.IEnumerable", 1);
if (c.IsTypeInInheritanceTree(genumerable)) {
return MemberLookupHelper.GetTypeParameterPassedToBaseClass(listType, genumerable, 0);
}
IClass enumerable = ProjectContentRegistry.Mscorlib.GetClass("System.Collections.IEnumerable", 0);
IClass enumerable = pc.GetClass("System.Collections.IEnumerable", 0);
if (c.IsTypeInInheritanceTree(enumerable)) {
// We can't use the EnumeratorItemType attribute because SharpDevelop
// does not store attribute argument values in the cache.
// HACK: Hacked in support for range(), take out when RangeEnumerator implements IEnumerable<int>
if (c.FullyQualifiedName == "Boo.Lang.Builtins.RangeEnumerator") {
return ReflectionReturnType.Int;
return pc.SystemTypes.Int32;
}
return ReflectionReturnType.Object;
return pc.SystemTypes.Object;
}
return null;
}

6
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs

@ -51,10 +51,10 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -51,10 +51,10 @@ namespace Grunwald.BooBinding.CodeCompletion
if (useLastStatementIfNoReturnStatement && v.lastExpressionStatement != null) {
cachedType = new BooResolver().GetTypeOfExpression(v.lastExpressionStatement.Expression, context);
} else {
cachedType = ReflectionReturnType.Void;
cachedType = VoidReturnType.Instance;
}
} else if (v.result is NullReturnType) {
cachedType = ReflectionReturnType.Object;
cachedType = ConvertVisitor.GetDefaultReturnType(ParserService.CurrentProjectContent);
} else {
cachedType = v.result;
}
@ -83,7 +83,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -83,7 +83,7 @@ namespace Grunwald.BooBinding.CodeCompletion
{
noReturnStatement = false;
if (node.Expression == null) {
result = ReflectionReturnType.Void;
result = VoidReturnType.Instance;
} else {
result = new BooResolver().GetTypeOfExpression(node.Expression, context);
}

25
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs

@ -55,8 +55,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -55,8 +55,7 @@ namespace Grunwald.BooBinding.CodeCompletion
void MakeLiteralResult(string fullTypeName)
{
resolveResult = new ResolveResult(callingClass, resolver.CallingMember,
new GetClassReturnType(projectContent, fullTypeName, 0));
MakeResult(new GetClassReturnType(projectContent, fullTypeName, 0));
}
void MakeResult(IMember member)
@ -427,7 +426,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -427,7 +426,7 @@ namespace Grunwald.BooBinding.CodeCompletion
resolveResult.ResolvedType = invoke.ReturnType;
}
} else if (c.FullyQualifiedName == "System.Type") {
resolveResult.ResolvedType = ReflectionReturnType.Object;
resolveResult.ResolvedType = projectContent.SystemTypes.Object;
} else {
ClearResult();
}
@ -446,7 +445,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -446,7 +445,7 @@ namespace Grunwald.BooBinding.CodeCompletion
arguments[0].Accept(this);
TypeResolveResult trr = resolveResult as TypeResolveResult;
if (trr != null) {
MakeResult(new ArrayReturnType(trr.ResolvedType, 1));
MakeResult(new ArrayReturnType(projectContent, trr.ResolvedType, 1));
}
} else {
ResolveMethodInType(new GetClassReturnType(projectContent, "Boo.Lang.Builtins", 0),
@ -562,7 +561,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -562,7 +561,7 @@ namespace Grunwald.BooBinding.CodeCompletion
case BinaryOperatorType.ReferenceEquality:
case BinaryOperatorType.ReferenceInequality:
case BinaryOperatorType.TypeTest:
MakeResult(ReflectionReturnType.Bool);
MakeResult(projectContent.SystemTypes.Boolean);
break;
default:
if (node.Left == null) {
@ -580,7 +579,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -580,7 +579,7 @@ namespace Grunwald.BooBinding.CodeCompletion
IReturnType left = (resolveResult != null) ? resolveResult.ResolvedType : null;
node.Right.Accept(this);
IReturnType right = (resolveResult != null) ? resolveResult.ResolvedType : null;
MakeResult(MemberLookupHelper.GetCommonType(left, right));
MakeResult(MemberLookupHelper.GetCommonType(projectContent, left, right));
break;
}
}
@ -632,11 +631,11 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -632,11 +631,11 @@ namespace Grunwald.BooBinding.CodeCompletion
if (elementType == null)
elementType = thisType;
else if (thisType != null)
elementType = MemberLookupHelper.GetCommonType(elementType, thisType);
elementType = MemberLookupHelper.GetCommonType(projectContent, elementType, thisType);
}
if (elementType == null)
elementType = ReflectionReturnType.Object;
MakeResult(new ArrayReturnType(elementType, 1));
elementType = ConvertVisitor.GetDefaultReturnType(projectContent);
MakeResult(new ArrayReturnType(projectContent, elementType, 1));
}
public override void OnTryCastExpression(TryCastExpression node)
@ -651,7 +650,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -651,7 +650,7 @@ namespace Grunwald.BooBinding.CodeCompletion
public override void OnBoolLiteralExpression(BoolLiteralExpression node)
{
MakeResult(ReflectionReturnType.Bool);
MakeResult(projectContent.SystemTypes.Boolean);
}
public override void OnDoubleLiteralExpression(DoubleLiteralExpression node)
@ -677,7 +676,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -677,7 +676,7 @@ namespace Grunwald.BooBinding.CodeCompletion
if (node.IsLong)
MakeLiteralResult("System.Int64");
else
MakeResult(ReflectionReturnType.Int);
MakeResult(projectContent.SystemTypes.Int32);
}
public override void OnNullLiteralExpression(NullLiteralExpression node)
@ -708,7 +707,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -708,7 +707,7 @@ namespace Grunwald.BooBinding.CodeCompletion
public override void OnStringLiteralExpression(StringLiteralExpression node)
{
MakeResult(ReflectionReturnType.String);
MakeResult(projectContent.SystemTypes.String);
}
public override void OnTimeSpanLiteralExpression(TimeSpanLiteralExpression node)
@ -718,7 +717,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -718,7 +717,7 @@ namespace Grunwald.BooBinding.CodeCompletion
public override void OnTypeofExpression(TypeofExpression node)
{
MakeLiteralResult("System.Type");
MakeResult(projectContent.SystemTypes.Type);
}
IReturnType ConvertType(TypeReference typeRef)

5
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs

@ -182,7 +182,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -182,7 +182,7 @@ namespace Grunwald.BooBinding.CodeCompletion
expr.Annotate("DomReturnType", returnType);
}
if (useElementType)
returnType = new ElementReturnType(returnType);
returnType = new ElementReturnType(resolver.ProjectContent, returnType);
result = new DefaultField.LocalVariableField(returnType, name,
new DomRegion(lexicalInfo.Line, lexicalInfo.Column),
resolver.CallingClass);
@ -218,7 +218,8 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -218,7 +218,8 @@ namespace Grunwald.BooBinding.CodeCompletion
if (results.ContainsKey(name))
return;
if (elementReturnType)
results.Add(name, new ElementReturnType(new InferredReturnType(expr, resolver.CallingClass)));
results.Add(name, new ElementReturnType(resolver.ProjectContent,
new InferredReturnType(expr, resolver.CallingClass)));
else
results.Add(name, new InferredReturnType(expr, resolver.CallingClass));
}

10
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs

@ -52,10 +52,14 @@ namespace Grunwald.BooBinding.Designer @@ -52,10 +52,14 @@ namespace Grunwald.BooBinding.Designer
if (m.Name == cmie.Method.MethodName
&& m.Parameters.Count == 1
&& m.Parameters[0].IsParams
&& m.Parameters[0].ReturnType.ArrayDimensions == 1
&& m.Parameters[0].ReturnType.ArrayElementType.FullyQualifiedName == cace.CreateType.BaseType)
&& m.Parameters[0].ReturnType.IsArrayReturnType)
{
cace.UserData["Explode"] = true;
ArrayReturnType paramArt = m.Parameters[0].ReturnType.CastToArrayReturnType();
if (paramArt.ArrayDimensions == 1
&& paramArt.FullyQualifiedName == cace.CreateType.BaseType)
{
cace.UserData["Explode"] = true;
}
}
}
}

6
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/CodeDomVisitor.cs

@ -38,6 +38,8 @@ namespace Grunwald.BooBinding.Designer @@ -38,6 +38,8 @@ namespace Grunwald.BooBinding.Designer
public CodeDomVisitor(IProjectContent pc)
{
if (pc == null)
throw new ArgumentNullException("pc");
this.pc = pc;
}
@ -509,7 +511,7 @@ namespace Grunwald.BooBinding.Designer @@ -509,7 +511,7 @@ namespace Grunwald.BooBinding.Designer
for (int i = 0; i < count; i++) {
CodeArrayCreateExpression cace = cmie.Parameters[i] as CodeArrayCreateExpression;
if (cace != null && (bool)cace.UserData["unknownType"]
&& m.Parameters[i].ReturnType.ArrayDimensions > 0)
&& m.Parameters[i].ReturnType.IsArrayReturnType)
{
cace.CreateType = new CodeTypeReference(m.Parameters[i].ReturnType.FullyQualifiedName);
}
@ -555,7 +557,7 @@ namespace Grunwald.BooBinding.Designer @@ -555,7 +557,7 @@ namespace Grunwald.BooBinding.Designer
BooResolver resolver = new BooResolver();
IReturnType createType = resolver.GetTypeOfExpression(node, null);
if (createType == null)
createType = ReflectionReturnType.Object;
createType = pc.SystemTypes.Object;
CodeExpression[] initializers = new CodeExpression[node.Items.Count];
for (int i = 0; i < initializers.Length; i++) {
_expression = null;

17
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using ICSharpCode.SharpDevelop.Dom;
@ -497,19 +498,21 @@ namespace ICSharpCode.Core @@ -497,19 +498,21 @@ namespace ICSharpCode.Core
void UnpackNestedType(StringBuilder builder, IReturnType returnType)
{
if (returnType.ArrayDimensions > 0) {
if (returnType.IsArrayReturnType) {
builder.Append('[');
for (int i = 1; i < returnType.ArrayDimensions; ++i) {
int dimensions = returnType.CastToArrayReturnType().ArrayDimensions;
for (int i = 1; i < dimensions; ++i) {
builder.Append(',');
}
builder.Append(']');
UnpackNestedType(builder, returnType.ArrayElementType);
} else if (returnType.TypeArguments != null) {
UnpackNestedType(builder, returnType.UnboundType);
UnpackNestedType(builder, returnType.CastToArrayReturnType().ArrayElementType);
} else if (returnType.IsConstructedReturnType) {
UnpackNestedType(builder, returnType.CastToConstructedReturnType().UnboundType);
builder.Append('<');
for (int i = 0; i < returnType.TypeArguments.Count; ++i) {
IList<IReturnType> ta = returnType.CastToConstructedReturnType().TypeArguments;
for (int i = 0; i < ta.Count; ++i) {
if (i > 0) builder.Append(", ");
builder.Append(Convert(returnType.TypeArguments[i]));
builder.Append(Convert(ta[i]));
}
builder.Append('>');
}

6
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs

@ -35,10 +35,10 @@ namespace CSharpBinding @@ -35,10 +35,10 @@ namespace CSharpBinding
context = ExpressionContext.Default;
break;
case "using":
context = ExpressionContext.TypeDerivingFrom(ReflectionReturnType.Disposable.GetUnderlyingClass(), false);
context = ExpressionContext.TypeDerivingFrom(ParserService.CurrentProjectContent.GetClass("System.IDisposable"), false);
break;
case "catch":
context = ExpressionContext.TypeDerivingFrom(ReflectionReturnType.Exception.GetUnderlyingClass(), false);
context = ExpressionContext.TypeDerivingFrom(ParserService.CurrentProjectContent.GetClass("System.Exception"), false);
break;
case "foreach":
case "typeof":
@ -108,7 +108,7 @@ namespace CSharpBinding @@ -108,7 +108,7 @@ namespace CSharpBinding
ResolveResult resolveResult = ParserService.Resolve(result, editor.ActiveTextAreaControl.Caret.Line + 1, editor.ActiveTextAreaControl.Caret.Column + 1, editor.FileName, documentText);
if (resolveResult != null && resolveResult.ResolvedType != null) {
IClass underlyingClass = resolveResult.ResolvedType.GetUnderlyingClass();
if (underlyingClass != null && underlyingClass.IsTypeInInheritanceTree(ProjectContentRegistry.Mscorlib.GetClass("System.MulticastDelegate"))) {
if (underlyingClass != null && underlyingClass.IsTypeInInheritanceTree(ParserService.CurrentProjectContent.GetClass("System.MulticastDelegate"))) {
EventHandlerCompletitionDataProvider eventHandlerProvider = new EventHandlerCompletitionDataProvider(result.Expression, resolveResult);
eventHandlerProvider.InsertSpace = true;
editor.ShowCompletionWindow(eventHandlerProvider, ch);

2
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/ExpressionFinder.cs

@ -97,7 +97,7 @@ namespace CSharpBinding.Parser @@ -97,7 +97,7 @@ namespace CSharpBinding.Parser
UnGet();
ReadNextToken();
if (curTokenType == Ident && lastIdentifier == "throw") {
return ExpressionContext.TypeDerivingFrom(ProjectContentRegistry.Mscorlib.GetClass("System.Exception"), true);
return ExpressionContext.TypeDerivingFrom(ParserService.CurrentProjectContent.GetClass("System.Exception"), true);
}
}
return ExpressionContext.ObjectCreation;

17
src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetAmbience.cs

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using ICSharpCode.SharpDevelop.Dom;
@ -491,19 +492,21 @@ namespace VBNetBinding @@ -491,19 +492,21 @@ namespace VBNetBinding
void UnpackNestedType(StringBuilder builder, IReturnType returnType)
{
if (returnType.ArrayDimensions > 0) {
if (returnType.IsArrayReturnType) {
builder.Append('(');
for (int i = 1; i < returnType.ArrayDimensions; ++i) {
int dimensions = returnType.CastToArrayReturnType().ArrayDimensions;
for (int i = 1; i < dimensions; ++i) {
builder.Append(',');
}
builder.Append(')');
UnpackNestedType(builder, returnType.ArrayElementType);
} else if (returnType.TypeArguments != null) {
UnpackNestedType(builder, returnType.UnboundType);
UnpackNestedType(builder, returnType.CastToArrayReturnType().ArrayElementType);
} else if (returnType.IsConstructedReturnType) {
UnpackNestedType(builder, returnType.CastToConstructedReturnType().UnboundType);
builder.Append("(Of ");
for (int i = 0; i < returnType.TypeArguments.Count; ++i) {
IList<IReturnType> ta = returnType.CastToConstructedReturnType().TypeArguments;
for (int i = 0; i < ta.Count; ++i) {
if (i > 0) builder.Append(", ");
builder.Append(Convert(returnType.TypeArguments[i]));
builder.Append(Convert(ta[i]));
}
builder.Append(')');
}

1
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -771,6 +771,7 @@ @@ -771,6 +771,7 @@
<Compile Include="Src\Services\RefactoringService\RefactorMenu.cs" />
<Compile Include="Src\TextEditor\Gui\Editor\AdvancedHighlightingStrategy.cs" />
<Compile Include="Src\TextEditor\Gui\Editor\AdvancedHighlighter.cs" />
<Compile Include="Src\Dom\Implementations\SystemTypes.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj">

62
src/Main/Base/Project/Src/Dom/IReturnType.cs

@ -62,22 +62,6 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -62,22 +62,6 @@ namespace ICSharpCode.SharpDevelop.Dom
get;
}
/// <summary>
/// Gets the array ranks of the return type.
/// When the return type is not an array, this property returns 0.
/// </summary>
int ArrayDimensions {
get;
}
/// <summary>
/// Gets the element type of the array.
/// When the return type is not an array, a NotSupportedException is thrown.
/// </summary>
IReturnType ArrayElementType {
get;
}
/// <summary>
/// Gets the count of type parameters the target class should have.
/// </summary>
@ -85,33 +69,6 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -85,33 +69,6 @@ namespace ICSharpCode.SharpDevelop.Dom
get;
}
/// <summary>
/// Gets if the return type is a default type, i.e. no array, generic etc.
/// </summary>
/// <returns>
/// True for SearchClassReturnType, GetClassReturnType and DefaultReturnType.<br/>
/// False for ArrayReturnType, SpecificReturnType etc.
/// </returns>
bool IsDefaultReturnType {
get;
}
/// <summary>
/// Gets the type arguments used if this is a ConstructedReturnType.
/// Otherwise, null is returned.
/// </summary>
IList<IReturnType> TypeArguments {
get;
}
/// <summary>
/// Gets the unbound type if this is a ConstructedReturnType.
/// Otherwise, a NotSupportedException is thrown.
/// </summary>
IReturnType UnboundType {
get;
}
/// <summary>
/// Gets the underlying class of this return type. This method will return <c>null</c> for
/// generic return types and types that cannot be resolved.
@ -137,5 +94,24 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -137,5 +94,24 @@ namespace ICSharpCode.SharpDevelop.Dom
/// Gets all events that can be called on this return type.
/// </summary>
List<IEvent> GetEvents();
/// <summary>
/// Gets if the return type is a default type, i.e. no array, generic etc.
/// </summary>
/// <returns>
/// True for SearchClassReturnType, GetClassReturnType and DefaultReturnType.<br/>
/// False for ArrayReturnType, SpecificReturnType etc.
/// </returns>
bool IsDefaultReturnType { get; }
bool IsArrayReturnType { get; }
ArrayReturnType CastToArrayReturnType();
bool IsGenericReturnType { get; }
GenericReturnType CastToGenericReturnType();
bool IsConstructedReturnType { get; }
ConstructedReturnType CastToConstructedReturnType();
}
}

30
src/Main/Base/Project/Src/Dom/Implementations/AbstractReturnType.cs

@ -80,34 +80,40 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -80,34 +80,40 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
public int ArrayDimensions {
get {
return 0;
}
}
public virtual bool IsDefaultReturnType {
get {
return true;
}
}
public IReturnType ArrayElementType {
public virtual bool IsArrayReturnType {
get {
throw new NotSupportedException();
return false;
}
}
public virtual ArrayReturnType CastToArrayReturnType()
{
throw new InvalidCastException("Cannot cast " + ToString() + " to expected type.");
}
public IReturnType UnboundType {
public virtual bool IsGenericReturnType {
get {
throw new NotSupportedException();
return false;
}
}
public virtual GenericReturnType CastToGenericReturnType()
{
throw new InvalidCastException("Cannot cast " + ToString() + " to expected type.");
}
public IList<IReturnType> TypeArguments {
public virtual bool IsConstructedReturnType {
get {
return null;
return false;
}
}
public virtual ConstructedReturnType CastToConstructedReturnType()
{
throw new InvalidCastException("Cannot cast " + ToString() + " to expected type.");
}
}
}

17
src/Main/Base/Project/Src/Dom/Implementations/AnonymousMethodReturnType.cs

@ -59,8 +59,8 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -59,8 +59,8 @@ namespace ICSharpCode.SharpDevelop.Dom
{
if (cachedClass != null) return cachedClass;
DefaultClass c = new DefaultClass(cu, ClassType.Delegate, ModifierEnum.None, DomRegion.Empty, null);
c.BaseTypes.Add(ReflectionReturnType.CreatePrimitive(typeof(Delegate)));
AddDefaultDelegateMethod(c, returnType ?? ReflectionReturnType.Object, parameters);
c.BaseTypes.Add(cu.ProjectContent.SystemTypes.Delegate);
AddDefaultDelegateMethod(c, returnType ?? cu.ProjectContent.SystemTypes.Object, parameters);
cachedClass = c;
return c;
}
@ -72,23 +72,18 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -72,23 +72,18 @@ namespace ICSharpCode.SharpDevelop.Dom
invokeMethod.Parameters.Add(par);
}
c.Methods.Add(invokeMethod);
invokeMethod = new DefaultMethod("BeginInvoke", CreateReturnType(typeof(IAsyncResult)), ModifierEnum.Public, c.Region, DomRegion.Empty, c);
invokeMethod = new DefaultMethod("BeginInvoke", c.ProjectContent.SystemTypes.IAsyncResult, ModifierEnum.Public, c.Region, DomRegion.Empty, c);
foreach (IParameter par in parameters) {
invokeMethod.Parameters.Add(par);
}
invokeMethod.Parameters.Add(new DefaultParameter("callback", CreateReturnType(typeof(AsyncCallback)), DomRegion.Empty));
invokeMethod.Parameters.Add(new DefaultParameter("object", ReflectionReturnType.Object, DomRegion.Empty));
invokeMethod.Parameters.Add(new DefaultParameter("callback", c.ProjectContent.SystemTypes.AsyncCallback, DomRegion.Empty));
invokeMethod.Parameters.Add(new DefaultParameter("object", c.ProjectContent.SystemTypes.Object, DomRegion.Empty));
c.Methods.Add(invokeMethod);
invokeMethod = new DefaultMethod("EndInvoke", returnType, ModifierEnum.Public, c.Region, DomRegion.Empty, c);
invokeMethod.Parameters.Add(new DefaultParameter("result", CreateReturnType(typeof(IAsyncResult)), DomRegion.Empty));
invokeMethod.Parameters.Add(new DefaultParameter("result", c.ProjectContent.SystemTypes.IAsyncResult, DomRegion.Empty));
c.Methods.Add(invokeMethod);
}
static IReturnType CreateReturnType(Type type)
{
return ReflectionReturnType.Create(ProjectContentRegistry.Mscorlib, null, type, false);
}
public override IReturnType BaseType {
get {
return GetUnderlyingClass().DefaultReturnType;

79
src/Main/Base/Project/Src/Dom/Implementations/ArrayReturnType.cs

@ -22,13 +22,23 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -22,13 +22,23 @@ namespace ICSharpCode.SharpDevelop.Dom
{
IReturnType elementType;
int dimensions;
IProjectContent pc;
public ArrayReturnType(IReturnType elementType, int dimensions)
internal IProjectContent ProjectContent {
get {
return pc;
}
}
public ArrayReturnType(IProjectContent pc, IReturnType elementType, int dimensions)
{
if (pc == null)
throw new ArgumentNullException("pc");
if (dimensions <= 0)
throw new ArgumentOutOfRangeException("dimensions", dimensions, "dimensions must be positive");
if (elementType == null)
throw new ArgumentNullException("elementType");
this.pc = pc;
this.elementType = elementType;
this.dimensions = dimensions;
}
@ -36,9 +46,10 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -36,9 +46,10 @@ namespace ICSharpCode.SharpDevelop.Dom
public override bool Equals(object o)
{
IReturnType rt = o as IReturnType;
if (rt == null) return false;
if (rt.ArrayDimensions != dimensions) return false;
return elementType.Equals(rt.ArrayElementType);
if (rt == null || !rt.IsArrayReturnType) return false;
ArrayReturnType art = rt.CastToArrayReturnType();
if (art.ArrayDimensions != dimensions) return false;
return elementType.Equals(art.ArrayElementType);
}
public override int GetHashCode()
@ -48,12 +59,18 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -48,12 +59,18 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
public override IReturnType ArrayElementType {
public IReturnType ArrayElementType {
get {
return elementType;
}
}
public int ArrayDimensions {
get {
return dimensions;
}
}
public override string FullyQualifiedName {
get {
return elementType.FullyQualifiedName;
@ -74,7 +91,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -74,7 +91,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public override IReturnType BaseType {
get {
return ReflectionReturnType.Array;
return pc.SystemTypes.Array;
}
}
@ -83,8 +100,8 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -83,8 +100,8 @@ namespace ICSharpCode.SharpDevelop.Dom
/// </summary>
public class ArrayIndexer : DefaultProperty
{
public ArrayIndexer(IReturnType elementType)
: base("Indexer", elementType, ModifierEnum.Public, DomRegion.Empty, DomRegion.Empty, ReflectionReturnType.Array.GetUnderlyingClass())
public ArrayIndexer(IReturnType elementType, IClass systemArray)
: base("Indexer", elementType, ModifierEnum.Public, DomRegion.Empty, DomRegion.Empty, systemArray)
{
IsIndexer = true;
}
@ -93,26 +110,15 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -93,26 +110,15 @@ namespace ICSharpCode.SharpDevelop.Dom
public override List<IProperty> GetProperties()
{
List<IProperty> l = base.GetProperties();
ArrayIndexer property = new ArrayIndexer(elementType);
ArrayIndexer property = new ArrayIndexer(elementType, this.BaseType.GetUnderlyingClass());
IReturnType int32 = pc.SystemTypes.Int32;
for (int i = 0; i < dimensions; ++i) {
property.Parameters.Add(new DefaultParameter("index", ReflectionReturnType.Int, DomRegion.Empty));
property.Parameters.Add(new DefaultParameter("index", int32, DomRegion.Empty));
}
l.Add(property);
return l;
}
public override int ArrayDimensions {
get {
return dimensions;
}
}
public override bool IsDefaultReturnType {
get {
return false;
}
}
/// <summary>
/// Appends the array characters ([,,,]) to the string <paramref name="a"/>.
/// </summary>
@ -131,5 +137,34 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -131,5 +137,34 @@ namespace ICSharpCode.SharpDevelop.Dom
{
return String.Format("[ArrayReturnType: {0}, dimensions={1}]", elementType, AppendArrayString(""));
}
public override bool IsDefaultReturnType {
get {
return false;
}
}
public override bool IsArrayReturnType {
get {
return true;
}
}
public override ArrayReturnType CastToArrayReturnType()
{
return this;
}
public override bool IsConstructedReturnType {
get {
return false;
}
}
public override bool IsGenericReturnType {
get {
return false;
}
}
}
}

55
src/Main/Base/Project/Src/Dom/Implementations/ConstructedReturnType.cs

@ -27,7 +27,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -27,7 +27,7 @@ namespace ICSharpCode.SharpDevelop.Dom
IList<IReturnType> typeArguments;
IReturnType baseType;
public override IList<IReturnType> TypeArguments {
public IList<IReturnType> TypeArguments {
get {
return typeArguments;
}
@ -67,7 +67,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -67,7 +67,7 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
public override IReturnType UnboundType {
public IReturnType UnboundType {
get {
return baseType;
}
@ -78,10 +78,10 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -78,10 +78,10 @@ namespace ICSharpCode.SharpDevelop.Dom
if (t is GenericReturnType) {
GenericReturnType rt = (GenericReturnType)t;
return rt.TypeParameter.Method == null;
} else if (t.ArrayDimensions > 0) {
return CheckReturnType(t.ArrayElementType);
} else if (t.TypeArguments != null) {
foreach (IReturnType para in t.TypeArguments) {
} else if (t.IsArrayReturnType) {
return CheckReturnType(t.CastToArrayReturnType().ArrayElementType);
} else if (t.IsConstructedReturnType) {
foreach (IReturnType para in t.CastToConstructedReturnType().TypeArguments) {
if (para != null) {
if (CheckReturnType(para)) return true;
}
@ -126,8 +126,8 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -126,8 +126,8 @@ namespace ICSharpCode.SharpDevelop.Dom
if (typeParameters == null || typeParameters.Count == 0) {
return input; // nothing to do when there are no type parameters specified
}
if (input is GenericReturnType) {
GenericReturnType rt = (GenericReturnType)input;
if (input.IsGenericReturnType) {
GenericReturnType rt = input.CastToGenericReturnType();
if (convertForMethod ? (rt.TypeParameter.Method != null) : (rt.TypeParameter.Method == null)) {
if (rt.TypeParameter.Index < typeParameters.Count) {
IReturnType newType = typeParameters[rt.TypeParameter.Index];
@ -136,17 +136,19 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -136,17 +136,19 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
}
} else if (input.ArrayDimensions > 0) {
IReturnType e = input.ArrayElementType;
} else if (input.IsArrayReturnType) {
ArrayReturnType arInput = input.CastToArrayReturnType();
IReturnType e = arInput.ArrayElementType;
IReturnType t = TranslateType(e, typeParameters, convertForMethod);
if (e != t && t != null)
return new ArrayReturnType(t, input.ArrayDimensions);
} else if (input.TypeArguments != null) {
List<IReturnType> para = new List<IReturnType>(input.TypeArguments.Count);
foreach (IReturnType argument in input.TypeArguments) {
return new ArrayReturnType(arInput.ProjectContent, t, arInput.ArrayDimensions);
} else if (input.IsConstructedReturnType) {
ConstructedReturnType cinput = input.CastToConstructedReturnType();
List<IReturnType> para = new List<IReturnType>(cinput.TypeArguments.Count);
foreach (IReturnType argument in cinput.TypeArguments) {
para.Add(TranslateType(argument, typeParameters, convertForMethod));
}
return new ConstructedReturnType(input.UnboundType, para);
return new ConstructedReturnType(cinput.UnboundType, para);
}
return input;
}
@ -229,5 +231,28 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -229,5 +231,28 @@ namespace ICSharpCode.SharpDevelop.Dom
}
return r + ">]";
}
public override bool IsArrayReturnType {
get {
return false;
}
}
public override bool IsConstructedReturnType {
get {
return true;
}
}
public override ConstructedReturnType CastToConstructedReturnType()
{
return this;
}
public override bool IsGenericReturnType {
get {
return false;
}
}
}
}

16
src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs

@ -363,15 +363,15 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -363,15 +363,15 @@ namespace ICSharpCode.SharpDevelop.Dom
case ClassType.Class:
case ClassType.Interface:
if (FullyQualifiedName != "System.Object") {
return ReflectionReturnType.Object;
return this.ProjectContent.SystemTypes.Object;
}
break;
case ClassType.Enum:
return ProjectContentRegistry.Mscorlib.GetClass("System.Enum").DefaultReturnType;
return this.ProjectContent.SystemTypes.Enum;
case ClassType.Delegate:
return ReflectionReturnType.Delegate;
return this.ProjectContent.SystemTypes.Delegate;
case ClassType.Struct:
return ProjectContentRegistry.Mscorlib.GetClass("System.ValueType").DefaultReturnType;
return this.ProjectContent.SystemTypes.ValueType;
}
return null;
}
@ -386,15 +386,15 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -386,15 +386,15 @@ namespace ICSharpCode.SharpDevelop.Dom
switch (ClassType) {
case ClassType.Class:
if (FullyQualifiedName != "System.Object") {
return ReflectionReturnType.Object.GetUnderlyingClass();
return this.ProjectContent.SystemTypes.Object.GetUnderlyingClass();
}
break;
case ClassType.Enum:
return ProjectContentRegistry.Mscorlib.GetClass("System.Enum");
return this.ProjectContent.SystemTypes.Enum.GetUnderlyingClass();
case ClassType.Delegate:
return ProjectContentRegistry.Mscorlib.GetClass("System.Delegate");
return this.ProjectContent.SystemTypes.Delegate.GetUnderlyingClass();
case ClassType.Struct:
return ProjectContentRegistry.Mscorlib.GetClass("System.ValueType");
return this.ProjectContent.SystemTypes.ValueType.GetUnderlyingClass();
}
return null;
}

2
src/Main/Base/Project/Src/Dom/Implementations/DefaultCompilationUnit.cs

@ -16,6 +16,8 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -16,6 +16,8 @@ namespace ICSharpCode.SharpDevelop.Dom
[Serializable]
public class DefaultCompilationUnit : ICompilationUnit
{
public static readonly ICompilationUnit DummyCompilationUnit = new DefaultCompilationUnit(DefaultProjectContent.DummyProjectContent);
List<IUsing> usings = new List<IUsing>();
List<IClass> classes = new List<IClass>();
List<IAttribute> attributes = new List<IAttribute>();

2
src/Main/Base/Project/Src/Dom/Implementations/DefaultReturnType.cs

@ -53,7 +53,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -53,7 +53,7 @@ namespace ICSharpCode.SharpDevelop.Dom
l.AddRange(c.Methods);
if (c.ClassType == ClassType.Interface) {
if (c.BaseTypes.Count == 0) {
AddMethodsFromBaseType(l, ReflectionReturnType.Object);
AddMethodsFromBaseType(l, c.ProjectContent.SystemTypes.Object);
} else {
foreach (IReturnType baseType in c.BaseTypes) {
AddMethodsFromBaseType(l, baseType);

12
src/Main/Base/Project/Src/Dom/Implementations/DefaultTypeParameter.cs

@ -6,7 +6,6 @@ @@ -6,7 +6,6 @@
// </file>
using System;
using System.Reflection;
using System.Collections.Generic;
namespace ICSharpCode.SharpDevelop.Dom
@ -91,17 +90,6 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -91,17 +90,6 @@ namespace ICSharpCode.SharpDevelop.Dom
this.index = type.GenericParameterPosition;
}
public void AddConstraintsFromType(Type type)
{
foreach (Type constraint in type.GetGenericParameterConstraints()) {
if (method != null) {
constraints.Add(ReflectionReturnType.Create(method, constraint, false));
} else {
constraints.Add(ReflectionReturnType.Create(targetClass, constraint, false));
}
}
}
public DefaultTypeParameter(IClass targetClass, string name, int index)
{
this.targetClass = targetClass;

31
src/Main/Base/Project/Src/Dom/Implementations/GenericReturnType.cs

@ -31,12 +31,6 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -31,12 +31,6 @@ namespace ICSharpCode.SharpDevelop.Dom
return typeParameter.Equals(rt.typeParameter);
}
public override bool IsDefaultReturnType {
get {
return false;
}
}
public override int GetHashCode()
{
return typeParameter.GetHashCode();
@ -85,7 +79,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -85,7 +79,7 @@ namespace ICSharpCode.SharpDevelop.Dom
get {
int count = typeParameter.Constraints.Count;
if (count == 0)
return ReflectionReturnType.Object;
return typeParameter.Class.ProjectContent.SystemTypes.Object;
if (count == 1)
return typeParameter.Constraints[0];
return new CombinedReturnType(typeParameter.Constraints,
@ -116,5 +110,28 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -116,5 +110,28 @@ namespace ICSharpCode.SharpDevelop.Dom
{
return String.Format("[GenericReturnType: {0}]", typeParameter);
}
public override bool IsArrayReturnType {
get {
return false;
}
}
public override bool IsConstructedReturnType {
get {
return false;
}
}
public override bool IsGenericReturnType {
get {
return true;
}
}
public override ICSharpCode.SharpDevelop.Dom.GenericReturnType CastToGenericReturnType()
{
return this;
}
}
}

96
src/Main/Base/Project/Src/Dom/Implementations/ProxyReturnType.cs

@ -86,42 +86,6 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -86,42 +86,6 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
public virtual int ArrayDimensions {
get {
IReturnType baseType = BaseType;
int tmp = (baseType != null && TryEnter()) ? baseType.ArrayDimensions : 0;
busy = false;
return tmp;
}
}
public virtual IReturnType ArrayElementType {
get {
IReturnType baseType = BaseType;
IReturnType tmp = (baseType != null && TryEnter()) ? baseType.ArrayElementType : null;
busy = false;
return tmp;
}
}
public virtual IReturnType UnboundType {
get {
IReturnType baseType = BaseType;
IReturnType tmp = (baseType != null && TryEnter()) ? baseType.UnboundType : null;
busy = false;
return tmp;
}
}
public virtual IList<IReturnType> TypeArguments {
get {
IReturnType baseType = BaseType;
IList<IReturnType> tmp = (baseType != null && TryEnter()) ? baseType.TypeArguments : null;
busy = false;
return tmp;
}
}
public virtual IClass GetUnderlyingClass()
{
IReturnType baseType = BaseType;
@ -170,5 +134,65 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -170,5 +134,65 @@ namespace ICSharpCode.SharpDevelop.Dom
return tmp;
}
}
public virtual bool IsArrayReturnType {
get {
IReturnType baseType = BaseType;
bool tmp = (baseType != null && TryEnter()) ? baseType.IsArrayReturnType : false;
busy = false;
return tmp;
}
}
public virtual ArrayReturnType CastToArrayReturnType()
{
IReturnType baseType = BaseType;
ArrayReturnType temp;
if (baseType != null && TryEnter())
temp = CastToArrayReturnType();
else
throw new InvalidCastException("Cannot cast " + ToString() + " to expected type.");
busy = false;
return temp;
}
public virtual bool IsGenericReturnType {
get {
IReturnType baseType = BaseType;
bool tmp = (baseType != null && TryEnter()) ? baseType.IsGenericReturnType : false;
busy = false;
return tmp;
}
}
public virtual GenericReturnType CastToGenericReturnType()
{
IReturnType baseType = BaseType;
GenericReturnType temp;
if (baseType != null && TryEnter())
temp = CastToGenericReturnType();
else
throw new InvalidCastException("Cannot cast " + ToString() + " to expected type.");
busy = false;
return temp;
}
public virtual bool IsConstructedReturnType {
get {
IReturnType baseType = BaseType;
bool tmp = (baseType != null && TryEnter()) ? baseType.IsConstructedReturnType : false;
busy = false;
return tmp;
}
}
public virtual ConstructedReturnType CastToConstructedReturnType()
{
IReturnType baseType = BaseType;
ConstructedReturnType temp;
if (baseType != null && TryEnter())
temp = CastToConstructedReturnType();
else
throw new InvalidCastException("Cannot cast " + ToString() + " to expected type.");
busy = false;
return temp;
}
}
}

128
src/Main/Base/Project/Src/Dom/Implementations/SystemTypes.cs

@ -0,0 +1,128 @@ @@ -0,0 +1,128 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Dom
{
public class SystemTypes
{
public readonly IReturnType Void = VoidReturnType.Instance;
public readonly IReturnType Object;
public readonly IReturnType Delegate;
public readonly IReturnType ValueType;
public readonly IReturnType Enum;
public readonly IReturnType Boolean;
public readonly IReturnType Int32;
public readonly IReturnType String;
public readonly IReturnType Array;
public readonly IReturnType Attribute;
public readonly IReturnType Type;
public readonly IReturnType AsyncCallback;
public readonly IReturnType IAsyncResult;
IProjectContent pc;
public SystemTypes(IProjectContent pc)
{
this.pc = pc;
Object = CreateFromName("System.Object");
Delegate = CreateFromName("System.Delegate");
ValueType = CreateFromName("System.ValueType");
Enum = CreateFromName("System.Enum");
Boolean = CreateFromName("System.Boolean");
Int32 = CreateFromName("System.Int32");
String = CreateFromName("System.String");
Array = CreateFromName("System.Array");
Attribute = CreateFromName("System.Attribute");
Type = CreateFromName("System.Type");
AsyncCallback = CreateFromName("System.AsyncCallback");
IAsyncResult = CreateFromName("System.IAsyncResult");
}
IReturnType CreateFromName(string name)
{
IClass c = pc.GetClass(name, 0);
if (c != null) {
return c.DefaultReturnType;
} else {
LoggingService.Warn("SystemTypes.CreateFromName could not find " + name);
return VoidReturnType.Instance;
}
}
/// <summary>
/// Creates the return type for a primitive system type.
/// </summary>
public IReturnType CreatePrimitive(Type type)
{
if (type.HasElementType || type.ContainsGenericParameters) {
throw new ArgumentException("Only primitive types are supported.");
}
return CreateFromName(type.FullName);
}
}
public class VoidClass : DefaultClass
{
public static readonly VoidClass Instance = new VoidClass();
internal static readonly string VoidName = typeof(void).FullName;
public VoidClass() : base(DefaultCompilationUnit.DummyCompilationUnit, VoidName)
{
}
protected override IReturnType CreateDefaultReturnType()
{
return VoidReturnType.Instance;
}
}
public class VoidReturnType : AbstractReturnType
{
public static readonly VoidReturnType Instance = new VoidReturnType();
public VoidReturnType()
{
FullyQualifiedName = VoidClass.VoidName;
}
public override IClass GetUnderlyingClass()
{
return VoidClass.Instance;
}
public override List<IMethod> GetMethods()
{
return new List<IMethod>();
}
public override List<IProperty> GetProperties()
{
return new List<IProperty>();
}
public override List<IField> GetFields()
{
return new List<IField>();
}
public override List<IEvent> GetEvents()
{
return new List<IEvent>();
}
}
}

108
src/Main/Base/Project/Src/Dom/MemberLookupHelper.cs

@ -241,8 +241,8 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -241,8 +241,8 @@ namespace ICSharpCode.SharpDevelop.Dom
if (j < parameters.Count) {
IParameter parameter = parameters[j];
if (parameter.IsParams && needToExpand[i]) {
if (parameter.ReturnType.ArrayDimensions > 0) {
paramsType = parameter.ReturnType.ArrayElementType;
if (parameter.ReturnType.IsArrayReturnType) {
paramsType = parameter.ReturnType.CastToArrayReturnType().ArrayElementType;
paramsType = ConstructedReturnType.TranslateType(paramsType, typeParameters, true);
}
expandedParameters[i][j] = paramsType;
@ -350,14 +350,14 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -350,14 +350,14 @@ namespace ICSharpCode.SharpDevelop.Dom
if (r == null && s == null) return 0;
if (r == null) return 2;
if (s == null) return 1;
if (r is GenericReturnType && !(s is GenericReturnType))
if (r.IsGenericReturnType && !(s.IsGenericReturnType))
return 2;
if (s is GenericReturnType && !(r is GenericReturnType))
if (s.IsGenericReturnType && !(r.IsGenericReturnType))
return 1;
if (r.ArrayDimensions > 0 && s.ArrayDimensions > 0)
return GetMoreSpecific(r.ArrayElementType, s.ArrayElementType);
if (r.TypeArguments != null && s.TypeArguments != null)
return GetMoreSpecific(r.TypeArguments, s.TypeArguments);
if (r.IsArrayReturnType && s.IsArrayReturnType)
return GetMoreSpecific(r.CastToArrayReturnType().ArrayElementType, s.CastToArrayReturnType().ArrayElementType);
if (r.IsConstructedReturnType && s.IsConstructedReturnType)
return GetMoreSpecific(r.CastToConstructedReturnType().TypeArguments, s.CastToConstructedReturnType().TypeArguments);
return 0;
}
#endregion
@ -375,8 +375,11 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -375,8 +375,11 @@ namespace ICSharpCode.SharpDevelop.Dom
break;
if (!InferTypeArgument(parameters[i].ReturnType, arguments[i], result)) {
// inferring failed: maybe this is a params parameter that must be expanded?
if (parameters[i].IsParams && parameters[i].ReturnType.ArrayDimensions == 1) {
InferTypeArgument(parameters[i].ReturnType.ArrayElementType, arguments[i], result);
if (parameters[i].IsParams && parameters[i].ReturnType.IsArrayReturnType) {
ArrayReturnType art = parameters[i].ReturnType.CastToArrayReturnType();
if (art.ArrayDimensions == 1) {
InferTypeArgument(art.ArrayElementType, arguments[i], result);
}
}
}
}
@ -389,18 +392,26 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -389,18 +392,26 @@ namespace ICSharpCode.SharpDevelop.Dom
return null;
}
/// <summary>
/// Infers type arguments specified by passing expectedArgument as parameter where passedArgument
/// was expected. The resulting type arguments are written to outputArray.
/// Returns false when expectedArgument and passedArgument are incompatible, otherwise true
/// is returned (true is used both for successful inferring and other kind of errors).
/// </summary>
public static bool InferTypeArgument(IReturnType expectedArgument, IReturnType passedArgument, IReturnType[] outputArray)
{
if (expectedArgument == null) return true;
if (passedArgument == null) return true; // TODO: NullTypeReference
if (expectedArgument != null && expectedArgument.ArrayDimensions > 0) {
if (expectedArgument.ArrayDimensions == passedArgument.ArrayDimensions) {
return InferTypeArgument(expectedArgument.ArrayElementType, passedArgument.ArrayElementType, outputArray);
} else if (passedArgument.TypeArguments != null) {
if (expectedArgument.IsArrayReturnType) {
IReturnType expectedArrayElementType = expectedArgument.CastToArrayReturnType().ArrayElementType;
if (passedArgument.IsArrayReturnType && expectedArgument.CastToArrayReturnType().ArrayDimensions == passedArgument.CastToArrayReturnType().ArrayDimensions) {
return InferTypeArgument(expectedArrayElementType, passedArgument.CastToArrayReturnType().ArrayElementType, outputArray);
} else if (passedArgument.IsConstructedReturnType) {
switch (passedArgument.FullyQualifiedName) {
case "System.Collections.Generic.IList":
case "System.Collections.Generic.ICollection":
case "System.Collections.Generic.IEnumerable":
return InferTypeArgument(expectedArgument.ArrayElementType, passedArgument.TypeArguments[0], outputArray);
return InferTypeArgument(expectedArrayElementType, passedArgument.CastToConstructedReturnType().TypeArguments[0], outputArray);
}
}
// If P is an array type, and A is not an array type of the same rank,
@ -408,20 +419,26 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -408,20 +419,26 @@ namespace ICSharpCode.SharpDevelop.Dom
// type inference fails for the generic method.
return false;
}
GenericReturnType methodTP = expectedArgument as GenericReturnType;
if (methodTP != null && methodTP.TypeParameter.Method != null) {
if (methodTP.TypeParameter.Index < outputArray.Length) {
outputArray[methodTP.TypeParameter.Index] = passedArgument;
if (expectedArgument.IsGenericReturnType) {
GenericReturnType methodTP = expectedArgument.CastToGenericReturnType();
if (methodTP.TypeParameter.Method != null) {
if (methodTP.TypeParameter.Index < outputArray.Length) {
outputArray[methodTP.TypeParameter.Index] = passedArgument;
}
return true;
}
return true;
}
if (expectedArgument.TypeArguments != null) {
if (expectedArgument.IsConstructedReturnType) {
// The spec for this case is quite complex.
// For our purposes, we can simplify enourmously:
if (passedArgument.TypeArguments == null) return false;
int count = Math.Min(expectedArgument.TypeArguments.Count, passedArgument.TypeArguments.Count);
if (!passedArgument.IsConstructedReturnType) return false;
IList<IReturnType> expectedTA = expectedArgument.CastToConstructedReturnType().TypeArguments;
IList<IReturnType> passedTA = passedArgument.CastToConstructedReturnType().TypeArguments;
int count = Math.Min(expectedTA.Count, passedTA.Count);
for (int i = 0; i < count; i++) {
InferTypeArgument(expectedArgument.TypeArguments[i], passedArgument.TypeArguments[i], outputArray);
InferTypeArgument(expectedTA[i], passedTA[i], outputArray);
}
}
return true;
@ -474,11 +491,11 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -474,11 +491,11 @@ namespace ICSharpCode.SharpDevelop.Dom
// - all additional parameters must be applicable to the unpacked array
IReturnType rt = parameters[lastParameter].ReturnType;
if (rt == null || rt.ArrayDimensions == 0) {
if (rt == null || !rt.IsArrayReturnType) {
return false;
}
for (int i = lastParameter; i < arguments.Length; i++) {
if (IsApplicable(arguments[i], rt.ArrayElementType)) {
if (IsApplicable(arguments[i], rt.CastToArrayReturnType().ArrayElementType)) {
score++;
} else {
ok = false;
@ -548,28 +565,33 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -548,28 +565,33 @@ namespace ICSharpCode.SharpDevelop.Dom
if (toIsDefault && to.FullyQualifiedName == "System.Object") {
return true; // from any type to object
}
if (toIsDefault && (fromIsDefault || from.ArrayDimensions > 0)) {
if (toIsDefault && (fromIsDefault || from.IsArrayReturnType)) {
IClass c1 = from.GetUnderlyingClass();
IClass c2 = to.GetUnderlyingClass();
if (c1 != null && c1.IsTypeInInheritanceTree(c2)) {
return true;
}
}
if (from.ArrayDimensions > 0 && from.ArrayDimensions == to.ArrayDimensions) {
if (from.IsArrayReturnType && to.IsArrayReturnType) {
ArrayReturnType fromArt = from.CastToArrayReturnType();
ArrayReturnType toArt = to.CastToArrayReturnType();
// from array to other array type
return ConversionExists(from.ArrayElementType, to.ArrayElementType);
if (fromArt.ArrayDimensions == toArt.ArrayDimensions) {
return ConversionExists(fromArt.ArrayElementType, toArt.ArrayElementType);
}
}
IList<IReturnType> fromTypeArguments = from.TypeArguments;
IList<IReturnType> toTypeArguments = to.TypeArguments;
if (fromTypeArguments != null && toTypeArguments != null) {
if (from.IsConstructedReturnType && to.IsConstructedReturnType) {
if (from.FullyQualifiedName == to.FullyQualifiedName) {
IList<IReturnType> fromTypeArguments = from.CastToConstructedReturnType().TypeArguments;
IList<IReturnType> toTypeArguments = to.CastToConstructedReturnType().TypeArguments;
if (fromTypeArguments.Count == toTypeArguments.Count) {
for (int i = 0; i < fromTypeArguments.Count; i++) {
if (fromTypeArguments[i] == toTypeArguments[i])
continue;
if (object.Equals(fromTypeArguments[i], toTypeArguments[i]))
continue;
if (!(toTypeArguments[i] is GenericReturnType))
if (!(toTypeArguments[i].IsGenericReturnType))
return false;
}
return true;
@ -690,8 +712,10 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -690,8 +712,10 @@ namespace ICSharpCode.SharpDevelop.Dom
/// <summary>
/// Gets the common base type of a and b.
/// </summary>
public static IReturnType GetCommonType(IReturnType a, IReturnType b)
public static IReturnType GetCommonType(IProjectContent projectContent, IReturnType a, IReturnType b)
{
if (projectContent == null)
throw new ArgumentNullException("projectContent");
if (a == null) return b;
if (b == null) return a;
if (ConversionExists(a, b))
@ -713,7 +737,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -713,7 +737,7 @@ namespace ICSharpCode.SharpDevelop.Dom
return baseType;
}
}
return ReflectionReturnType.Object;
return projectContent.SystemTypes.Object;
}
/// <summary>
@ -721,20 +745,26 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -721,20 +745,26 @@ namespace ICSharpCode.SharpDevelop.Dom
/// For example, when <paramref name="returnType"/> is Dictionary(of string, int)
/// this method will return KeyValuePair(of string, int)
/// </summary>
public static IReturnType GetTypeParameterPassedToBaseClass(IReturnType returnType, IClass baseClass, int baseClassTypeParameterIndex)
public static IReturnType GetTypeParameterPassedToBaseClass(IReturnType parentType, IClass baseClass, int baseClassTypeParameterIndex)
{
if (!parentType.IsConstructedReturnType)
return null;
ConstructedReturnType returnType = parentType.CastToConstructedReturnType();
IClass c = returnType.GetUnderlyingClass();
if (c == null) return null;
if (baseClass.CompareTo(c) == 0) {
if (returnType.TypeArguments == null || baseClassTypeParameterIndex >= returnType.TypeArguments.Count)
if (baseClassTypeParameterIndex >= returnType.TypeArguments.Count)
return null;
return returnType.TypeArguments[baseClassTypeParameterIndex];
}
foreach (IReturnType baseType in c.BaseTypes) {
if (baseClass.CompareTo(baseType.GetUnderlyingClass()) == 0) {
if (baseType.TypeArguments == null || baseClassTypeParameterIndex >= baseType.TypeArguments.Count)
if (!baseType.IsConstructedReturnType)
return null;
ConstructedReturnType baseTypeCRT = baseType.CastToConstructedReturnType();
if (baseClassTypeParameterIndex >= baseTypeCRT.TypeArguments.Count)
return null;
IReturnType result = baseType.TypeArguments[baseClassTypeParameterIndex];
IReturnType result = baseTypeCRT.TypeArguments[baseClassTypeParameterIndex];
if (returnType.TypeArguments != null) {
result = ConstructedReturnType.TranslateType(result, returnType.TypeArguments, false);
}

2
src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs

@ -380,7 +380,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -380,7 +380,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
void CreateDelegate(DefaultClass c, string name, AST.TypeReference returnType, IList<AST.TemplateDefinition> templates, IList<AST.ParameterDeclarationExpression> parameters)
{
c.BaseTypes.Add(ReflectionReturnType.CreatePrimitive(typeof(Delegate)));
c.BaseTypes.Add(c.ProjectContent.SystemTypes.Delegate);
if (currentClass.Count > 0) {
DefaultClass cur = GetCurrentClass();
cur.InnerClasses.Add(c);

10
src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs

@ -282,7 +282,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -282,7 +282,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
return null;
IClass c = SearchClass(name);
if (c != null) {
if (c.IsTypeInInheritanceTree(ProjectContentRegistry.Mscorlib.GetClass("System.Attribute")))
if (c.IsTypeInInheritanceTree(c.ProjectContent.SystemTypes.Attribute.GetUnderlyingClass()))
return c;
}
return SearchClass(name + "Attribute");
@ -318,7 +318,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -318,7 +318,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
if (expr is PrimitiveExpression) {
if (((PrimitiveExpression)expr).Value is int)
return new IntegerLiteralResolveResult(callingClass, callingMember);
return new IntegerLiteralResolveResult(callingClass, callingMember, projectContent.SystemTypes.Int32);
} else if (expr is InvocationExpression) {
IMethodOrProperty method = typeVisitor.GetMethod(expr as InvocationExpression);
if (method != null) {
@ -400,9 +400,9 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -400,9 +400,9 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
}
}
IReturnType[] typeParameters = null;
if (type.TypeArguments != null) {
typeParameters = new IReturnType[type.TypeArguments.Count];
type.TypeArguments.CopyTo(typeParameters, 0);
if (type.IsConstructedReturnType) {
typeParameters = new IReturnType[type.CastToConstructedReturnType().TypeArguments.Count];
type.CastToConstructedReturnType().TypeArguments.CopyTo(typeParameters, 0);
}
ResolveResult rr = CreateMemberResolveResult(typeVisitor.FindOverload(constructors, typeParameters, ((ObjectCreateExpression)expr).Parameters, null));
if (rr != null) {

28
src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs

@ -30,7 +30,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -30,7 +30,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
if (primitiveExpression.Value == null) {
return NullReturnType.Instance;
} else {
return ReflectionReturnType.CreatePrimitive(primitiveExpression.Value.GetType());
return resolver.ProjectContent.SystemTypes.CreatePrimitive(primitiveExpression.Value.GetType());
}
}
@ -40,9 +40,9 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -40,9 +40,9 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
case BinaryOperatorType.NullCoalescing:
return binaryOperatorExpression.Right.AcceptVisitor(this, data);
case BinaryOperatorType.DivideInteger:
return ReflectionReturnType.Int;
return resolver.ProjectContent.SystemTypes.Int32;
case BinaryOperatorType.Concat:
return ReflectionReturnType.String;
return resolver.ProjectContent.SystemTypes.String;
case BinaryOperatorType.Equality:
case BinaryOperatorType.InEquality:
case BinaryOperatorType.ReferenceEquality:
@ -53,9 +53,10 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -53,9 +53,10 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
case BinaryOperatorType.LessThanOrEqual:
case BinaryOperatorType.GreaterThan:
case BinaryOperatorType.GreaterThanOrEqual:
return ReflectionReturnType.Bool;
return resolver.ProjectContent.SystemTypes.Boolean;
default:
return MemberLookupHelper.GetCommonType(binaryOperatorExpression.Left.AcceptVisitor(this, data) as IReturnType,
return MemberLookupHelper.GetCommonType(resolver.ProjectContent,
binaryOperatorExpression.Left.AcceptVisitor(this, data) as IReturnType,
binaryOperatorExpression.Right.AcceptVisitor(this, data) as IReturnType);
}
}
@ -348,12 +349,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -348,12 +349,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
public override object Visit(SizeOfExpression sizeOfExpression, object data)
{
return CreateReturnType(typeof(int));
return resolver.ProjectContent.SystemTypes.Int32;
}
public override object Visit(TypeOfExpression typeOfExpression, object data)
{
return CreateReturnType(typeof(Type));
return resolver.ProjectContent.SystemTypes.Type;
}
public override object Visit(CheckedExpression checkedExpression, object data)
@ -415,7 +416,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -415,7 +416,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
public override object Visit(TypeOfIsExpression typeOfIsExpression, object data)
{
return ReflectionReturnType.Bool;
return resolver.ProjectContent.SystemTypes.Boolean;
}
public override object Visit(DefaultValueExpression defaultValueExpression, object data)
@ -532,14 +533,14 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -532,14 +533,14 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
}
t = new ConstructedReturnType(t, para);
}
return WrapArray(t, reference);
return WrapArray(projectContent, t, reference);
}
static IReturnType WrapArray(IReturnType t, TypeReference reference)
static IReturnType WrapArray(IProjectContent pc, IReturnType t, TypeReference reference)
{
if (reference.IsArrayType) {
for (int i = reference.RankSpecifier.Length - 1; i >= 0; --i) {
t = new ArrayReturnType(t, reference.RankSpecifier[i] + 1);
t = new ArrayReturnType(pc, t, reference.RankSpecifier[i] + 1);
}
}
return t;
@ -572,10 +573,5 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -572,10 +573,5 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
return new List<IEvent>();
}
}
static IReturnType CreateReturnType(Type type)
{
return ReflectionReturnType.Create(ProjectContentRegistry.Mscorlib, null, type, false);
}
}
}

33
src/Main/Base/Project/Src/Dom/ReflectionLayer/DomPersistence.cs

@ -530,11 +530,11 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -530,11 +530,11 @@ namespace ICSharpCode.SharpDevelop.Dom
}
} else if (rt is GenericReturnType) {
// ignore
} else if (rt.ArrayDimensions > 0) {
AddExternalType(rt.ArrayElementType, externalTypes, classCount);
} else if (rt.TypeArguments != null) {
AddExternalType(rt.UnboundType, externalTypes, classCount);
foreach (IReturnType typeArgument in rt.TypeArguments) {
} else if (rt.IsArrayReturnType) {
AddExternalType(rt.CastToArrayReturnType().ArrayElementType, externalTypes, classCount);
} else if (rt.IsConstructedReturnType) {
AddExternalType(rt.CastToConstructedReturnType().UnboundType, externalTypes, classCount);
foreach (IReturnType typeArgument in rt.CastToConstructedReturnType().TypeArguments) {
AddExternalType(typeArgument, externalTypes, classCount);
}
} else {
@ -562,23 +562,24 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -562,23 +562,24 @@ namespace ICSharpCode.SharpDevelop.Dom
} else {
writer.Write(classIndices[new ClassNameTypeCountPair(rt)]);
}
} else if (rt is GenericReturnType) {
GenericReturnType grt = (GenericReturnType)rt;
} else if (rt.IsGenericReturnType) {
GenericReturnType grt = rt.CastToGenericReturnType();
if (grt.TypeParameter.Method != null) {
writer.Write(MethodGenericRTCode);
} else {
writer.Write(TypeGenericRTCode);
}
writer.Write(grt.TypeParameter.Index);
} else if (rt.ArrayDimensions > 0) {
} else if (rt.IsArrayReturnType) {
writer.Write(ArrayRTCode);
writer.Write(rt.ArrayDimensions);
WriteType(rt.ArrayElementType);
} else if (rt.TypeArguments != null) {
writer.Write(rt.CastToArrayReturnType().ArrayDimensions);
WriteType(rt.CastToArrayReturnType().ArrayElementType);
} else if (rt.IsConstructedReturnType) {
ConstructedReturnType crt = rt.CastToConstructedReturnType();
writer.Write(ConstructedRTCode);
WriteType(rt.UnboundType);
writer.Write((byte)rt.TypeArguments.Count);
foreach (IReturnType typeArgument in rt.TypeArguments) {
WriteType(crt.UnboundType);
writer.Write((byte)crt.TypeArguments.Count);
foreach (IReturnType typeArgument in crt.TypeArguments) {
WriteType(typeArgument);
}
} else {
@ -594,7 +595,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -594,7 +595,7 @@ namespace ICSharpCode.SharpDevelop.Dom
switch (index) {
case ArrayRTCode:
int dimensions = reader.ReadInt32();
return new ArrayReturnType(ReadType(), dimensions);
return new ArrayReturnType(pc, ReadType(), dimensions);
case ConstructedRTCode:
IReturnType baseType = ReadType();
IReturnType[] typeArguments = new IReturnType[reader.ReadByte()];
@ -609,7 +610,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -609,7 +610,7 @@ namespace ICSharpCode.SharpDevelop.Dom
case NullRTReferenceCode:
return null;
case VoidRTCode:
return ReflectionReturnType.Void;
return VoidReturnType.Instance;
default:
return types[index];
}

15
src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs

@ -11,7 +11,7 @@ using System.Reflection; @@ -11,7 +11,7 @@ using System.Reflection;
using System.Collections.Generic;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Dom
namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer
{
[Serializable]
public class ReflectionClass : DefaultClass
@ -123,7 +123,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -123,7 +123,7 @@ namespace ICSharpCode.SharpDevelop.Dom
}
int i = 0;
foreach (Type g in type.GetGenericArguments()) {
((DefaultTypeParameter)this.TypeParameters[i++]).AddConstraintsFromType(g);
AddConstraintsFromType(this.TypeParameters[i++], g);
}
}
@ -164,6 +164,17 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -164,6 +164,17 @@ namespace ICSharpCode.SharpDevelop.Dom
InitMembers(type);
}
internal void AddConstraintsFromType(ITypeParameter tp, Type type)
{
foreach (Type constraint in type.GetGenericParameterConstraints()) {
if (tp.Method != null) {
tp.Constraints.Add(ReflectionReturnType.Create(tp.Method, constraint, false));
} else {
tp.Constraints.Add(ReflectionReturnType.Create(tp.Class, constraint, false));
}
}
}
}
}

2
src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionEvent.cs

@ -10,7 +10,7 @@ using System.Collections; @@ -10,7 +10,7 @@ using System.Collections;
using System.Reflection;
using System.Xml;
namespace ICSharpCode.SharpDevelop.Dom
namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer
{
[Serializable]
public class ReflectionEvent : DefaultEvent

2
src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionField.cs

@ -11,7 +11,7 @@ using System.Diagnostics; @@ -11,7 +11,7 @@ using System.Diagnostics;
using System.Reflection;
using System.Xml;
namespace ICSharpCode.SharpDevelop.Dom
namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer
{
[Serializable]
public class ReflectionField : DefaultField

2
src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionLoader.cs

@ -10,7 +10,7 @@ using System.IO; @@ -10,7 +10,7 @@ using System.IO;
using System.Reflection;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Dom
namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer
{
public sealed class ReflectionLoader : MarshalByRefObject
{

6
src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionMethod.cs

@ -12,12 +12,12 @@ using System.Collections.Generic; @@ -12,12 +12,12 @@ using System.Collections.Generic;
using System.Reflection;
using System.Xml;
namespace ICSharpCode.SharpDevelop.Dom
namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer
{
[Serializable]
public class ReflectionMethod : DefaultMethod
{
public ReflectionMethod(MethodBase methodBase, IClass declaringType)
public ReflectionMethod(MethodBase methodBase, ReflectionClass declaringType)
: base(declaringType, methodBase is ConstructorInfo ? "#ctor" : methodBase.Name)
{
if (methodBase is MethodInfo) {
@ -36,7 +36,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -36,7 +36,7 @@ namespace ICSharpCode.SharpDevelop.Dom
}
int i = 0;
foreach (Type g in methodBase.GetGenericArguments()) {
((DefaultTypeParameter)this.TypeParameters[i++]).AddConstraintsFromType(g);
declaringType.AddConstraintsFromType(this.TypeParameters[i++], g);
}
}

2
src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionParameter.cs

@ -10,7 +10,7 @@ using System.Reflection; @@ -10,7 +10,7 @@ using System.Reflection;
using System.Xml;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Dom
namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer
{
[Serializable]
public class ReflectionParameter : DefaultParameter

2
src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionProperty.cs

@ -10,7 +10,7 @@ using System.Collections; @@ -10,7 +10,7 @@ using System.Collections;
using System.Reflection;
using System.Xml;
namespace ICSharpCode.SharpDevelop.Dom
namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer
{
[Serializable]
public class ReflectionProperty : DefaultProperty

135
src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionReturnType.cs

@ -9,136 +9,10 @@ using System; @@ -9,136 +9,10 @@ using System;
using System.Collections.Generic;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Dom
namespace ICSharpCode.SharpDevelop.Dom.ReflectionLayer
{
public static class ReflectionReturnType
{
#region Primitive Types
static IReturnType @object, @int, @string, @bool, type, @void, array, disposable, exception, @delegate;
/// <summary>Gets a ReturnType describing System.Object.</summary>
public static IReturnType Object {
get {
if (@object == null) {
@object = CreatePrimitive(typeof(object));
}
return @object;
}
}
/// <summary>Gets a ReturnType describing System.Int32.</summary>
public static IReturnType Int {
get {
if (@int == null) {
@int = CreatePrimitive(typeof(int));
}
return @int;
}
}
/// <summary>Gets a ReturnType describing System.String.</summary>
public static IReturnType String {
get {
if (@string == null) {
@string = CreatePrimitive(typeof(string));
}
return @string;
}
}
/// <summary>Gets a ReturnType describing System.Boolean.</summary>
public static IReturnType Bool {
get {
if (@bool == null) {
@bool = CreatePrimitive(typeof(bool));
}
return @bool;
}
}
/// <summary>Gets a ReturnType describing System.Type.</summary>
public static IReturnType Type {
get {
if (type == null) {
type = CreatePrimitive(typeof(Type));
}
return type;
}
}
/// <summary>Gets a ReturnType describing System.Array.</summary>
public static IReturnType Array {
get {
if (array == null) {
array = CreatePrimitive(typeof(Array));
}
return array;
}
}
/// <summary>Gets a ReturnType describing System.IDisposable.</summary>
public static IReturnType Disposable {
get {
if (disposable == null) {
disposable = CreatePrimitive(typeof(IDisposable));
}
return disposable;
}
}
/// <summary>Gets a ReturnType describing System.IDisposable.</summary>
public static IReturnType Exception {
get {
if (exception == null) {
exception = CreatePrimitive(typeof(Exception));
}
return exception;
}
}
/// <summary>Gets a ReturnType describing System.Delegate.</summary>
public static IReturnType Delegate {
get {
if (@delegate == null) {
@delegate = CreatePrimitive(typeof(Delegate));
}
return @delegate;
}
}
/// <summary>Gets a ReturnType describing System.Void.</summary>
public static IReturnType Void {
get {
if (@void == null) {
@void = new VoidReturnType();
}
return @void;
}
}
private class VoidReturnType : AbstractReturnType
{
public VoidReturnType() {
FullyQualifiedName = typeof(void).FullName;
}
public override IClass GetUnderlyingClass() {
return ProjectContentRegistry.Mscorlib.GetClass(FullyQualifiedName);
}
public override List<IMethod> GetMethods() {
return new List<IMethod>();
}
public override List<IProperty> GetProperties() {
return new List<IProperty>();
}
public override List<IField> GetFields() {
return new List<IField>();
}
public override List<IEvent> GetEvents() {
return new List<IEvent>();
}
}
/// <summary>
/// Create a primitive return type.
/// Allowed are ONLY simple classes from MsCorlib (no arrays/generics etc.)
/// </summary>
public static IReturnType CreatePrimitive(Type type)
{
return ProjectContentRegistry.Mscorlib.GetClass(type.FullName).DefaultReturnType;
}
#endregion
public static bool IsDefaultType(Type type)
{
return !type.IsArray && !type.IsGenericType && !type.IsGenericParameter;
@ -160,7 +34,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -160,7 +34,7 @@ namespace ICSharpCode.SharpDevelop.Dom
// TODO: Use ByRefRefReturnType
return Create(pc, member, type.GetElementType(), createLazyReturnType);
} else if (type.IsArray) {
return MakeArray(type, Create(pc, member, type.GetElementType(), createLazyReturnType));
return new ArrayReturnType(pc, Create(pc, member, type.GetElementType(), createLazyReturnType), type.GetArrayRank());
} else if (type.IsGenericType && !type.IsGenericTypeDefinition) {
Type[] args = type.GetGenericArguments();
List<IReturnType> para = new List<IReturnType>(args.Length);
@ -209,10 +83,5 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -209,10 +83,5 @@ namespace ICSharpCode.SharpDevelop.Dom
return new GetClassReturnType(pc, name, typeParameterCount);
}
}
static IReturnType MakeArray(Type type, IReturnType baseType)
{
return new ArrayReturnType(baseType, type.GetArrayRank());
}
}
}

6
src/Main/Base/Project/Src/Dom/ResolveResult.cs

@ -124,7 +124,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -124,7 +124,7 @@ namespace ICSharpCode.SharpDevelop.Dom
bool supportsExtensionProperties = language.SupportsExtensionProperties;
if (supportsExtensionMethods || supportsExtensionProperties) {
ArrayList list = new ArrayList();
IMethod dummyMethod = new DefaultMethod("dummy", ReflectionReturnType.Void, ModifierEnum.Static, DomRegion.Empty, DomRegion.Empty, callingClass);
IMethod dummyMethod = new DefaultMethod("dummy", VoidReturnType.Instance, ModifierEnum.Static, DomRegion.Empty, DomRegion.Empty, callingClass);
NRefactoryResolver.NRefactoryResolver.AddContentsFromCalling(list, callingClass, dummyMethod);
NRefactoryResolver.NRefactoryResolver.AddImportedNamespaceContents(list, callingClass.CompilationUnit, callingClass);
@ -367,8 +367,8 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -367,8 +367,8 @@ namespace ICSharpCode.SharpDevelop.Dom
/// </summary>
public class IntegerLiteralResolveResult : ResolveResult
{
public IntegerLiteralResolveResult(IClass callingClass, IMember callingMember)
: base(callingClass, callingMember, ReflectionReturnType.Int)
public IntegerLiteralResolveResult(IClass callingClass, IMember callingMember, IReturnType systemInt32)
: base(callingClass, callingMember, systemInt32)
{
}

6
src/Main/Base/Project/Src/Gui/Pads/FileScout.cs

@ -516,12 +516,12 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -516,12 +516,12 @@ namespace ICSharpCode.SharpDevelop.Gui
public ShellTree()
{
Sorted = true;
TreeNode rootNode = Nodes.Add("Desktop");
TreeNode rootNode = Nodes.Add(Path.GetFileName(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)));
rootNode.ImageIndex = 6;
rootNode.SelectedImageIndex = 6;
rootNode.Tag = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
TreeNode myFilesNode = rootNode.Nodes.Add("My Documents");
TreeNode myFilesNode = rootNode.Nodes.Add(Path.GetFileName(Environment.GetFolderPath(Environment.SpecialFolder.Personal)));
myFilesNode.ImageIndex = 7;
myFilesNode.SelectedImageIndex = 7;
try {
@ -532,7 +532,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -532,7 +532,7 @@ namespace ICSharpCode.SharpDevelop.Gui
myFilesNode.Nodes.Add("");
TreeNode computerNode = rootNode.Nodes.Add("My Computer");
TreeNode computerNode = rootNode.Nodes.Add(StringParser.Parse("${res:MainWindow.Windows.FileScout.MyComputer}"));
computerNode.ImageIndex = 8;
computerNode.SelectedImageIndex = 8;
try {

1
src/Main/Base/Project/Src/Services/AmbienceService/AmbienceReflectionDecorator.cs

@ -10,6 +10,7 @@ using System.Collections; @@ -10,6 +10,7 @@ using System.Collections;
using System.Reflection;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.ReflectionLayer;
namespace ICSharpCode.Core
{

32
src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs

@ -151,6 +151,21 @@ namespace ICSharpCode.Core @@ -151,6 +151,21 @@ namespace ICSharpCode.Core
}
}
SystemTypes systemTypes;
/// <summary>
/// Gets a class that allows to conveniently access commonly used types in the system
/// namespace.
/// </summary>
public virtual SystemTypes SystemTypes {
get {
if (systemTypes == null) {
systemTypes = new SystemTypes(this);
}
return systemTypes;
}
}
public ICollection<IProjectContent> ReferencedContents {
get {
return referencedContents;
@ -818,9 +833,26 @@ namespace ICSharpCode.Core @@ -818,9 +833,26 @@ namespace ICSharpCode.Core
protected virtual void OnReferencedContentsChanged(EventArgs e)
{
systemTypes = null; // re-create system types
if (ReferencedContentsChanged != null) {
ReferencedContentsChanged(this, e);
}
}
public static readonly IProjectContent DummyProjectContent = new DummyContent();
private class DummyContent : DefaultProjectContent
{
public override string ToString()
{
return "[DummyProjectContent]";
}
public override SystemTypes SystemTypes {
get {
return ParserService.CurrentProjectContent.SystemTypes;
}
}
}
}
}

8
src/Main/Base/Project/Src/Services/ParserService/IProjectContent.cs

@ -55,6 +55,14 @@ namespace ICSharpCode.Core @@ -55,6 +55,14 @@ namespace ICSharpCode.Core
get;
}
/// <summary>
/// Gets a class that allows to conveniently access commonly used types in the system
/// namespace.
/// </summary>
SystemTypes SystemTypes {
get;
}
string GetXmlDocumentation(string memberTag);
void AddClassToNamespaceList(IClass addClass);

13
src/Main/Base/Project/Src/Services/ParserService/ProjectContentRegistry.cs

@ -6,20 +6,17 @@ @@ -6,20 +6,17 @@
// </file>
using System;
using System.IO;
using System.Threading;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Text;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.ReflectionLayer;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
using MSjogren.GacTool.FusionNative;
namespace ICSharpCode.Core

14
src/Main/Base/Project/Src/Services/ParserService/ReflectionProjectContent.cs

@ -16,6 +16,7 @@ using System.Reflection; @@ -16,6 +16,7 @@ using System.Reflection;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom.ReflectionLayer;
namespace ICSharpCode.SharpDevelop.Dom
{
@ -102,18 +103,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -102,18 +103,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public void InitializeSpecialClasses()
{
if (GetClassInternal(VoidClass.VoidName, 0, Language) != null) {
AddClassToNamespaceList(new VoidClass(assemblyCompilationUnit));
}
}
private class VoidClass : ReflectionClass
{
internal static readonly string VoidName = typeof(void).FullName;
public VoidClass(ICompilationUnit compilationUnit) : base(compilationUnit, typeof(void), VoidName, null) {}
protected override IReturnType CreateDefaultReturnType() {
return ReflectionReturnType.Void;
AddClassToNamespaceList(VoidClass.Instance);
}
}

13
src/Main/Base/Project/Src/Services/RefactoringService/CodeGenerator.cs

@ -32,15 +32,15 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -32,15 +32,15 @@ namespace ICSharpCode.SharpDevelop.Refactoring
typeRef = new TypeReference(returnType.Name);
else
typeRef = new TypeReference(returnType.FullyQualifiedName);
while (returnType.ArrayDimensions > 0) {
while (returnType.IsArrayReturnType) {
int[] rank = typeRef.RankSpecifier ?? new int[0];
Array.Resize(ref rank, rank.Length + 1);
rank[rank.Length - 1] = returnType.ArrayDimensions - 1;
rank[rank.Length - 1] = returnType.CastToArrayReturnType().ArrayDimensions - 1;
typeRef.RankSpecifier = rank;
returnType = returnType.ArrayElementType;
returnType = returnType.CastToArrayReturnType().ArrayElementType;
}
if (returnType.TypeArguments != null) {
foreach (IReturnType typeArgument in returnType.TypeArguments) {
if (returnType.IsConstructedReturnType) {
foreach (IReturnType typeArgument in returnType.CastToConstructedReturnType().TypeArguments) {
typeRef.GenericTypes.Add(ConvertType(typeArgument, context));
}
}
@ -71,9 +71,10 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -71,9 +71,10 @@ namespace ICSharpCode.SharpDevelop.Refactoring
case "System.UInt16":
case "System.UInt32":
case "System.UInt64":
// don't use short name -> output visitor will use the instrinsic name
return false;
}
int typeArgumentCount = (returnType.TypeArguments != null) ? returnType.TypeArguments.Count : 0;
int typeArgumentCount = (returnType.IsConstructedReturnType) ? returnType.CastToConstructedReturnType().TypeArguments.Count : 0;
IReturnType typeInTargetContext = context.SearchType(returnType.Name, typeArgumentCount);
return typeInTargetContext != null && typeInTargetContext.FullyQualifiedName == returnType.FullyQualifiedName;
}

Loading…
Cancel
Save