diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 02b70bafc7..07d30e84ac 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -117,7 +117,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var nonWsResult = MagicKeyCompletion( document.GetCharAt(offset), controlSpace - ); + ); if (nonWsResult != null) { var text = new HashSet(result.Select(r => r.CompletionText)); result = result.Concat(nonWsResult.Where(r => !text.Contains(r.CompletionText))); @@ -210,7 +210,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion resolveResult.Item1, expr.Node, resolveResult.Item2 - ); + ); } @@ -219,7 +219,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion resolveResult.Item1, expr.Node, resolveResult.Item2 - ); + ); } bool IsInPreprocessorDirective() @@ -262,7 +262,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return contextList.Result; } - foreach (var m in initializerResult.Item1.Type.GetMembers (m => m.IsPublic && (m.EntityType == EntityType.Property || m.EntityType == EntityType.Field))) { + foreach (var m in initializerResult.Item1.Type.GetMembers (m => !m.IsSynthetic && m.IsPublic && (m.EntityType == EntityType.Property || m.EntityType == EntityType.Field))) { contextList.AddMember(m); } @@ -292,7 +292,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion { Tuple resolveResult; switch (completionChar) { - // Magic key completion + // Magic key completion case ':': case '.': if (IsInsideCommentStringOrDirective()) { @@ -303,7 +303,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (!IsInPreprocessorDirective()) return null; return GetDirectiveCompletionData(); - // XML doc completion + // XML doc completion case '<': if (IsInsideDocComment()) { return GetXmlDocumentationCompletionData(); @@ -314,7 +314,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; case '>': if (!IsInsideDocComment()) { - if (offset > 2 && document.GetCharAt (offset - 2) == '-' && !IsInsideCommentStringOrDirective()) { + if (offset > 2 && document.GetCharAt(offset - 2) == '-' && !IsInsideCommentStringOrDirective()) { return HandleMemberReferenceCompletion(GetExpressionBeforeCursor()); } return null; @@ -329,23 +329,23 @@ namespace ICSharpCode.NRefactory.CSharp.Completion break; } } - + if (startIndex >= 0) { int endIndex = startIndex; while (endIndex <= location.Column && endIndex < lineText.Length && !Char.IsWhiteSpace (lineText [endIndex])) { endIndex++; } string tag = endIndex - startIndex - 1 > 0 ? lineText.Substring( - startIndex + 1, - endIndex - startIndex - 2 + startIndex + 1, + endIndex - startIndex - 2 ) : null; if (!string.IsNullOrEmpty(tag) && commentTags.IndexOf(tag) >= 0) { document.Insert(offset, "", AnchorMovementType.BeforeInsertion); } } return null; - - // Parameter completion + + // Parameter completion case '(': if (IsInsideCommentStringOrDirective()) { return null; @@ -366,15 +366,15 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var methodGroup = invocationResult.Item1 as MethodGroupResolveResult; if (methodGroup != null) { return CreateParameterCompletion( - methodGroup, - invocationResult.Item2, - invoke.Node, - invoke.Unit, - 0, - controlSpace - ); + methodGroup, + invocationResult.Item2, + invoke.Node, + invoke.Unit, + 0, + controlSpace + ); } - + if (controlSpace) { return DefaultControlSpaceItems(invoke); } @@ -386,12 +386,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (!GetParameterCompletionCommandOffset(out cpos2)) { return null; } - // completionContext = CompletionWidget.CreateCodeCompletionContext (cpos2); - // int currentParameter2 = MethodParameterDataProvider.GetCurrentParameterIndex (CompletionWidget, completionContext) - 1; - // return CreateParameterCompletion (CreateResolver (), location, ExpressionContext.MethodBody, provider.Methods, currentParameter); + // completionContext = CompletionWidget.CreateCodeCompletionContext (cpos2); + // int currentParameter2 = MethodParameterDataProvider.GetCurrentParameterIndex (CompletionWidget, completionContext) - 1; + // return CreateParameterCompletion (CreateResolver (), location, ExpressionContext.MethodBody, provider.Methods, currentParameter); break; - - // Completion on space: + + // Completion on space: case ' ': int tokenIndex = offset; string token = GetPreviousToken(ref tokenIndex, false); @@ -400,34 +400,34 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return HandleKeywordCompletion(tokenIndex, token); return null; } - // check propose name, for context (but only in control space context) - //IType isAsType = null; + // check propose name, for context (but only in control space context) + //IType isAsType = null; var isAsExpression = GetExpressionAt(offset); if (controlSpace && isAsExpression != null && isAsExpression.Node is VariableDeclarationStatement && token != "new") { var parent = isAsExpression.Node as VariableDeclarationStatement; var proposeNameList = new CompletionDataWrapper(this); if (parent.Variables.Count != 1) return DefaultControlSpaceItems(isAsExpression, controlSpace); - + foreach (var possibleName in GenerateNameProposals (parent.Type)) { if (possibleName.Length > 0) { proposeNameList.Result.Add(factory.CreateLiteralCompletionData(possibleName.ToString())); } } - + AutoSelect = false; AutoCompleteEmptyMatch = false; return proposeNameList.Result; } - // int tokenIndex = offset; - // string token = GetPreviousToken (ref tokenIndex, false); - // if (result.ExpressionContext == ExpressionContext.ObjectInitializer) { - // resolver = CreateResolver (); - // ExpressionContext exactContext = new NewCSharpExpressionFinder (dom).FindExactContextForObjectInitializer (document, resolver.Unit, Document.FileName, resolver.CallingType); - // IReturnType objectInitializer = ((ExpressionContext.TypeExpressionContext)exactContext).UnresolvedType; - // if (objectInitializer != null && objectInitializer.ArrayDimensions == 0 && objectInitializer.PointerNestingLevel == 0 && (token == "{" || token == ",")) - // return CreateCtrlSpaceCompletionData (completionContext, result); - // } + // int tokenIndex = offset; + // string token = GetPreviousToken (ref tokenIndex, false); + // if (result.ExpressionContext == ExpressionContext.ObjectInitializer) { + // resolver = CreateResolver (); + // ExpressionContext exactContext = new NewCSharpExpressionFinder (dom).FindExactContextForObjectInitializer (document, resolver.Unit, Document.FileName, resolver.CallingType); + // IReturnType objectInitializer = ((ExpressionContext.TypeExpressionContext)exactContext).UnresolvedType; + // if (objectInitializer != null && objectInitializer.ArrayDimensions == 0 && objectInitializer.PointerNestingLevel == 0 && (token == "{" || token == ",")) + // return CreateCtrlSpaceCompletionData (completionContext, result); + // } if (token == "=") { int j = tokenIndex; string prevToken = GetPreviousToken(ref j, false); @@ -458,12 +458,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion methodGroup = invocationResult.Item1 as MethodGroupResolveResult; if (methodGroup != null) { return CreateParameterCompletion( - methodGroup, - invocationResult.Item2, - invoke.Node, - invoke.Unit, - currentParameter, - controlSpace); + methodGroup, + invocationResult.Item2, + invoke.Node, + invoke.Unit, + currentParameter, + controlSpace); } return null; case "=": @@ -473,62 +473,62 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (expressionOrVariableDeclaration == null) { return null; } - + resolveResult = ResolveExpression(expressionOrVariableDeclaration); - + if (resolveResult == null) { return null; } if (resolveResult.Item1.Type.Kind == TypeKind.Enum) { var wrapper = new CompletionDataWrapper(this); AddContextCompletion( - wrapper, - resolveResult.Item2, - expressionOrVariableDeclaration.Node); + wrapper, + resolveResult.Item2, + expressionOrVariableDeclaration.Node); AddEnumMembers(wrapper, resolveResult.Item1.Type, resolveResult.Item2); AutoCompleteEmptyMatch = false; return wrapper.Result; } - // - // if (resolvedType.FullName == DomReturnType.Bool.FullName) { - // CompletionDataList completionList = new ProjectDomCompletionDataList (); - // CompletionDataCollector cdc = new CompletionDataCollector (this, dom, completionList, Document.CompilationUnit, resolver.CallingType, location); - // completionList.AutoCompleteEmptyMatch = false; - // cdc.Add ("true", "md-keyword"); - // cdc.Add ("false", "md-keyword"); - // resolver.AddAccessibleCodeCompletionData (result.ExpressionContext, cdc); - // return completionList; - // } - // if (resolvedType.ClassType == ClassType.Delegate && token == "=") { - // CompletionDataList completionList = new ProjectDomCompletionDataList (); - // string parameterDefinition = AddDelegateHandlers (completionList, resolvedType); - // string varName = GetPreviousMemberReferenceExpression (tokenIndex); - // completionList.Add (new EventCreationCompletionData (document, varName, resolvedType, null, parameterDefinition, resolver.CallingMember, resolvedType)); - // - // CompletionDataCollector cdc = new CompletionDataCollector (this, dom, completionList, Document.CompilationUnit, resolver.CallingType, location); - // resolver.AddAccessibleCodeCompletionData (result.ExpressionContext, cdc); - // foreach (var data in completionList) { - // if (data is MemberCompletionData) - // ((MemberCompletionData)data).IsDelegateExpected = true; - // } - // return completionList; - // } + // + // if (resolvedType.FullName == DomReturnType.Bool.FullName) { + // CompletionDataList completionList = new ProjectDomCompletionDataList (); + // CompletionDataCollector cdc = new CompletionDataCollector (this, dom, completionList, Document.CompilationUnit, resolver.CallingType, location); + // completionList.AutoCompleteEmptyMatch = false; + // cdc.Add ("true", "md-keyword"); + // cdc.Add ("false", "md-keyword"); + // resolver.AddAccessibleCodeCompletionData (result.ExpressionContext, cdc); + // return completionList; + // } + // if (resolvedType.ClassType == ClassType.Delegate && token == "=") { + // CompletionDataList completionList = new ProjectDomCompletionDataList (); + // string parameterDefinition = AddDelegateHandlers (completionList, resolvedType); + // string varName = GetPreviousMemberReferenceExpression (tokenIndex); + // completionList.Add (new EventCreationCompletionData (document, varName, resolvedType, null, parameterDefinition, resolver.CallingMember, resolvedType)); + // + // CompletionDataCollector cdc = new CompletionDataCollector (this, dom, completionList, Document.CompilationUnit, resolver.CallingType, location); + // resolver.AddAccessibleCodeCompletionData (result.ExpressionContext, cdc); + // foreach (var data in completionList) { + // if (data is MemberCompletionData) + // ((MemberCompletionData)data).IsDelegateExpected = true; + // } + // return completionList; + // } return null; case "+=": case "-=": GetPreviousToken(ref tokenIndex, false); - + expressionOrVariableDeclaration = GetExpressionAt(tokenIndex); if (expressionOrVariableDeclaration == null) { return null; } - + resolveResult = ResolveExpression(expressionOrVariableDeclaration); if (resolveResult == null) { return null; } - - + + var mrr = resolveResult.Item1 as MemberResolveResult; if (mrr != null) { var evt = mrr.Member as IEvent; @@ -539,7 +539,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (delegateType.Kind != TypeKind.Delegate) { return null; } - + var wrapper = new CompletionDataWrapper(this); if (currentType != null) { // bool includeProtected = DomType.IncludeProtected (dom, typeFromDatabase, resolver.CallingType); @@ -552,21 +552,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (token == "+=") { string parameterDefinition = AddDelegateHandlers( - wrapper, - delegateType - ); + wrapper, + delegateType + ); string varName = GetPreviousMemberReferenceExpression(tokenIndex); wrapper.Result.Add( - factory.CreateEventCreationCompletionData( - varName, - delegateType, - evt, - parameterDefinition, - currentMember, - currentType) - ); + factory.CreateEventCreationCompletionData( + varName, + delegateType, + evt, + parameterDefinition, + currentMember, + currentType) + ); } - + return wrapper.Result; } return null; @@ -577,24 +577,24 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (token == "enum") return HandleEnumContext(); var wrapper = new CompletionDataWrapper(this); - + AddTypesAndNamespaces( - wrapper, - GetState(), - null, - t => currentType != null && !currentType.ReflectionName.Equals(t.ReflectionName) ? t : null - ); + wrapper, + GetState(), + null, + t => currentType != null && !currentType.ReflectionName.Equals(t.ReflectionName) ? t : null + ); return wrapper.Result; } return null; } - + var keywordCompletion = HandleKeywordCompletion(tokenIndex, token); if (keywordCompletion == null && controlSpace) { goto default; } return keywordCompletion; - // Automatic completion + // Automatic completion default: if (IsInsideCommentStringOrDirective()) { return null; @@ -610,7 +610,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion token = GetPreviousToken(ref tokenIndex, false); } // token last typed - + if (linqKeywords.Contains(token)) { if (token == "from") { // after from no auto code completion. @@ -631,16 +631,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (identifierStart.Node is TypeParameterDeclaration) { return null; } - + if (identifierStart.Node is MemberReferenceExpression) { return HandleMemberReferenceCompletion( - new ExpressionResult( - ((MemberReferenceExpression)identifierStart.Node).Target, - identifierStart.Unit - ) - ); + new ExpressionResult( + ((MemberReferenceExpression)identifierStart.Node).Target, + identifierStart.Unit + ) + ); } - + if (identifierStart.Node is Identifier) { // May happen in variable names return controlSpace ? DefaultControlSpaceItems(identifierStart) : null; @@ -648,7 +648,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (identifierStart.Node is VariableInitializer && location <= ((VariableInitializer)identifierStart.Node).NameToken.EndLocation) { return controlSpace ? HandleAccessorContext() ?? DefaultControlSpaceItems(identifierStart) : null; } - + if (identifierStart.Node is CatchClause) { if (((CatchClause)identifierStart.Node).VariableNameToken.Contains(location)) { return null; @@ -659,7 +659,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (!(char.IsLetter(completionChar) || completionChar == '_') && (!controlSpace || identifierStart == null || !(identifierStart.Node.Parent is ArrayInitializerExpression))) { return controlSpace ? HandleAccessorContext() ?? DefaultControlSpaceItems(identifierStart) : null; } - + char prevCh = offset > 2 ? document.GetCharAt(offset - 2) : ';'; char nextCh = offset < document.TextLength ? document.GetCharAt(offset) : ' '; const string allowedChars = ";,.[](){}+-*/%^?:&|~!<>="; @@ -669,8 +669,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (!(Char.IsWhiteSpace(prevCh) || allowedChars.IndexOf(prevCh) >= 0)) { return null; } - - // Do not pop up completion on identifier identifier (should be handled by keyword completion). + + // Do not pop up completion on identifier identifier (should be handled by keyword completion). tokenIndex = offset - 1; token = GetPreviousToken(ref tokenIndex, false); if (token == "class" || token == "interface" || token == "struct" || token == "enum" || token == "namespace") { @@ -681,21 +681,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (keywordresult != null) { return keywordresult; } - + int prevTokenIndex = tokenIndex; var prevToken2 = GetPreviousToken(ref prevTokenIndex, false); if (prevToken2 == "delegate") { // after these always follows a name return null; } - + if (identifierStart == null && !string.IsNullOrEmpty(token) && !IsInsideCommentStringOrDirective() && (prevToken2 == ";" || prevToken2 == "{" || prevToken2 == "}")) { char last = token [token.Length - 1]; if (char.IsLetterOrDigit(last) || last == '_' || token == ">") { return HandleKeywordCompletion(tokenIndex, token); } } - + if (identifierStart == null) { var accCtx = HandleAccessorContext(); if (accCtx != null) { @@ -708,8 +708,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (n != null && n.Parent is AnonymousTypeCreateExpression) { AutoSelect = false; } - - // Handle foreach (type name _ + + // Handle foreach (type name _ if (n is IdentifierExpression) { var prev = n.GetPrevNode() as ForeachStatement; if (prev != null && prev.InExpression.IsNull) { @@ -719,7 +719,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return null; } - + // var astResolver = new CSharpAstResolver( // GetState(), // identifierStart.Unit, @@ -734,19 +734,19 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // } // } } - - // Handle object/enumerable initialzer expressions: "new O () { P$" + + // Handle object/enumerable initialzer expressions: "new O () { P$" if (n is IdentifierExpression && n.Parent is ArrayInitializerExpression) { var result = HandleObjectInitializer(identifierStart.Unit, n); if (result != null) return result; } - + if (n != null && n.Parent is InvocationExpression) { var invokeParent = (InvocationExpression)n.Parent; var invokeResult = ResolveExpression( - invokeParent.Target - ); + invokeParent.Target + ); var mgr = invokeResult != null ? invokeResult.Item1 as MethodGroupResolveResult : null; if (mgr != null) { int idx = 0; @@ -756,7 +756,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } idx++; } - + foreach (var method in mgr.Methods) { if (idx < method.Parameters.Count && method.Parameters [idx].Type.Kind == TypeKind.Delegate) { AutoSelect = false; @@ -777,7 +777,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } } } - + if (n != null && n.Parent is ObjectCreateExpression) { var invokeResult = ResolveExpression(n.Parent); var mgr = invokeResult != null ? invokeResult.Item1 as ResolveResult : null; @@ -789,11 +789,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } } } - + if (n is IdentifierExpression) { var bop = n.Parent as BinaryOperatorExpression; Expression evaluationExpr = null; - + if (bop != null && bop.Right == n && (bop.Operator == BinaryOperatorType.Equality || bop.Operator == BinaryOperatorType.InEquality)) { evaluationExpr = bop.Left; } @@ -803,40 +803,40 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (resolveResult != null && resolveResult.Item1.Type.Kind == TypeKind.Enum) { var wrapper = new CompletionDataWrapper(this); AddContextCompletion( - wrapper, - resolveResult.Item2, - evaluationExpr - ); + wrapper, + resolveResult.Item2, + evaluationExpr + ); AddEnumMembers(wrapper, resolveResult.Item1.Type, resolveResult.Item2); AutoCompleteEmptyMatch = false; return wrapper.Result; } } } - + if (n is Identifier && n.Parent is ForeachStatement) { if (controlSpace) { return DefaultControlSpaceItems(); } return null; } - + if (n is ArrayInitializerExpression) { // check for new [] {...} expression -> no need to resolve the type there var parent = n.Parent as ArrayCreateExpression; if (parent != null && parent.Type.IsNull) { return DefaultControlSpaceItems(); } - + var initalizerResult = ResolveExpression(n.Parent); - + var concreteNode = identifierStart.Unit.GetNodeAt(location); // check if we're on the right side of an initializer expression if (concreteNode != null && concreteNode.Parent != null && concreteNode.Parent.Parent != null && concreteNode.Identifier != "a" && concreteNode.Parent.Parent is NamedExpression) { return DefaultControlSpaceItems(); } if (initalizerResult != null && initalizerResult.Item1.Type.Kind != TypeKind.Unknown) { - + foreach (var property in initalizerResult.Item1.Type.GetProperties ()) { if (!property.IsPublic) { continue; @@ -870,14 +870,14 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (n is MemberType) { resolveResult = ResolveExpression( - ((MemberType)n).Target - ); + ((MemberType)n).Target + ); return CreateTypeAndNamespaceCompletionData( - location, - resolveResult.Item1, - ((MemberType)n).Target, - resolveResult.Item2 - ); + location, + resolveResult.Item1, + ((MemberType)n).Target, + resolveResult.Item2 + ); } if (n != null/* && !(identifierStart.Item2 is TypeDeclaration)*/) { csResolver = new CSharpResolver(ctx); @@ -886,7 +886,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (n.Parent is ICSharpCode.NRefactory.CSharp.Attribute) { nodes.Add(n.Parent); } - var astResolver = CompletionContextProvider.GetResolver (csResolver, identifierStart.Unit); + var astResolver = CompletionContextProvider.GetResolver(csResolver, identifierStart.Unit); astResolver.ApplyNavigator(new NodeListResolveVisitorNavigator(nodes)); try { csResolver = astResolver.GetResolverStateBefore(n); @@ -908,79 +908,79 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } else { csResolver = GetState(); } - // identifier has already started with the first letter + // identifier has already started with the first letter offset--; AddContextCompletion( - contextList, - csResolver, - identifierStart.Node - ); + contextList, + csResolver, + identifierStart.Node + ); return contextList.Result; - // if (stub.Parent is BlockStatement) - - // result = FindExpression (dom, completionContext, -1); - // if (result == null) - // return null; - // else if (result.ExpressionContext != ExpressionContext.IdentifierExpected) { - // triggerWordLength = 1; - // bool autoSelect = true; - // IType returnType = null; - // if ((prevCh == ',' || prevCh == '(') && GetParameterCompletionCommandOffset (out cpos)) { - // ctx = CompletionWidget.CreateCodeCompletionContext (cpos); - // NRefactoryParameterDataProvider dataProvider = ParameterCompletionCommand (ctx) as NRefactoryParameterDataProvider; - // if (dataProvider != null) { - // int i = dataProvider.GetCurrentParameterIndex (CompletionWidget, ctx) - 1; - // foreach (var method in dataProvider.Methods) { - // if (i < method.Parameters.Count) { - // returnType = dom.GetType (method.Parameters [i].ReturnType); - // autoSelect = returnType == null || returnType.ClassType != ClassType.Delegate; - // break; - // } - // } - // } - // } - // // Bug 677531 - Auto-complete doesn't always highlight generic parameter in method signature - // //if (result.ExpressionContext == ExpressionContext.TypeName) - // // autoSelect = false; - // CompletionDataList dataList = CreateCtrlSpaceCompletionData (completionContext, result); - // AddEnumMembers (dataList, returnType); - // dataList.AutoSelect = autoSelect; - // return dataList; - // } else { - // result = FindExpression (dom, completionContext, 0); - // tokenIndex = offset; - // - // // check foreach case, unfortunately the expression finder is too dumb to handle full type names - // // should be overworked if the expression finder is replaced with a mcs ast based analyzer. - // var possibleForeachToken = GetPreviousToken (ref tokenIndex, false); // starting letter - // possibleForeachToken = GetPreviousToken (ref tokenIndex, false); // varname - // - // // read return types to '(' token - // possibleForeachToken = GetPreviousToken (ref tokenIndex, false); // varType - // if (possibleForeachToken == ">") { - // while (possibleForeachToken != null && possibleForeachToken != "(") { - // possibleForeachToken = GetPreviousToken (ref tokenIndex, false); - // } - // } else { - // possibleForeachToken = GetPreviousToken (ref tokenIndex, false); // ( - // if (possibleForeachToken == ".") - // while (possibleForeachToken != null && possibleForeachToken != "(") - // possibleForeachToken = GetPreviousToken (ref tokenIndex, false); - // } - // possibleForeachToken = GetPreviousToken (ref tokenIndex, false); // foreach - // - // if (possibleForeachToken == "foreach") { - // result.ExpressionContext = ExpressionContext.ForeachInToken; - // } else { - // return null; - // // result.ExpressionContext = ExpressionContext.IdentifierExpected; - // } - // result.Expression = ""; - // result.Region = DomRegion.Empty; - // - // return CreateCtrlSpaceCompletionData (completionContext, result); - // } - // break; + // if (stub.Parent is BlockStatement) + + // result = FindExpression (dom, completionContext, -1); + // if (result == null) + // return null; + // else if (result.ExpressionContext != ExpressionContext.IdentifierExpected) { + // triggerWordLength = 1; + // bool autoSelect = true; + // IType returnType = null; + // if ((prevCh == ',' || prevCh == '(') && GetParameterCompletionCommandOffset (out cpos)) { + // ctx = CompletionWidget.CreateCodeCompletionContext (cpos); + // NRefactoryParameterDataProvider dataProvider = ParameterCompletionCommand (ctx) as NRefactoryParameterDataProvider; + // if (dataProvider != null) { + // int i = dataProvider.GetCurrentParameterIndex (CompletionWidget, ctx) - 1; + // foreach (var method in dataProvider.Methods) { + // if (i < method.Parameters.Count) { + // returnType = dom.GetType (method.Parameters [i].ReturnType); + // autoSelect = returnType == null || returnType.ClassType != ClassType.Delegate; + // break; + // } + // } + // } + // } + // // Bug 677531 - Auto-complete doesn't always highlight generic parameter in method signature + // //if (result.ExpressionContext == ExpressionContext.TypeName) + // // autoSelect = false; + // CompletionDataList dataList = CreateCtrlSpaceCompletionData (completionContext, result); + // AddEnumMembers (dataList, returnType); + // dataList.AutoSelect = autoSelect; + // return dataList; + // } else { + // result = FindExpression (dom, completionContext, 0); + // tokenIndex = offset; + // + // // check foreach case, unfortunately the expression finder is too dumb to handle full type names + // // should be overworked if the expression finder is replaced with a mcs ast based analyzer. + // var possibleForeachToken = GetPreviousToken (ref tokenIndex, false); // starting letter + // possibleForeachToken = GetPreviousToken (ref tokenIndex, false); // varname + // + // // read return types to '(' token + // possibleForeachToken = GetPreviousToken (ref tokenIndex, false); // varType + // if (possibleForeachToken == ">") { + // while (possibleForeachToken != null && possibleForeachToken != "(") { + // possibleForeachToken = GetPreviousToken (ref tokenIndex, false); + // } + // } else { + // possibleForeachToken = GetPreviousToken (ref tokenIndex, false); // ( + // if (possibleForeachToken == ".") + // while (possibleForeachToken != null && possibleForeachToken != "(") + // possibleForeachToken = GetPreviousToken (ref tokenIndex, false); + // } + // possibleForeachToken = GetPreviousToken (ref tokenIndex, false); // foreach + // + // if (possibleForeachToken == "foreach") { + // result.ExpressionContext = ExpressionContext.ForeachInToken; + // } else { + // return null; + // // result.ExpressionContext = ExpressionContext.IdentifierExpected; + // } + // result.Expression = ""; + // result.Region = DomRegion.Empty; + // + // return CreateCtrlSpaceCompletionData (completionContext, result); + // } + // break; } return null; } @@ -989,7 +989,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion { Func typePred = delegate (IType type) { if (type.GetAllBaseTypes().Any(t => t.ReflectionName == "System.Exception")) - return type; + return type; return null; }; if (identifierStart.Node is CatchClause) { @@ -1000,7 +1000,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion identifierStart.Node, typePred, m => false - ); + ); return wrapper.Result; } @@ -1011,7 +1011,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion identifierStart.Node, resolveResult.Item2, typePred - ); + ); } string[] validEnumBaseTypes = { @@ -1114,7 +1114,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion location.Line, location.Column + 2, n => n is Expression || n is AstType - ); + ); rr = ResolveExpression(node); } if (node is Identifier && node.Parent is ForeachStatement) { @@ -1281,7 +1281,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var root = node; while (root.Parent != null) root = root.Parent; - var astResolver = CompletionContextProvider.GetResolver (state, root); + var astResolver = CompletionContextProvider.GetResolver(state, root); foreach (var type in CreateFieldAction.GetValidTypes(astResolver, (Expression)node)) { if (type.Kind == TypeKind.Enum) { AddEnumMembers(wrapper, type, state); @@ -1295,7 +1295,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // Add 'this' keyword for first parameter (extension method case) if (node != null && node.Parent is ParameterDeclaration && - node.Parent.PrevSibling != null && node.Parent.PrevSibling.Role == Roles.LPar) { + node.Parent.PrevSibling != null && node.Parent.PrevSibling.Role == Roles.LPar) { wrapper.AddCustom("this"); } } @@ -1321,6 +1321,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (currentType != null) { for (var ct = currentType; 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); @@ -1349,6 +1351,8 @@ 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; } @@ -1365,7 +1369,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } var declaring = def.DeclaringTypeDefinition; while (declaring != null) { - foreach (var member in declaring.GetMembers (m => m.IsStatic)) { + foreach (var member in declaring.GetMembers (m => m.IsStatic && !m.IsSynthetic)) { if (memberPred == null || memberPred(member)) { wrapper.AddMember(member); } @@ -1445,65 +1449,65 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return wrapper.Result; case "case": return CreateCaseCompletionData(location); - // case ",": - // case ":": - // if (result.ExpressionContext == ExpressionContext.InheritableType) { - // IType cls = NRefactoryResolver.GetTypeAtCursor (Document.CompilationUnit, Document.FileName, new TextLocation (completionContext.TriggerLine, completionContext.TriggerLineOffset)); - // CompletionDataList completionList = new ProjectDomCompletionDataList (); - // List namespaceList = GetUsedNamespaces (); - // var col = new CSharpTextEditorCompletion.CompletionDataCollector (this, dom, completionList, Document.CompilationUnit, null, location); - // bool isInterface = false; - // HashSet baseTypeNames = new HashSet (); - // if (cls != null) { - // baseTypeNames.Add (cls.Name); - // if (cls.ClassType == ClassType.Struct) - // isInterface = true; - // } - // int tokenIndex = offset; - // - // // Search base types " : [Type1, ... ,TypeN,] " - // string token = null; - // do { - // token = GetPreviousToken (ref tokenIndex, false); - // if (string.IsNullOrEmpty (token)) - // break; - // token = token.Trim (); - // if (Char.IsLetterOrDigit (token [0]) || token [0] == '_') { - // IType baseType = dom.SearchType (Document.CompilationUnit, cls, result.Region.Start, token); - // if (baseType != null) { - // if (baseType.ClassType != ClassType.Interface) - // isInterface = true; - // baseTypeNames.Add (baseType.Name); - // } - // } - // } while (token != ":"); - // foreach (object o in dom.GetNamespaceContents (namespaceList, true, true)) { - // IType type = o as IType; - // if (type != null && (type.IsStatic || type.IsSealed || baseTypeNames.Contains (type.Name) || isInterface && type.ClassType != ClassType.Interface)) { - // continue; - // } - // if (o is Namespace && !namespaceList.Any (ns => ns.StartsWith (((Namespace)o).FullName))) - // continue; - // col.Add (o); - // } - // // Add inner classes - // Stack innerStack = new Stack (); - // innerStack.Push (cls); - // while (innerStack.Count > 0) { - // IType curType = innerStack.Pop (); - // if (curType == null) - // continue; - // foreach (IType innerType in curType.InnerTypes) { - // if (innerType != cls) - // // don't add the calling class as possible base type - // col.Add (innerType); - // } - // if (curType.DeclaringType != null) - // innerStack.Push (curType.DeclaringType); - // } - // return completionList; - // } - // break; + // case ",": + // case ":": + // if (result.ExpressionContext == ExpressionContext.InheritableType) { + // IType cls = NRefactoryResolver.GetTypeAtCursor (Document.CompilationUnit, Document.FileName, new TextLocation (completionContext.TriggerLine, completionContext.TriggerLineOffset)); + // CompletionDataList completionList = new ProjectDomCompletionDataList (); + // List namespaceList = GetUsedNamespaces (); + // var col = new CSharpTextEditorCompletion.CompletionDataCollector (this, dom, completionList, Document.CompilationUnit, null, location); + // bool isInterface = false; + // HashSet baseTypeNames = new HashSet (); + // if (cls != null) { + // baseTypeNames.Add (cls.Name); + // if (cls.ClassType == ClassType.Struct) + // isInterface = true; + // } + // int tokenIndex = offset; + // + // // Search base types " : [Type1, ... ,TypeN,] " + // string token = null; + // do { + // token = GetPreviousToken (ref tokenIndex, false); + // if (string.IsNullOrEmpty (token)) + // break; + // token = token.Trim (); + // if (Char.IsLetterOrDigit (token [0]) || token [0] == '_') { + // IType baseType = dom.SearchType (Document.CompilationUnit, cls, result.Region.Start, token); + // if (baseType != null) { + // if (baseType.ClassType != ClassType.Interface) + // isInterface = true; + // baseTypeNames.Add (baseType.Name); + // } + // } + // } while (token != ":"); + // foreach (object o in dom.GetNamespaceContents (namespaceList, true, true)) { + // IType type = o as IType; + // if (type != null && (type.IsStatic || type.IsSealed || baseTypeNames.Contains (type.Name) || isInterface && type.ClassType != ClassType.Interface)) { + // continue; + // } + // if (o is Namespace && !namespaceList.Any (ns => ns.StartsWith (((Namespace)o).FullName))) + // continue; + // col.Add (o); + // } + // // Add inner classes + // Stack innerStack = new Stack (); + // innerStack.Push (cls); + // while (innerStack.Count > 0) { + // IType curType = innerStack.Pop (); + // if (curType == null) + // continue; + // foreach (IType innerType in curType.InnerTypes) { + // if (innerType != cls) + // // don't add the calling class as possible base type + // col.Add (innerType); + // } + // if (curType.DeclaringType != null) + // innerStack.Push (curType.DeclaringType); + // } + // return completionList; + // } + // break; case "is": case "as": if (currentType == null) { @@ -1526,63 +1530,63 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var isAsWrapper = new CompletionDataWrapper(this); var def = isAsType != null ? isAsType.GetDefinition() : null; AddTypesAndNamespaces( - isAsWrapper, - GetState(), - null, - t => t.GetDefinition() == null || def == null || t.GetDefinition().IsDerivedFrom(def) ? t : null, - m => false); + isAsWrapper, + GetState(), + null, + t => t.GetDefinition() == null || def == null || t.GetDefinition().IsDerivedFrom(def) ? t : null, + m => false); return isAsWrapper.Result; - // { - // CompletionDataList completionList = new ProjectDomCompletionDataList (); - // ExpressionResult expressionResult = FindExpression (dom, completionContext, wordStart - document.Caret.Offset); - // NRefactoryResolver resolver = CreateResolver (); - // ResolveResult resolveResult = resolver.Resolve (expressionResult, new TextLocation (completionContext.TriggerLine, completionContext.TriggerLineOffset)); - // if (resolveResult != null && resolveResult.ResolvedType != null) { - // CompletionDataCollector col = new CompletionDataCollector (this, dom, completionList, Document.CompilationUnit, resolver.CallingType, location); - // IType foundType = null; - // if (word == "as") { - // ExpressionContext exactContext = new NewCSharpExpressionFinder (dom).FindExactContextForAsCompletion (document, Document.CompilationUnit, Document.FileName, resolver.CallingType); - // if (exactContext is ExpressionContext.TypeExpressionContext) { - // foundType = resolver.SearchType (((ExpressionContext.TypeExpressionContext)exactContext).Type); - // AddAsCompletionData (col, foundType); - // } - // } - // - // if (foundType == null) - // foundType = resolver.SearchType (resolveResult.ResolvedType); - // - // if (foundType != null) { - // if (foundType.ClassType == ClassType.Interface) - // foundType = resolver.SearchType (DomReturnType.Object); - // - // foreach (IType type in dom.GetSubclasses (foundType)) { - // if (type.IsSpecialName || type.Name.StartsWith ("<")) - // continue; - // AddAsCompletionData (col, type); - // } - // } - // List namespaceList = GetUsedNamespaces (); - // foreach (object o in dom.GetNamespaceContents (namespaceList, true, true)) { - // if (o is IType) { - // IType type = (IType)o; - // if (type.ClassType != ClassType.Interface || type.IsSpecialName || type.Name.StartsWith ("<")) - // continue; - // // if (foundType != null && !dom.GetInheritanceTree (foundType).Any (x => x.FullName == type.FullName)) - // // continue; - // AddAsCompletionData (col, type); - // continue; - // } - // if (o is Namespace) - // continue; - // col.Add (o); - // } - // return completionList; - // } - // result.ExpressionContext = ExpressionContext.TypeName; - // return CreateCtrlSpaceCompletionData (completionContext, result); - // } + // { + // CompletionDataList completionList = new ProjectDomCompletionDataList (); + // ExpressionResult expressionResult = FindExpression (dom, completionContext, wordStart - document.Caret.Offset); + // NRefactoryResolver resolver = CreateResolver (); + // ResolveResult resolveResult = resolver.Resolve (expressionResult, new TextLocation (completionContext.TriggerLine, completionContext.TriggerLineOffset)); + // if (resolveResult != null && resolveResult.ResolvedType != null) { + // CompletionDataCollector col = new CompletionDataCollector (this, dom, completionList, Document.CompilationUnit, resolver.CallingType, location); + // IType foundType = null; + // if (word == "as") { + // ExpressionContext exactContext = new NewCSharpExpressionFinder (dom).FindExactContextForAsCompletion (document, Document.CompilationUnit, Document.FileName, resolver.CallingType); + // if (exactContext is ExpressionContext.TypeExpressionContext) { + // foundType = resolver.SearchType (((ExpressionContext.TypeExpressionContext)exactContext).Type); + // AddAsCompletionData (col, foundType); + // } + // } + // + // if (foundType == null) + // foundType = resolver.SearchType (resolveResult.ResolvedType); + // + // if (foundType != null) { + // if (foundType.ClassType == ClassType.Interface) + // foundType = resolver.SearchType (DomReturnType.Object); + // + // foreach (IType type in dom.GetSubclasses (foundType)) { + // if (type.IsSpecialName || type.Name.StartsWith ("<")) + // continue; + // AddAsCompletionData (col, type); + // } + // } + // List namespaceList = GetUsedNamespaces (); + // foreach (object o in dom.GetNamespaceContents (namespaceList, true, true)) { + // if (o is IType) { + // IType type = (IType)o; + // if (type.ClassType != ClassType.Interface || type.IsSpecialName || type.Name.StartsWith ("<")) + // continue; + // // if (foundType != null && !dom.GetInheritanceTree (foundType).Any (x => x.FullName == type.FullName)) + // // continue; + // AddAsCompletionData (col, type); + // continue; + // } + // if (o is Namespace) + // continue; + // col.Add (o); + // } + // return completionList; + // } + // result.ExpressionContext = ExpressionContext.TypeName; + // return CreateCtrlSpaceCompletionData (completionContext, result); + // } case "override": - // Look for modifiers, in order to find the beginning of the declaration + // Look for modifiers, in order to find the beginning of the declaration int firstMod = wordStart; int i = wordStart; for (int n = 0; n < 3; n++) { @@ -1605,7 +1609,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return null; case "partial": - // Look for modifiers, in order to find the beginning of the declaration + // Look for modifiers, in order to find the beginning of the declaration firstMod = wordStart; i = wordStart; for (int n = 0; n < 3; n++) { @@ -1623,13 +1627,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; } var state = GetState(); - + if (state.CurrentTypeDefinition != null && (state.CurrentTypeDefinition.Kind == TypeKind.Class || state.CurrentTypeDefinition.Kind == TypeKind.Struct)) { string modifiers = document.GetText(firstMod, wordStart - firstMod); return GetPartialCompletionData(state.CurrentTypeDefinition, modifiers); } return null; - + case "public": case "protected": case "private": @@ -1650,19 +1654,19 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return wrapper.Result; case "new": int j = offset - 4; - // string token = GetPreviousToken (ref j, true); - + // string token = GetPreviousToken (ref j, true); + IType hintType = null; var expressionOrVariableDeclaration = GetNewExpressionAt(j); if (expressionOrVariableDeclaration == null) return null; var astResolver = CompletionContextProvider.GetResolver(GetState(), expressionOrVariableDeclaration.Unit); hintType = CreateFieldAction.GetValidTypes( - astResolver, - expressionOrVariableDeclaration.Node as Expression - ) - .FirstOrDefault(); - + astResolver, + expressionOrVariableDeclaration.Node as Expression + ) + .FirstOrDefault(); + return CreateTypeCompletionData(hintType); case "yield": var yieldDataList = new CompletionDataWrapper(this); @@ -1672,15 +1676,15 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return yieldDataList.Result; case "in": var inList = new CompletionDataWrapper(this); - + var expr = GetExpressionAtCursor(); var rr = ResolveExpression(expr); - + AddContextCompletion( - inList, - rr != null ? rr.Item2 : GetState(), - expr.Node - ); + inList, + rr != null ? rr.Item2 : GetState(), + expr.Node + ); return inList.Result; } return null; @@ -1738,12 +1742,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var lookup = new MemberLookup( ctx.CurrentTypeDefinition, Compilation.MainAssembly - ); + ); typeCallback = (data, t) => { //check if type is in inheritance tree. if (hintType.GetDefinition() != null && - t.GetDefinition() != null && - t.GetDefinition().IsDerivedFrom(hintType.GetDefinition())) { + t.GetDefinition() != null && + t.GetDefinition().IsDerivedFrom(hintType.GetDefinition())) { data.CompletionCategory = derivedTypesCategory; } }; @@ -1759,8 +1763,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (!t.GetConstructors().Any(m => lookup.IsAccessible( m, isProtectedAllowed - ) - )) { + ) + )) { return null; } } @@ -1838,7 +1842,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion modifiers, type.Resolve(ctx), declarationBegin - ); + ); return wrapper.Result; } @@ -1880,8 +1884,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion declarationBegin, method.DeclaringTypeDefinition, method - ) - ); + ) + ); } return wrapper.Result; @@ -1924,13 +1928,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion declarationBegin, currentType, m - ); + ); // check if the member is already implemented bool foundMember = curType.GetMembers().Any(cm => SignatureComparer.Ordinal.Equals( cm, m - ) && cm.DeclaringTypeDefinition == curType.GetDefinition() - ); + ) && cm.DeclaringTypeDefinition == curType.GetDefinition() + ); if (foundMember) { continue; } @@ -2012,7 +2016,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion "delegate", "Creates anonymous delegate.", "delegate {" + EolMarker + thisLineIndent + IndentString + "|" + delegateEndString - ); + ); } var sb = new StringBuilder("("); var sbWithoutTypes = new StringBuilder("("); @@ -2033,13 +2037,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion "delegate" + sb, "Creates anonymous delegate.", "delegate" + sb + " {" + EolMarker + thisLineIndent + IndentString + "|" + delegateEndString - ); + ); if (!completionList.Result.Any(data => data.DisplayText == sbWithoutTypes.ToString())) { completionList.AddCustom( sbWithoutTypes.ToString(), "Creates lambda expression.", sbWithoutTypes + " => |" + (addSemicolon ? ";" : "") - ); + ); } /* TODO:Make factory method out of it. // It's needed to temporarly disable inserting auto matching bracket because the anonymous delegates are selectable with '(' @@ -2073,7 +2077,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion calledType, currentMember, includeProtected - ); + ); } if (member.IsProtected && !(member.DeclaringTypeDefinition.IsProtectedOrInternal && !includeProtected)) { @@ -2101,7 +2105,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // should never happen ! result = true; }*/ - return member.IsProtectedAndInternal ? includeProtected && result : result; + return member.IsProtectedAndInternal ? includeProtected && result : result; } if (!(currentMember is IType) && (currentMember.DeclaringTypeDefinition == null || member.DeclaringTypeDefinition == null)) { @@ -2147,6 +2151,8 @@ 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; @@ -2213,7 +2219,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion parameterDefinition, currentMember, currentType) - ); + ); } } @@ -2270,7 +2276,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return; } string typeString = GetShortType(resolvedType, state); - completionList.AddEnumMembers (resolvedType, state, typeString); + completionList.AddEnumMembers(resolvedType, state, typeString); DefaultCompletionString = typeString; } @@ -2285,6 +2291,8 @@ 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); @@ -2308,7 +2316,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var lookup = new MemberLookup( ctx.CurrentTypeDefinition, Compilation.MainAssembly - ); + ); if (resolveResult is LocalResolveResult) { @@ -2338,7 +2346,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion resolveResult, ((IdentifierExpression)resolvedNode).Identifier, out trr - )) { + )) { if (currentMember != null && mrr.Member.IsStatic ^ currentMember.IsStatic) { skipNonStaticMembers = true; @@ -2385,6 +2393,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var filteredList = new List(); 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; } @@ -2435,7 +2445,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (resolveResult is TypeResolveResult || includeStaticMembers) { - foreach (var nested in type.GetNestedTypes ()) { + foreach (var nested in type.GetNestedTypes (t => !t.IsSynthetic)) { + if (!lookup.IsAccessible(nested.GetDefinition(), isProtectedAllowed)) + continue; IType addType = typePred != null ? typePred(nested) : nested; if (addType != null) result.AddType(addType, addType.Name); @@ -2589,8 +2601,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } tref.ReplaceWith(expr); } - exit: - return new ExpressionResult((AstNode)expr, baseUnit); + exit: + return new ExpressionResult((AstNode)expr, baseUnit); } ExpressionResult GetExpressionAtCursor() @@ -2608,7 +2620,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion AstNode expr = baseUnit.GetNodeAt( location, n => n is IdentifierExpression || n is MemberReferenceExpression - ); + ); if (expr == null) { expr = baseUnit.GetNodeAt(location.Line, location.Column - 1); @@ -2619,12 +2631,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (expr == null && baseUnit.GetNodeAt( location.Line, location.Column - ) != null) { + ) != null) { tmpUnit = baseUnit = ParseStub("a();", false); expr = baseUnit.GetNodeAt( location.Line, location.Column + 1 - ); + ); } if (expr == null) { @@ -2632,7 +2644,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion expr = baseUnit.GetNodeAt( location.Line, location.Column - 1 - ); + ); if (expr == null) { expr = baseUnit.GetNodeAt(location.Line, location.Column - 1); } @@ -2643,7 +2655,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion expr = baseUnit.GetNodeAt( location, n => n is IdentifierExpression || n is MemberReferenceExpression || n is CatchClause - ); + ); } // try statement @@ -2651,7 +2663,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion expr = tmpUnit.GetNodeAt( location.Line, location.Column - 1 - ); + ); baseUnit = tmpUnit; } @@ -2673,7 +2685,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var forStmt = tmpUnit.GetNodeAt( location.Line, location.Column - 3 - ); + ); if (forStmt != null && forStmt.EmbeddedStatement.IsNull) { forStmt.VariableNameToken = Identifier.Create("stub"); expr = forStmt.VariableNameToken; @@ -2684,7 +2696,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion expr = tmpUnit.GetNodeAt( location.Line, location.Column - 1 - ); + ); baseUnit = tmpUnit; } @@ -2694,7 +2706,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion expr = baseUnit.GetNodeAt( location.Line, location.Column - 1 - ); + ); } // try parameter declaration method @@ -2703,7 +2715,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion expr = baseUnit.GetNodeAt( location.Line, location.Column - 1 - ); + ); } // try expression in anonymous type "new { sample = x$" case @@ -2712,7 +2724,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion expr = baseUnit.GetNodeAt( location.Line, location.Column - ); + ); if (expr != null) { expr = baseUnit.GetNodeAt(location.Line, location.Column) ?? expr; } @@ -2742,7 +2754,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var expr = completionUnit.GetNodeAt( loc, n => n is Expression || n is VariableDeclarationStatement - ); + ); if (expr == null) { return null; } @@ -2864,15 +2876,15 @@ namespace ICSharpCode.NRefactory.CSharp.Completion "summary", "value" } - ); + ); - string GetLastClosingXmlCommentTag () + string GetLastClosingXmlCommentTag() { var line = document.GetLineByNumber(location.Line); - restart: - string lineText = document.GetText(line); - if (!lineText.Trim ().StartsWith ("///")) + restart: + string lineText = document.GetText(line); + if (!lineText.Trim().StartsWith("///")) return null; int startIndex = Math.Min(location.Column - 1, lineText.Length - 1) - 1; while (startIndex > 0 && lineText [startIndex] != '<') { @@ -2906,109 +2918,109 @@ namespace ICSharpCode.NRefactory.CSharp.Completion IEnumerable GetXmlDocumentationCompletionData() { - var closingTag = GetLastClosingXmlCommentTag (); + var closingTag = GetLastClosingXmlCommentTag(); if (closingTag != null) { yield return factory.CreateLiteralCompletionData( "/" + closingTag + ">" - ); + ); } yield return factory.CreateLiteralCompletionData( "c", "Set text in a code-like font" - ); + ); yield return factory.CreateLiteralCompletionData( "code", "Set one or more lines of source code or program output" - ); + ); yield return factory.CreateLiteralCompletionData( "example", "Indicate an example" - ); + ); yield return factory.CreateLiteralCompletionData( "exception", "Identifies the exceptions a method can throw", "exception cref=\"|\">" - ); + ); yield return factory.CreateLiteralCompletionData( "include", "Includes comments from a external file", "include file=\"|\" path=\"\">" - ); + ); yield return factory.CreateLiteralCompletionData( "list", "Create a list or table", "list type=\"|\">" - ); + ); yield return factory.CreateLiteralCompletionData( "listheader", "Define the heading row" - ); + ); yield return factory.CreateLiteralCompletionData( "item", "Defines list or table item" - ); + ); yield return factory.CreateLiteralCompletionData("term", "A term to define"); yield return factory.CreateLiteralCompletionData( "description", "Describes a list item" - ); + ); yield return factory.CreateLiteralCompletionData( "para", "Permit structure to be added to text" - ); + ); yield return factory.CreateLiteralCompletionData( "param", "Describe a parameter for a method or constructor", "param name=\"|\">" - ); + ); yield return factory.CreateLiteralCompletionData( "paramref", "Identify that a word is a parameter name", "paramref name=\"|\"/>" - ); + ); yield return factory.CreateLiteralCompletionData( "permission", "Document the security accessibility of a member", "permission cref=\"|\"" - ); + ); yield return factory.CreateLiteralCompletionData( "remarks", "Describe a type" - ); + ); yield return factory.CreateLiteralCompletionData( "returns", "Describe the return value of a method" - ); + ); yield return factory.CreateLiteralCompletionData( "see", "Specify a link", "see cref=\"|\"/>" - ); + ); yield return factory.CreateLiteralCompletionData( "seealso", "Generate a See Also entry", "seealso cref=\"|\"/>" - ); + ); yield return factory.CreateLiteralCompletionData( "summary", "Describe a member of a type" - ); + ); yield return factory.CreateLiteralCompletionData( "typeparam", "Describe a type parameter for a generic type or method" - ); + ); yield return factory.CreateLiteralCompletionData( "typeparamref", "Identify that a word is a type parameter name" - ); + ); yield return factory.CreateLiteralCompletionData( "value", "Describe a property" - ); + ); } #endregion diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ImplementInterfaceAction.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ImplementInterfaceAction.cs index 6c107a618b..915715cb52 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ImplementInterfaceAction.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ImplementInterfaceAction.cs @@ -1,4 +1,4 @@ -// +// // ImplementInterfaceAction.cs // // Author: @@ -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(); - 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 } } - static AstNode GenerateMemberImplementation(RefactoringContext context, Tuple 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> CollectMembersToImplement(ITypeDefinition implementingType, IType interfaceType, bool explicitly) diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs index 76dc5e24c9..e7dd6e3a02 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs @@ -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 GetSelectedNodes() diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs index be486dc7e3..47f0350ae1 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs @@ -166,7 +166,11 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring { // Default implementation: do nothing // Derived classes are supposed to enter the text editor's linked state. - return null; + + // Immediately signal the task as completed: + var tcs = new TaskCompletionSource(); + tcs.SetResult(null); + return tcs.Task; } public void Replace (AstNode node, AstNode replaceWith) diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs index fa52949a20..2c29f68842 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs @@ -111,6 +111,18 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring /// The default value is false. /// public bool AlwaysUseShortTypeNames { get; set; } + + /// + /// Controls whether to generate a body that throws a System.NotImplementedException. + /// The default value is false. + /// + public bool GenerateBody { get; set; } + + /// + /// Controls whether to generate custom events. + /// The default value is false. + /// + public bool UseCustomEvents { get; set; } #endregion #region Convert Type @@ -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 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 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 decl.Constraints.Add(constraint); } } + decl.Body = GenerateBodyBlock(); return decl; } @@ -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 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 { DestructorDeclaration decl = new DestructorDeclaration(); decl.Name = dtor.DeclaringTypeDefinition.Name; + decl.Body = GenerateBodyBlock(); return decl; } #endregion @@ -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; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAssembly.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAssembly.cs index 28ee59a3f0..fe72e9b576 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAssembly.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAssembly.cs @@ -290,6 +290,10 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem get { return assembly.Compilation; } } + IEnumerable INamespace.ContributingAssemblies { + get { return new [] { assembly }; } + } + INamespace INamespace.GetChildNamespace(string name) { var nameComparer = assembly.compilation.NameComparer; diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs index f98d5a96ec..063a095192 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs @@ -172,6 +172,10 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem get { return EmptyList.Instance; } } + IEnumerable INamespace.ContributingAssemblies { + get { return EmptyList.Instance; } + } + ICompilation IResolved.Compilation { get { return parentNamespace.Compilation; } } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/ExtensionMethods.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/ExtensionMethods.cs index a0a59c3560..0f02617087 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/ExtensionMethods.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/ExtensionMethods.cs @@ -92,7 +92,7 @@ namespace ICSharpCode.NRefactory.TypeSystem } #endregion - #region IsOpen / IsUnbound + #region IsOpen / IsUnbound / IsKnownType sealed class TypeClassificationVisitor : TypeVisitor { internal bool isOpen; @@ -140,6 +140,16 @@ namespace ICSharpCode.NRefactory.TypeSystem throw new ArgumentNullException("type"); return type is ITypeDefinition && type.TypeParameterCount > 0; } + + /// + /// Gets whether the type is the specified known type. + /// For generic known types, this returns true any parameterization of the type (and also for the definition itself). + /// + public static bool IsKnownType(this IType type, KnownTypeCode knownType) + { + var def = type.GetDefinition(); + return def != null && def.KnownTypeCode == knownType; + } #endregion #region Import diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/INamespace.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/INamespace.cs index 487e4fc3e3..b3631fe060 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/INamespace.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/INamespace.cs @@ -62,6 +62,11 @@ namespace ICSharpCode.NRefactory.TypeSystem /// IEnumerable Types { get; } + /// + /// Gets the assemblies that contribute types to this namespace (or to child namespaces). + /// + IEnumerable ContributingAssemblies { get; } + /// /// Gets a direct child namespace by its short name. /// Returns null when the namespace cannot be found. diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs index b3aba10d88..d74c1cae84 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs @@ -378,6 +378,10 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation get { return parentNamespace; } } + IEnumerable INamespace.ContributingAssemblies { + get { return new [] { assembly }; } + } + IEnumerable INamespace.ChildNamespaces { get { return childNamespaces; } } diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/MergedNamespace.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/MergedNamespace.cs index 4363253f05..1ab85bcd4e 100644 --- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/MergedNamespace.cs +++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/MergedNamespace.cs @@ -20,7 +20,6 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using System.Text; using ICSharpCode.NRefactory.Utils; namespace ICSharpCode.NRefactory.TypeSystem.Implementation @@ -96,6 +95,10 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation get { return compilation; } } + public IEnumerable ContributingAssemblies { + get { return namespaces.SelectMany(ns => ns.ContributingAssemblies); } + } + public IEnumerable ChildNamespaces { get { return GetChildNamespaces().Values; } }