Browse Source

Merge remote-tracking branch 'upstream/master' into mansheng

newNRvisualizers
Mansheng Yang 13 years ago
parent
commit
580fa30112
  1. 46
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 65
      ICSharpCode.NRefactory.CSharp/Completion/CompletionDataWrapper.cs
  3. 7
      ICSharpCode.NRefactory.CSharp/Completion/ICompletionDataFactory.cs
  4. 195
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ImplementInterfaceAction.cs
  5. 23
      ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs
  6. 68
      ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs
  7. 148
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/BrowsableAttributeTests.cs
  8. 78
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs
  9. 1
      ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj
  10. 8
      ICSharpCode.NRefactory.Tests/TypeSystem/CecilLoaderTests.cs
  11. 73
      ICSharpCode.NRefactory/Completion/CompletionExtensionMethods.cs
  12. 10
      ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj

46
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//
//
// CSharpCompletionEngine.cs
//
// Author:
@ -262,7 +262,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -262,7 +262,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return contextList.Result;
}
foreach (var m in initializerResult.Item1.Type.GetMembers (m => !m.IsSynthetic && m.IsPublic && (m.EntityType == EntityType.Property || m.EntityType == EntityType.Field))) {
foreach (var m in initializerResult.Item1.Type.GetMembers (m => m.IsPublic && (m.EntityType == EntityType.Property || m.EntityType == EntityType.Field))) {
contextList.AddMember(m);
}
@ -543,7 +543,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -543,7 +543,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var wrapper = new CompletionDataWrapper(this);
if (currentType != null) {
// bool includeProtected = DomType.IncludeProtected (dom, typeFromDatabase, resolver.CallingType);
foreach (var method in currentType.Methods) {
foreach (var method in ctx.CurrentTypeDefinition.Methods) {
if (MatchDelegate(delegateType, method) /*&& method.IsAccessibleFrom (dom, resolver.CallingType, resolver.CallingMember, includeProtected) &&*/) {
wrapper.AddMember(method);
// data.SetText (data.CompletionText + ";");
@ -1200,16 +1200,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1200,16 +1200,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
wrapper.AddVariable(variable);
}
}
if (currentMember is IUnresolvedParameterizedMember && !(node is AstType)) {
var param = (IParameterizedMember)currentMember.CreateResolved(ctx);
if (state.CurrentMember is IParameterizedMember && !(node is AstType)) {
var param = (IParameterizedMember)state.CurrentMember;
foreach (var p in param.Parameters) {
wrapper.AddVariable(p);
}
}
if (currentMember is IUnresolvedMethod) {
var method = (IUnresolvedMethod)currentMember;
if (state.CurrentMember is IMethod) {
var method = (IMethod)state.CurrentMember;
foreach (var p in method.TypeParameters) {
wrapper.AddTypeParameter(p);
}
@ -1319,10 +1319,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1319,10 +1319,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
{
var lookup = new MemberLookup(ctx.CurrentTypeDefinition, Compilation.MainAssembly);
if (currentType != null) {
for (var ct = currentType; ct != null; ct = ct.DeclaringTypeDefinition) {
for (var ct = ctx.CurrentTypeDefinition; ct != null; ct = ct.DeclaringTypeDefinition) {
foreach (var nestedType in ct.NestedTypes) {
if (nestedType.IsSynthetic)
continue;
string name = nestedType.Name;
if (IsAttributeContext(node) && name.EndsWith("Attribute") && name.Length > "Attribute".Length) {
name = name.Substring(0, name.Length - "Attribute".Length);
@ -1333,7 +1331,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1333,7 +1331,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
continue;
}
var type = typePred(nestedType.Resolve(ctx));
var type = typePred(nestedType);
if (type != null) {
var a2 = wrapper.AddType(type, name);
if (a2 != null && callback != null) {
@ -1351,8 +1349,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1351,8 +1349,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (member is IMethod && ((IMethod)member).FullName == "System.Object.Finalize") {
continue;
}
if (member.IsSynthetic)
continue;
if (member.EntityType == EntityType.Operator) {
continue;
}
@ -1369,7 +1365,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1369,7 +1365,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
var declaring = def.DeclaringTypeDefinition;
while (declaring != null) {
foreach (var member in declaring.GetMembers (m => m.IsStatic && !m.IsSynthetic)) {
foreach (var member in declaring.GetMembers (m => m.IsStatic)) {
if (memberPred == null || memberPred(member)) {
wrapper.AddMember(member);
}
@ -1378,8 +1374,10 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1378,8 +1374,10 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
}
}
foreach (var p in currentType.TypeParameters) {
wrapper.AddTypeParameter(p);
if (ctx.CurrentTypeDefinition != null) {
foreach (var p in ctx.CurrentTypeDefinition.TypeParameters) {
wrapper.AddTypeParameter(p);
}
}
}
var scope = ctx.CurrentUsingScope;
@ -1916,7 +1914,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1916,7 +1914,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return;
}
foreach (var m in curType.GetMembers ().Reverse ()) {
if (m.IsSynthetic || curType.Kind != TypeKind.Interface && !m.IsOverridable) {
if (curType.Kind != TypeKind.Interface && !m.IsOverridable) {
continue;
}
// filter out the "Finalize" methods, because finalizers should be done with destructors.
@ -1987,7 +1985,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1987,7 +1985,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return result;
}
bool MatchDelegate(IType delegateType, IUnresolvedMethod method)
bool MatchDelegate(IType delegateType, IMethod method)
{
var delegateMethod = delegateType.GetDelegateInvokeMethod();
if (delegateMethod == null || delegateMethod.Parameters.Count != method.Parameters.Count) {
@ -1995,7 +1993,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1995,7 +1993,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
for (int i = 0; i < delegateMethod.Parameters.Count; i++) {
if (!delegateMethod.Parameters [i].Type.Equals(method.Parameters [i].Type.Resolve(ctx))) {
if (!delegateMethod.Parameters [i].Type.Equals(method.Parameters [i].Type)) {
return false;
}
}
@ -2151,8 +2149,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2151,8 +2149,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var nr = (NamespaceResolveResult)resolveResult;
if (!(resolvedNode.Parent is UsingDeclaration || resolvedNode.Parent != null && resolvedNode.Parent.Parent is UsingDeclaration)) {
foreach (var cl in nr.Namespace.Types) {
if (cl.IsSynthetic)
continue;
string name = cl.Name;
if (hintType != null && hintType.Kind != TypeKind.Array && cl.Kind == TypeKind.Interface) {
continue;
@ -2291,8 +2287,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2291,8 +2287,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var namespaceContents = new CompletionDataWrapper(this);
foreach (var cl in nr.Namespace.Types) {
if (cl.IsSynthetic)
continue;
IType addType = typePred != null ? typePred(cl) : cl;
if (addType != null)
namespaceContents.AddType(addType, addType.Name);
@ -2393,8 +2387,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2393,8 +2387,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var filteredList = new List<IMember>();
foreach (var member in type.GetMembers ()) {
if (member.IsSynthetic)
continue;
if (member.EntityType == EntityType.Indexer || member.EntityType == EntityType.Operator || member.EntityType == EntityType.Constructor || member.EntityType == EntityType.Destructor) {
continue;
}
@ -2445,7 +2437,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2445,7 +2437,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
if (resolveResult is TypeResolveResult || includeStaticMembers) {
foreach (var nested in type.GetNestedTypes (t => !t.IsSynthetic)) {
foreach (var nested in type.GetNestedTypes ()) {
if (!lookup.IsAccessible(nested.GetDefinition(), isProtectedAllowed))
continue;
IType addType = typePred != null ? typePred(nested) : nested;

65
ICSharpCode.NRefactory.CSharp/Completion/CompletionDataWrapper.cs

@ -75,31 +75,24 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -75,31 +75,24 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
HashSet<string> usedTypes = new HashSet<string> ();
public ICompletionData AddType(IType type, string shortType)
{
if (type == null || string.IsNullOrEmpty(shortType) || usedTypes.Contains(shortType))
return null;
if (type.Name == "Void" && type.Namespace == "System")
return null;
usedTypes.Add(shortType);
var iCompletionData = Factory.CreateTypeCompletionData(type, shortType);
result.Add(iCompletionData);
return iCompletionData;
}
public ICompletionData AddType(IUnresolvedTypeDefinition type, string shortType)
{
if (type == null || string.IsNullOrEmpty(shortType) || usedTypes.Contains(shortType))
return null;
if (type.Name == "Void" && type.Namespace == "System")
var def = type.GetDefinition ();
if (def != null && def.ParentAssembly != completion.ctx.CurrentAssembly && !def.IsBrowsable ())
return null;
usedTypes.Add(shortType);
var iCompletionData = Factory.CreateTypeCompletionData(type, shortType);
result.Add(iCompletionData);
return iCompletionData;
}
Dictionary<string, List<ICompletionData>> data = new Dictionary<string, List<ICompletionData>> ();
public ICompletionData AddVariable(IVariable variable)
@ -126,59 +119,25 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -126,59 +119,25 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return cd;
}
public void AddTypeParameter (IUnresolvedTypeParameter variable)
public void AddTypeParameter (ITypeParameter variable)
{
if (data.ContainsKey (variable.Name))
return;
data [variable.Name] = new List<ICompletionData> ();
result.Add (Factory.CreateVariableCompletionData (variable));
}
public ICompletionData AddMember (IUnresolvedMember member)
{
var newData = Factory.CreateEntityCompletionData (member);
// newData.HideExtensionParameter = HideExtensionParameter;
string memberKey = newData.DisplayText;
if (memberKey == null)
return null;
if (member is IMember) {
newData.CompletionCategory = GetCompletionCategory (member.DeclaringTypeDefinition.Resolve (completion.ctx));
}
List<ICompletionData> existingData;
data.TryGetValue (memberKey, out existingData);
if (existingData != null) {
var a = member as IEntity;
foreach (var d in existingData) {
if (!(d is IEntityCompletionData))
continue;
var b = ((IEntityCompletionData)d).Entity;
if (a == null || b == null || a.EntityType == b.EntityType) {
d.AddOverload (newData);
return d;
}
}
if (newData != null) {
result.Add (newData);
data [memberKey].Add (newData);
}
} else {
result.Add (newData);
data [memberKey] = new List<ICompletionData> ();
data [memberKey].Add (newData);
}
return newData;
}
public ICompletionData AddMember (IMember member)
{
var newData = Factory.CreateEntityCompletionData (member);
// newData.HideExtensionParameter = HideExtensionParameter;
if (member.ParentAssembly != completion.ctx.CurrentAssembly && !member.IsBrowsable ())
return null;
string memberKey = newData.DisplayText;
if (memberKey == null)
return null;
if (member is IMember) {
newData.CompletionCategory = GetCompletionCategory (member.DeclaringTypeDefinition);
}

7
ICSharpCode.NRefactory.CSharp/Completion/ICompletionDataFactory.cs

@ -32,14 +32,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -32,14 +32,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
{
public interface ICompletionDataFactory
{
ICompletionData CreateEntityCompletionData (IUnresolvedEntity entity);
ICompletionData CreateEntityCompletionData (IUnresolvedEntity entity, string text);
ICompletionData CreateEntityCompletionData (IEntity entity);
ICompletionData CreateEntityCompletionData (IEntity entity, string text);
ICompletionData CreateTypeCompletionData (IType type, string shortType);
ICompletionData CreateTypeCompletionData (IUnresolvedTypeDefinition type, string shortType);
/// <summary>
/// Creates a generic completion data.
/// </summary>
@ -58,7 +55,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -58,7 +55,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
ICompletionData CreateVariableCompletionData (IVariable variable);
ICompletionData CreateVariableCompletionData (IUnresolvedTypeParameter parameter);
ICompletionData CreateVariableCompletionData (ITypeParameter parameter);
ICompletionData CreateEventCreationCompletionData (string varName, IType delegateType, IEvent evt, string parameterDefinition, IUnresolvedMember currentMember, IUnresolvedTypeDefinition currentType);

195
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ImplementInterfaceAction.cs

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
//
//
// ImplementInterfaceAction.cs
//
// Author:
@ -68,7 +68,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -68,7 +68,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
foreach (var member in toImplement) {
if (!nodes.ContainsKey(member.Item1.DeclaringType))
nodes [member.Item1.DeclaringType] = new List<AstNode>();
nodes [member.Item1.DeclaringType].Add(GenerateMemberImplementation(context, member));
nodes [member.Item1.DeclaringType].Add(GenerateMemberImplementation(context, member.Item1, member.Item2));
}
foreach (var kv in nodes) {
@ -89,188 +89,21 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -89,188 +89,21 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
}
}
static AstNode GenerateMemberImplementation(RefactoringContext context, Tuple<IMember, bool> member)
{
switch (member.Item1.EntityType) {
case EntityType.Property:
return GenerateProperty(context, (IProperty)member.Item1, member.Item2);
case EntityType.Indexer:
return GenerateIndexer(context, (IProperty)member.Item1, member.Item2);
case EntityType.Event:
return GenerateEvent(context, (IEvent)member.Item1, member.Item2);
case EntityType.Method:
return GenerateMethod(context, (IMethod)member.Item1, member.Item2);
default:
throw new ArgumentOutOfRangeException();
}
}
static AstNode GenerateEvent(RefactoringContext context, IEvent evt, bool explicitImplementation)
static EntityDeclaration GenerateMemberImplementation(RefactoringContext context, IMember member, bool explicitImplementation)
{
if (!explicitImplementation) {
return new EventDeclaration() {
Modifiers = Modifiers.Public,
Name = evt.Name,
ReturnType = context.CreateShortType (evt.ReturnType)
};
}
return new CustomEventDeclaration() {
Name = evt.Name,
ReturnType = context.CreateShortType (evt.ReturnType),
PrivateImplementationType = context.CreateShortType(evt.DeclaringType),
AddAccessor = new Accessor {
Body = new BlockStatement() {
new ThrowStatement(new ObjectCreateExpression(context.CreateShortType("System", "NotImplementedException")))
}
},
RemoveAccessor = new Accessor {
Body = new BlockStatement() {
new ThrowStatement(new ObjectCreateExpression(context.CreateShortType("System", "NotImplementedException")))
}
}
};
}
static AstNode GenerateProperty(RefactoringContext context, IProperty property, bool explicitImplementation)
{
var result = new PropertyDeclaration() {
Name = property.Name,
ReturnType = context.CreateShortType (property.ReturnType)
};
if (!explicitImplementation) {
result.Modifiers = Modifiers.Public;
} else {
result.PrivateImplementationType = context.CreateShortType(property.DeclaringType);
}
if (property.CanGet) {
if (property.DeclaringType.Kind != TypeKind.Interface) {
result.Getter = new Accessor() {
Body = new BlockStatement () {
new ThrowStatement(new ObjectCreateExpression(context.CreateShortType("System", "NotImplementedException")))
}
};
} else {
result.Getter = new Accessor();
}
}
if (property.CanSet) {
if (property.DeclaringType.Kind != TypeKind.Interface) {
result.Setter = new Accessor() {
Body = new BlockStatement () {
new ThrowStatement(new ObjectCreateExpression(context.CreateShortType("System", "NotImplementedException")))
}
};
} else {
result.Setter = new Accessor();
}
}
return result;
}
static AstNode GenerateIndexer(RefactoringContext context, IProperty indexer, bool explicitImplementation)
{
var result = new IndexerDeclaration() {
ReturnType = context.CreateShortType (indexer.ReturnType)
};
if (!explicitImplementation) {
result.Modifiers = Modifiers.Public;
var builder = context.CreateTypeSytemAstBuilder();
builder.GenerateBody = true;
builder.ShowConstantValues = !explicitImplementation;
builder.ShowTypeParameterConstraints = !explicitImplementation;
builder.UseCustomEvents = explicitImplementation;
var decl = builder.ConvertEntity(member);
if (explicitImplementation) {
decl.Modifiers = Modifiers.None;
decl.AddChild(builder.ConvertType(member.DeclaringType), EntityDeclaration.PrivateImplementationTypeRole);
} else {
result.PrivateImplementationType = context.CreateShortType(indexer.DeclaringType);
decl.Modifiers = Modifiers.Public;
}
foreach (var p in indexer.Parameters) {
ParameterModifier modifier;
if (p.IsOut) {
modifier = ParameterModifier.Out;
} else if (p.IsRef) {
modifier = ParameterModifier.Ref;
} else if (p.IsParams) {
modifier = ParameterModifier.Params;
} else {
modifier = ParameterModifier.None;
}
result.Parameters.Add(new ParameterDeclaration(context.CreateShortType(p.Type), p.Name, modifier));
}
if (indexer.CanGet) {
result.Getter = new Accessor() {
Body = new BlockStatement () {
new ThrowStatement(new ObjectCreateExpression(context.CreateShortType("System", "NotImplementedException")))
}
};
}
if (indexer.CanSet) {
result.Setter = new Accessor() {
Body = new BlockStatement () {
new ThrowStatement(new ObjectCreateExpression(context.CreateShortType("System", "NotImplementedException")))
}
};
}
return result;
}
static AstNode GenerateMethod(RefactoringContext context, IMethod method, bool explicitImplementation)
{
var result = new MethodDeclaration() {
Name = method.Name,
ReturnType = context.CreateShortType (method.ReturnType),
Body = new BlockStatement() {
new ThrowStatement(new ObjectCreateExpression(context.CreateShortType("System", "NotImplementedException")))
}
};
if (!explicitImplementation) {
result.Modifiers = Modifiers.Public;
} else {
result.PrivateImplementationType = context.CreateShortType(method.DeclaringType);
}
foreach (var typeParam in method.TypeParameters) {
result.TypeParameters.Add(new TypeParameterDeclaration(typeParam.Name));
var constraint = new Constraint() {
TypeParameter = new SimpleType(typeParam.Name)
};
if (typeParam.HasDefaultConstructorConstraint) {
constraint.BaseTypes.Add(new PrimitiveType("new"));
} else if (typeParam.HasReferenceTypeConstraint) {
constraint.BaseTypes.Add(new PrimitiveType("class"));
} else if (typeParam.HasValueTypeConstraint) {
constraint.BaseTypes.Add(new PrimitiveType("struct"));
}
foreach (var type in typeParam.DirectBaseTypes) {
if (type.FullName == "System.Object")
continue;
if (type.FullName == "System.ValueType")
continue;
constraint.BaseTypes.Add(context.CreateShortType(type));
}
if (constraint.BaseTypes.Count == 0)
continue;
result.Constraints.Add(constraint);
}
foreach (var p in method.Parameters) {
ParameterModifier modifier;
if (p.IsOut) {
modifier = ParameterModifier.Out;
} else if (p.IsRef) {
modifier = ParameterModifier.Ref;
} else if (p.IsParams) {
modifier = ParameterModifier.Params;
} else {
modifier = ParameterModifier.None;
}
result.Parameters.Add(new ParameterDeclaration(context.CreateShortType(p.Type), p.Name, modifier));
}
return result;
return decl;
}
public static List<Tuple<IMember, bool>> CollectMembersToImplement(ITypeDefinition implementingType, IType interfaceType, bool explicitly)

23
ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs

@ -44,24 +44,23 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -44,24 +44,23 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
}
public abstract TextLocation Location { get; }
public virtual AstType CreateShortType (IType fullType)
public TypeSystemAstBuilder CreateTypeSytemAstBuilder()
{
var csResolver = Resolver.GetResolverStateBefore(GetNode());
var builder = new TypeSystemAstBuilder(csResolver);
return new TypeSystemAstBuilder(csResolver);
}
public virtual AstType CreateShortType (IType fullType)
{
var builder = CreateTypeSytemAstBuilder();
return builder.ConvertType(fullType);
}
public AstType CreateShortType(string ns, string name, int typeParameterCount = 0)
public virtual AstType CreateShortType(string ns, string name, int typeParameterCount = 0)
{
foreach (var asm in Compilation.Assemblies) {
var def = asm.GetTypeDefinition(ns, name, typeParameterCount);
if (def != null) {
return CreateShortType(def);
}
}
return new MemberType(new SimpleType(ns), name);
var builder = CreateTypeSytemAstBuilder();
return builder.ConvertType(ns, name, typeParameterCount);
}
public virtual IEnumerable<AstNode> GetSelectedNodes()

68
ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs

@ -111,6 +111,18 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -111,6 +111,18 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
/// The default value is <c>false</c>.
/// </summary>
public bool AlwaysUseShortTypeNames { get; set; }
/// <summary>
/// Controls whether to generate a body that throws a <c>System.NotImplementedException</c>.
/// The default value is <c>false</c>.
/// </summary>
public bool GenerateBody { get; set; }
/// <summary>
/// Controls whether to generate custom events.
/// The default value is <c>false</c>.
/// </summary>
public bool UseCustomEvents { get; set; }
#endregion
#region Convert Type
@ -124,6 +136,19 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -124,6 +136,19 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
return astType;
}
public AstType ConvertType(string ns, string name, int typeParameterCount = 0)
{
if (resolver != null) {
foreach (var asm in resolver.Compilation.Assemblies) {
var def = asm.GetTypeDefinition(ns, name, typeParameterCount);
if (def != null) {
return ConvertType(def);
}
}
}
return new MemberType(new SimpleType(ns), name);
}
AstType ConvertTypeHelper(IType type)
{
TypeWithElementType typeWithElementType = type as TypeWithElementType;
@ -557,12 +582,24 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -557,12 +582,24 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
return decl;
}
BlockStatement GenerateBodyBlock()
{
if (GenerateBody) {
return new BlockStatement {
new ThrowStatement(new ObjectCreateExpression(ConvertType("System", "NotImplementedException")))
};
} else {
return BlockStatement.Null;
}
}
Accessor ConvertAccessor(IMethod accessor)
{
if (accessor == null)
return Accessor.Null;
Accessor decl = new Accessor();
decl.Modifiers = ModifierFromAccessibility(accessor.Accessibility);
decl.Body = GenerateBodyBlock();
return decl;
}
@ -590,13 +627,23 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -590,13 +627,23 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
return decl;
}
EventDeclaration ConvertEvent(IEvent ev)
EntityDeclaration ConvertEvent(IEvent ev)
{
EventDeclaration decl = new EventDeclaration();
decl.Modifiers = GetMemberModifiers(ev);
decl.ReturnType = ConvertType(ev.ReturnType);
decl.Variables.Add(new VariableInitializer(ev.Name));
return decl;
if (this.UseCustomEvents) {
CustomEventDeclaration decl = new CustomEventDeclaration();
decl.Modifiers = GetMemberModifiers(ev);
decl.ReturnType = ConvertType(ev.ReturnType);
decl.Name = ev.Name;
decl.AddAccessor = ConvertAccessor(ev.AddAccessor);
decl.RemoveAccessor = ConvertAccessor(ev.RemoveAccessor);
return decl;
} else {
EventDeclaration decl = new EventDeclaration();
decl.Modifiers = GetMemberModifiers(ev);
decl.ReturnType = ConvertType(ev.ReturnType);
decl.Variables.Add(new VariableInitializer(ev.Name));
return decl;
}
}
MethodDeclaration ConvertMethod(IMethod method)
@ -625,6 +672,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -625,6 +672,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
decl.Constraints.Add(constraint);
}
}
decl.Body = GenerateBodyBlock();
return decl;
}
@ -641,6 +689,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -641,6 +689,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
foreach (IParameter p in op.Parameters) {
decl.Parameters.Add(ConvertParameter(p));
}
decl.Body = GenerateBodyBlock();
return decl;
}
@ -652,6 +701,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -652,6 +701,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
foreach (IParameter p in ctor.Parameters) {
decl.Parameters.Add(ConvertParameter(p));
}
decl.Body = GenerateBodyBlock();
return decl;
}
@ -659,6 +709,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -659,6 +709,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
{
DestructorDeclaration decl = new DestructorDeclaration();
decl.Name = dtor.DeclaringTypeDefinition.Name;
decl.Body = GenerateBodyBlock();
return decl;
}
#endregion
@ -687,12 +738,13 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -687,12 +738,13 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
Modifiers GetMemberModifiers(IMember member)
{
Modifiers m = ModifierFromAccessibility(member.Accessibility);
bool isInterfaceMember = member.DeclaringType.Kind == TypeKind.Interface;
Modifiers m = isInterfaceMember ? Modifiers.None : ModifierFromAccessibility(member.Accessibility);
if (this.ShowModifiers) {
if (member.IsStatic) {
m |= Modifiers.Static;
} else {
if (member.IsAbstract)
if (member.IsAbstract && !isInterfaceMember)
m |= Modifiers.Abstract;
if (member.IsOverride)
m |= Modifiers.Override;

148
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/BrowsableAttributeTests.cs

@ -0,0 +1,148 @@ @@ -0,0 +1,148 @@
//
// BrowsableAttributeTests.cs
//
// Author:
// Mike Krüger <mkrueger@xamarin.com>
//
// Copyright (c) 2012 Xamarin Inc. (http://xamarin.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 NUnit.Framework;
using System.Diagnostics;
namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
{
[TestFixture]
public class BrowsableAttributeTests : TestBase
{
[Test()]
public void TestEditorBrowsableAttributeClasses ()
{
int cp;
var engine1 = CodeCompletionBugTests.CreateEngine (
@"
using System;
using System.ComponentModel;
[EditorBrowsable(EditorBrowsableState.Always)]
public class BrowsableTest {}
[EditorBrowsable(EditorBrowsableState.Never)]
public class NotBrowsableTest {}
", out cp);
CompletionDataList provider = CodeCompletionBugTests.CreateProvider (
@"class Test
{
void Test ()
{
$B$
}
}", false, engine1.ctx.CurrentAssembly.UnresolvedAssembly);
Assert.IsNotNull (provider, "provider == null");
Assert.IsNotNull (provider.Find ("BrowsableTest"), "'BrowsableTest' not found.");
Assert.IsNull (provider.Find ("NotBrowsableTest"), "'NotBrowsableTest' found.");
}
[Test()]
public void TestEditorBrowsableAttributeClassesSameAssembly ()
{
CompletionDataList provider = CodeCompletionBugTests.CreateProvider (
@"
using System;
using System.ComponentModel;
[EditorBrowsable(EditorBrowsableState.Always)]
public class BrowsableTest {}
[EditorBrowsable(EditorBrowsableState.Never)]
public class NotBrowsableTest {}
class Test
{
void Test ()
{
$B$
}
}");
Assert.IsNotNull (provider, "provider == null");
Assert.IsNotNull (provider.Find ("BrowsableTest"), "'BrowsableTest' not found.");
Assert.IsNotNull (provider.Find ("NotBrowsableTest"), "'NotBrowsableTest' not found.");
}
[Test()]
public void TestEditorBrowsableAttributeMembers ()
{
int cp;
var engine1 = CodeCompletionBugTests.CreateEngine (
@"
using System;
using System.ComponentModel;
public class FooBar
{
[EditorBrowsable(EditorBrowsableState.Always)]
public int BrowsableTest { get; set; }
[EditorBrowsable(EditorBrowsableState.Never)]
public int NotBrowsableTest { get; set; }
}
", out cp);
CompletionDataList provider = CodeCompletionBugTests.CreateProvider (
@"class Test : FooBar
{
void Test ()
{
$B$
}
}", false, engine1.ctx.CurrentAssembly.UnresolvedAssembly);
Assert.IsNotNull (provider, "provider == null");
Assert.IsNotNull (provider.Find ("BrowsableTest"), "'BrowsableTest' not found.");
Assert.IsNull (provider.Find ("NotBrowsableTest"), "'NotBrowsableTest' found.");
}
[Test()]
public void TestEditorBrowsableAttributeMembersSameAssembly ()
{
CompletionDataList provider = CodeCompletionBugTests.CreateProvider (
@"
using System;
using System.ComponentModel;
class Test
{
[EditorBrowsable(EditorBrowsableState.Always)]
int BrowsableTest { get; set; }
[EditorBrowsable(EditorBrowsableState.Never)]
int NotBrowsableTest { get; set; }
void Test ()
{
$B$
}
}");
Assert.IsNotNull (provider, "provider == null");
Assert.IsNotNull (provider.Find ("BrowsableTest"), "'BrowsableTest' not found.");
Assert.IsNotNull (provider.Find ("NotBrowsableTest"), "'NotBrowsableTest' not found.");
}
}
}

78
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs

@ -136,15 +136,6 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -136,15 +136,6 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
return new CompletionData (entity.Name);
}
public ICompletionData CreateEntityCompletionData (ICSharpCode.NRefactory.TypeSystem.IUnresolvedEntity entity, string text)
{
return new CompletionData (text);
}
public ICompletionData CreateTypeCompletionData (ICSharpCode.NRefactory.TypeSystem.IUnresolvedTypeDefinition type, string shortType)
{
return new CompletionData (shortType);
}
public ICompletionData CreateTypeCompletionData (ICSharpCode.NRefactory.TypeSystem.IType type, string shortType)
{
@ -166,7 +157,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -166,7 +157,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
return new CompletionData (variable.Name);
}
public ICompletionData CreateVariableCompletionData (ICSharpCode.NRefactory.TypeSystem.IUnresolvedTypeParameter parameter)
public ICompletionData CreateVariableCompletionData (ICSharpCode.NRefactory.TypeSystem.ITypeParameter parameter)
{
return new CompletionData (parameter.Name);
}
@ -199,52 +190,71 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -199,52 +190,71 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
#endregion
}
static CompletionDataList CreateProvider(string text, bool isCtrlSpace)
public static IUnresolvedAssembly SystemAssembly { get { return systemAssembly.Value; } }
static readonly Lazy<IUnresolvedAssembly> systemAssembly = new Lazy<IUnresolvedAssembly>(
delegate {
return new CecilLoader().LoadAssemblyFile(typeof(System.ComponentModel.BrowsableAttribute).Assembly.Location);
});
public static CSharpCompletionEngine CreateEngine(string text, out int cursorPosition, params IUnresolvedAssembly[] references)
{
string parsedText;
string editorText;
int cursorPosition = text.IndexOf('$');
cursorPosition = text.IndexOf('$');
int endPos = text.IndexOf('$', cursorPosition + 1);
if (endPos == -1) {
parsedText = editorText = text.Substring(0, cursorPosition) + text.Substring(cursorPosition + 1);
if (cursorPosition < 0) {
parsedText = editorText = text;
} else {
parsedText = editorText = text.Substring(0, cursorPosition) + text.Substring(cursorPosition + 1);
}
} else {
parsedText = text.Substring(0, cursorPosition) + new string(' ', endPos - cursorPosition) + text.Substring(endPos + 1);
editorText = text.Substring(0, cursorPosition) + text.Substring(cursorPosition + 1, endPos - cursorPosition - 1) + text.Substring(endPos + 1);
cursorPosition = endPos - 1;
parsedText = text.Substring(0, cursorPosition) + new string(' ', endPos - cursorPosition) + text.Substring(endPos + 1);
editorText = text.Substring(0, cursorPosition) + text.Substring(cursorPosition + 1, endPos - cursorPosition - 1) + text.Substring(endPos + 1);
cursorPosition = endPos - 1;
}
var doc = new ReadOnlyDocument(editorText);
IProjectContent pctx = new CSharpProjectContent();
pctx = pctx.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore });
var refs = new List<IUnresolvedAssembly> { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore, SystemAssembly };
if (references != null)
refs.AddRange (references);
pctx = pctx.AddAssemblyReferences(refs);
var compilationUnit = new CSharpParser().Parse(parsedText, "program.cs");
compilationUnit.Freeze();
var parsedFile = compilationUnit.ToTypeSystem();
pctx = pctx.UpdateProjectContent(null, parsedFile);
var cmp = pctx.CreateCompilation();
var loc = doc.GetLocation(cursorPosition);
var loc = cursorPosition > 0 ? doc.GetLocation(cursorPosition) : new TextLocation (1, 1);
var rctx = new CSharpTypeResolveContext(cmp.MainAssembly);
rctx = rctx.WithUsingScope(parsedFile.GetUsingScope(loc).Resolve(cmp));
var curDef = parsedFile.GetInnermostTypeDefinition(loc);
if (curDef != null) {
var resolvedDef = curDef.Resolve(rctx).GetDefinition();
rctx = rctx.WithCurrentTypeDefinition(resolvedDef);
var curMember = resolvedDef.Members.FirstOrDefault(m => m.Region.Begin <= loc && loc < m.BodyRegion.End);
if (curMember != null) {
rctx = rctx.WithCurrentMember(curMember);
}
var resolvedDef = curDef.Resolve(rctx).GetDefinition();
rctx = rctx.WithCurrentTypeDefinition(resolvedDef);
var curMember = resolvedDef.Members.FirstOrDefault(m => m.Region.Begin <= loc && loc < m.BodyRegion.End);
if (curMember != null) {
rctx = rctx.WithCurrentMember(curMember);
}
}
var mb = new DefaultCompletionContextProvider(doc, parsedFile);
var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, rctx);
var engine = new CSharpCompletionEngine(doc, mb, new TestFactory(), pctx, rctx);
engine.EolMarker = Environment.NewLine;
engine.FormattingPolicy = FormattingOptionsFactory.CreateMono ();
engine.FormattingPolicy = FormattingOptionsFactory.CreateMono();
return engine;
}
public static CompletionDataList CreateProvider(string text, bool isCtrlSpace, params IUnresolvedAssembly[] references)
{
int cursorPosition;
var engine = CreateEngine(text, out cursorPosition, references);
var data = engine.GetCompletionData (cursorPosition, isCtrlSpace);
return new CompletionDataList () {

1
ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj

@ -315,6 +315,7 @@ @@ -315,6 +315,7 @@
<Compile Include="CSharp\CodeActions\ImplementAbstractMembersTest.cs" />
<Compile Include="CSharp\CodeActions\ExtractFieldTests.cs" />
<Compile Include="CSharp\CodeCompletion\DocumentationContextTests.cs" />
<Compile Include="CSharp\CodeCompletion\BrowsableAttributeTests.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Mono.Cecil\Mono.Cecil.csproj">

8
ICSharpCode.NRefactory.Tests/TypeSystem/CecilLoaderTests.cs

@ -35,12 +35,12 @@ namespace ICSharpCode.NRefactory.TypeSystem @@ -35,12 +35,12 @@ namespace ICSharpCode.NRefactory.TypeSystem
static readonly Lazy<IUnresolvedAssembly> systemCore = new Lazy<IUnresolvedAssembly>(
delegate {
return new CecilLoader().LoadAssemblyFile(typeof(System.Linq.Enumerable).Assembly.Location);
});
return new CecilLoader().LoadAssemblyFile(typeof(System.Linq.Enumerable).Assembly.Location);
});
public static IUnresolvedAssembly Mscorlib { get { return mscorlib.Value; } }
public static IUnresolvedAssembly SystemCore { get { return systemCore.Value; } }
[TestFixtureSetUp]
public void FixtureSetUp()
{

73
ICSharpCode.NRefactory/Completion/CompletionExtensionMethods.cs

@ -0,0 +1,73 @@ @@ -0,0 +1,73 @@
//
// CompletionExtensionMethods.cs
//
// Author:
// Mike Krüger <mkrueger@xamarin.com>
//
// Copyright (c) 2012 Xamarin Inc. (http://xamarin.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 ICSharpCode.NRefactory.TypeSystem;
using System.Linq;
namespace ICSharpCode.NRefactory.Completion
{
public static class CompletionExtensionMethods
{
/// <summary>
/// Gets the EditorBrowsableState of an entity.
/// </summary>
/// <returns>
/// The editor browsable state.
/// </returns>
/// <param name='entity'>
/// Entity.
/// </param>
public static System.ComponentModel.EditorBrowsableState GetEditorBrowsableState(this IEntity entity)
{
if (entity == null)
throw new ArgumentNullException ("entity");
var browsableState = entity.Attributes.FirstOrDefault(attr => attr.AttributeType.Name == "EditorBrowsableAttribute" && attr.AttributeType.Namespace == "System.ComponentModel");
if (browsableState != null && browsableState.PositionalArguments.Count == 1) {
try {
return (System.ComponentModel.EditorBrowsableState)browsableState.PositionalArguments [0].ConstantValue;
} catch (Exception) {}
}
return System.ComponentModel.EditorBrowsableState.Always;
}
/// <summary>
/// Determines if an entity should be shown in the code completion window. This is the same as:
/// <c>GetEditorBrowsableState (entity) != System.ComponentModel.EditorBrowsableState.Never</c>
/// </summary>
/// <returns>
/// <c>true</c> if the entity should be shown; otherwise, <c>false</c>.
/// </returns>
/// <param name='entity'>
/// The entity.
/// </param>
public static bool IsBrowsable(this IEntity entity)
{
return GetEditorBrowsableState (entity) != System.ComponentModel.EditorBrowsableState.Never;
}
}
}

10
ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj

@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<RunCodeAnalysis>False</RunCodeAnalysis>
<CodeAnalysisRules>-Microsoft.Design#CA1000;-Microsoft.Design#CA1004;-Microsoft.Design#CA1005;-Microsoft.Design#CA1006;-Microsoft.Design#CA1026;-Microsoft.Design#CA1033;-Microsoft.Design#CA1051;-Microsoft.Design#CA1063;-Microsoft.Naming#CA1702;-Microsoft.Naming#CA1704;-Microsoft.Naming#CA1710;-Microsoft.Naming#CA1716;-Microsoft.Naming#CA1720;-Microsoft.Performance#CA1800;-Microsoft.Security#CA2104</CodeAnalysisRules>
<SignAssembly>true</SignAssembly>
<SignAssembly>True</SignAssembly>
<AssemblyOriginatorKeyFile>..\ICSharpCode.NRefactory.snk</AssemblyOriginatorKeyFile>
<DelaySign>False</DelaySign>
<AssemblyOriginatorKeyMode>File</AssemblyOriginatorKeyMode>
@ -44,12 +44,11 @@ @@ -44,12 +44,11 @@
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugType>Full</DebugType>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<DebugSymbols>True</DebugSymbols>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>PdbOnly</DebugType>
<DebugSymbols>false</DebugSymbols>
<DebugType>none</DebugType>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
@ -233,6 +232,7 @@ @@ -233,6 +232,7 @@
<Compile Include="Completion\IVariableCompletionData.cs" />
<Compile Include="Documentation\IdStringProvider.cs" />
<Compile Include="Documentation\IdStringMemberReference.cs" />
<Compile Include="Completion\CompletionExtensionMethods.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="Completion\" />

Loading…
Cancel
Save