void AddContextCompletion(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node) { int i = offset - 1; var isInGlobalDelegate = node == null && state.CurrentTypeDefinition == null && GetPreviousToken(ref i, true) == "delegate"; if (state != null && !(node is AstType)) { foreach (var variable in state.LocalVariables) { if (variable.Region.IsInside(location.Line, location.Column - 1)) { continue; } wrapper.AddVariable(variable); } } if (state.CurrentMember is IParameterizedMember && !(node is AstType)) { var param = (IParameterizedMember)state.CurrentMember; foreach (var p in param.Parameters) { wrapper.AddVariable(p); } } if (state.CurrentMember is IMethod) { var method = (IMethod)state.CurrentMember; foreach (var p in method.TypeParameters) { wrapper.AddTypeParameter(p); } } Func<IType, IType> typePred = null; if (IsAttributeContext(node)) { var attribute = Compilation.FindType(KnownTypeCode.Attribute); typePred = t => t.GetAllBaseTypeDefinitions().Any(bt => bt.Equals(attribute)) ? t : null; } if (node != null && node.Role == Roles.BaseType) { typePred = t => { var def = t.GetDefinition(); if (def != null && t.Kind != TypeKind.Interface && (def.IsSealed || def.IsStatic)) return null; return t; }; } if (node != null && !(node is NamespaceDeclaration) || state.CurrentTypeDefinition != null || isInGlobalDelegate) { AddTypesAndNamespaces(wrapper, state, node, typePred); wrapper.Result.Add(factory.CreateLiteralCompletionData("global")); } if (!(node is AstType)) { if (currentMember != null || node is Expression) { AddKeywords(wrapper, statementStartKeywords); if (LanguageVersion.Major >= 5) AddKeywords(wrapper, new [] { "await" }); AddKeywords(wrapper, expressionLevelKeywords); if (node == null || node is TypeDeclaration) AddKeywords(wrapper, typeLevelKeywords); } else if (currentType != null) { AddKeywords(wrapper, typeLevelKeywords); } else { if (!isInGlobalDelegate && !(node is Attribute)) AddKeywords(wrapper, globalLevelKeywords); } var prop = currentMember as IUnresolvedProperty; if (prop != null && prop.Setter != null && prop.Setter.Region.IsInside(location)) { wrapper.AddCustom("value"); } if (currentMember is IUnresolvedEvent) { wrapper.AddCustom("value"); } if (IsInSwitchContext(node)) { if (IncludeKeywordsInCompletionList) wrapper.AddCustom("case"); } } else { if (((AstType)node).Parent is ParameterDeclaration) { AddKeywords(wrapper, parameterTypePredecessorKeywords); } } if (node != null || state.CurrentTypeDefinition != null || isInGlobalDelegate) AddKeywords(wrapper, primitiveTypesKeywords); if (currentMember != null && (node is IdentifierExpression || node is SimpleType) && (node.Parent is ExpressionStatement || node.Parent is ForeachStatement || node.Parent is UsingStatement)) { if (IncludeKeywordsInCompletionList) { wrapper.AddCustom("var"); wrapper.AddCustom("dynamic"); } } wrapper.Result.AddRange(factory.CreateCodeTemplateCompletionData()); if (node != null && node.Role == Roles.Argument) { var resolved = ResolveExpression(node.Parent); var invokeResult = resolved != null ? resolved.Result as CSharpInvocationResolveResult : null; if (invokeResult != null) { int argNum = 0; foreach (var arg in node.Parent.Children.Where (c => c.Role == Roles.Argument)) { if (arg == node) { break; } argNum++; } var param = argNum < invokeResult.Member.Parameters.Count ? invokeResult.Member.Parameters [argNum] : null; if (param != null && param.Type.Kind == TypeKind.Enum) { AddEnumMembers(wrapper, param.Type, state); } } } if (node is Expression) { var root = node; while (root.Parent != null) root = root.Parent; var astResolver = CompletionContextProvider.GetResolver(state, root); foreach (var type in TypeGuessing.GetValidTypes(astResolver, (Expression)node)) { if (type.Kind == TypeKind.Enum) { AddEnumMembers(wrapper, type, state); } else if (type.Kind == TypeKind.Delegate) { AddDelegateHandlers(wrapper, type, false, true); AutoSelect = false; AutoCompleteEmptyMatch = false; } } } // 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 && IncludeKeywordsInCompletionList) { wrapper.AddCustom("this"); } }
void AddTypesAndNamespaces(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Func<IType, IType> typePred = null, Predicate<IMember> memberPred = null, Action<ICompletionData, IType> callback = null, bool onlyAddConstructors = false) { var lookup = new MemberLookup(ctx.CurrentTypeDefinition, Compilation.MainAssembly); if (currentType != null) { for (var ct = ctx.CurrentTypeDefinition; ct != null; ct = ct.DeclaringTypeDefinition) { foreach (var nestedType in ct.GetNestedTypes ()) { if (!lookup.IsAccessible(nestedType.GetDefinition(), true)) continue; if (onlyAddConstructors) { if (!nestedType.GetConstructors().Any(c => lookup.IsAccessible(c, true))) continue; } if (typePred == null) { if (onlyAddConstructors) wrapper.AddConstructors(nestedType, false, IsAttributeContext(node)); else wrapper.AddType(nestedType, false, IsAttributeContext(node)); continue; } var type = typePred(nestedType); if (type != null) { var a2 = onlyAddConstructors ? wrapper.AddConstructors(type, false, IsAttributeContext(node)) : wrapper.AddType(type, false, IsAttributeContext(node)); if (a2 != null && callback != null) { callback(a2, type); } } continue; } } if (this.currentMember != null && !(node is AstType)) { var def = ctx.CurrentTypeDefinition; if (def == null && currentType != null) def = Compilation.MainAssembly.GetTypeDefinition(currentType.FullTypeName); if (def != null) { bool isProtectedAllowed = true; foreach (var member in def.GetMembers (m => currentMember.IsStatic ? m.IsStatic : true)) { if (member is IMethod && ((IMethod)member).FullName == "System.Object.Finalize") { continue; } if (member.SymbolKind == SymbolKind.Operator) { continue; } if (member.IsExplicitInterfaceImplementation) { continue; } if (!lookup.IsAccessible(member, isProtectedAllowed)) { continue; } if (memberPred == null || memberPred(member)) { wrapper.AddMember(member); } } var declaring = def.DeclaringTypeDefinition; while (declaring != null) { foreach (var member in declaring.GetMembers (m => m.IsStatic)) { if (memberPred == null || memberPred(member)) { wrapper.AddMember(member); } } declaring = declaring.DeclaringTypeDefinition; } } } if (ctx.CurrentTypeDefinition != null) { foreach (var p in ctx.CurrentTypeDefinition.TypeParameters) { wrapper.AddTypeParameter(p); } } } var scope = ctx.CurrentUsingScope; for (var n = scope; n != null; n = n.Parent) { foreach (var pair in n.UsingAliases) { wrapper.AddAlias(pair.Key); } foreach (var alias in n.ExternAliases) { wrapper.AddAlias(alias); } foreach (var u in n.Usings) { foreach (var type in u.Types) { if (!lookup.IsAccessible(type, false)) continue; IType addType = typePred != null ? typePred(type) : type; if (onlyAddConstructors && addType != null) { if (!addType.GetConstructors().Any(c => lookup.IsAccessible(c, true))) continue; } if (addType != null) { var a = onlyAddConstructors ? wrapper.AddConstructors(addType, false, IsAttributeContext(node)) : wrapper.AddType(addType, false, IsAttributeContext(node)); if (a != null && callback != null) { callback(a, type); } } } } foreach (var type in n.Namespace.Types) { if (!lookup.IsAccessible(type, false)) continue; IType addType = typePred != null ? typePred(type) : type; if (onlyAddConstructors && addType != null) { if (!addType.GetConstructors().Any(c => lookup.IsAccessible(c, true))) continue; } if (addType != null) { var a2 = onlyAddConstructors ? wrapper.AddConstructors(addType, false, IsAttributeContext(node)) : wrapper.AddType(addType, false); if (a2 != null && callback != null) { callback(a2, type); } } } } for (var n = scope; n != null; n = n.Parent) { foreach (var curNs in n.Namespace.ChildNamespaces) { wrapper.AddNamespace(lookup, curNs); } } if (node is AstType && node.Parent is Constraint && IncludeKeywordsInCompletionList) { wrapper.AddCustom("new()"); } if (AutomaticallyAddImports) { state = GetState(); ICompletionData[] importData; var namespaces = new List<INamespace>(); for (var n = ctx.CurrentUsingScope; n != null; n = n.Parent) { namespaces.Add(n.Namespace); foreach (var u in n.Usings) namespaces.Add(u); } if (this.CompletionEngineCache != null && ListEquals(namespaces, CompletionEngineCache.namespaces)) { importData = CompletionEngineCache.importCompletion; } else { // flatten usings var importList = new List<ICompletionData>(); var dict = new Dictionary<string, Dictionary<string, ICompletionData>>(); foreach (var type in Compilation.GetAllTypeDefinitions ()) { if (!lookup.IsAccessible(type, false)) continue; if (namespaces.Any(n => n.FullName == type.Namespace)) continue; bool useFullName = false; foreach (var ns in namespaces) { if (ns.GetTypeDefinition(type.Name, type.TypeParameterCount) != null) { useFullName = true; break; } } if (onlyAddConstructors) { if (!type.GetConstructors().Any(c => lookup.IsAccessible(c, true))) continue; } var data = factory.CreateImportCompletionData(type, useFullName, onlyAddConstructors); Dictionary<string, ICompletionData> createdDict; if (!dict.TryGetValue(type.Name, out createdDict)) { createdDict = new Dictionary<string, ICompletionData>(); dict.Add(type.Name, createdDict); } ICompletionData oldData; if (!createdDict.TryGetValue(type.Namespace, out oldData)) { importList.Add(data); createdDict.Add(type.Namespace, data); } else { oldData.AddOverload(data); } } importData = importList.ToArray(); if (CompletionEngineCache != null) { CompletionEngineCache.namespaces = namespaces; CompletionEngineCache.importCompletion = importData; } } foreach (var data in importData) { wrapper.Result.Add(data); } } }
void AddContextCompletion(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, CompilationUnit unit) { if (state != null && !(node is AstType)) { foreach (var variable in state.LocalVariables) { if (variable.Region.IsInside(location.Line, location.Column - 1)) { continue; } wrapper.AddVariable(variable); } } if (currentMember is IUnresolvedParameterizedMember && !(node is AstType)) { var param = (IParameterizedMember)currentMember.CreateResolved(ctx); foreach (var p in param.Parameters) { wrapper.AddVariable(p); } } if (currentMember is IUnresolvedMethod) { var method = (IUnresolvedMethod)currentMember; foreach (var p in method.TypeParameters) { wrapper.AddTypeParameter(p); } } Func<IType, IType> typePred = null; if (IsAttributeContext(node)) { var attribute = Compilation.FindType(KnownTypeCode.Attribute); typePred = t => { return t.GetAllBaseTypeDefinitions().Any(bt => bt.Equals(attribute)) ? t : null; }; } AddTypesAndNamespaces(wrapper, state, node, typePred); wrapper.Result.Add(factory.CreateLiteralCompletionData("global")); if (!(node is AstType)) { if (currentMember != null || node is Expression) { AddKeywords(wrapper, statementStartKeywords); AddKeywords(wrapper, expressionLevelKeywords); if (node is TypeDeclaration) AddKeywords(wrapper, typeLevelKeywords); } else if (currentType != null) { AddKeywords(wrapper, typeLevelKeywords); } else { AddKeywords(wrapper, globalLevelKeywords); } var prop = currentMember as IUnresolvedProperty; if (prop != null && prop.Setter != null && prop.Setter.Region.IsInside(location)) { wrapper.AddCustom("value"); } if (currentMember is IUnresolvedEvent) { wrapper.AddCustom("value"); } if (IsInSwitchContext(node)) { wrapper.AddCustom("case"); } } else { if (((AstType)node).Parent is ParameterDeclaration) { AddKeywords(wrapper, parameterTypePredecessorKeywords); } } AddKeywords(wrapper, primitiveTypesKeywords); if (currentMember != null) { wrapper.AddCustom("var"); } wrapper.Result.AddRange(factory.CreateCodeTemplateCompletionData()); if (node != null && node.Role == Roles.Argument) { var resolved = ResolveExpression(node.Parent, unit); var invokeResult = resolved != null ? resolved.Item1 as CSharpInvocationResolveResult : null; if (invokeResult != null) { int argNum = 0; foreach (var arg in node.Parent.Children.Where (c => c.Role == Roles.Argument)) { if (arg == node) { break; } argNum++; } var param = argNum < invokeResult.Member.Parameters.Count ? invokeResult.Member.Parameters [argNum] : null; if (param != null && param.Type.Kind == TypeKind.Enum) { AddEnumMembers(wrapper, param.Type, state); } } } if (node is Expression) { var astResolver = new CSharpAstResolver(state, unit, CSharpParsedFile); foreach (var type in CreateFieldAction.GetValidTypes(astResolver, (Expression)node)) { if (type.Kind == TypeKind.Enum) { AddEnumMembers(wrapper, type, state); } else if (type.Kind == TypeKind.Delegate) { AddDelegateHandlers(wrapper, type, true, true); AutoSelect = false; AutoCompleteEmptyMatch = false; } } } // 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) { wrapper.AddCustom("this"); } }
void AddTypesAndNamespaces(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Func<IType, IType> typePred = null, Predicate<IMember> memberPred = null, Action<ICompletionData, IType> callback = null) { var lookup = new MemberLookup( ctx.CurrentTypeDefinition, Compilation.MainAssembly ); if (currentType != null) { for (var ct = currentType; ct != null; ct = ct.DeclaringTypeDefinition) { foreach (var nestedType in ct.NestedTypes) { string name = nestedType.Name; if (IsAttributeContext(node) && name.EndsWith("Attribute") && name.Length > "Attribute".Length) { name = name.Substring(0, name.Length - "Attribute".Length); } if (typePred == null) { wrapper.AddType(nestedType, name); continue; } var type = typePred(nestedType.Resolve(ctx)); if (type != null) { var a2 = wrapper.AddType(type, name); if (a2 != null && callback != null) { callback(a2, type); } } continue; } } if (this.currentMember != null && !(node is AstType)) { var def = ctx.CurrentTypeDefinition ?? Compilation.MainAssembly.GetTypeDefinition(currentType); if (def != null) { bool isProtectedAllowed = true; foreach (var member in def.GetMembers ()) { if (member is IMethod && ((IMethod)member).FullName == "System.Object.Finalize") { continue; } if (member.EntityType == EntityType.Operator) { continue; } if (member.IsExplicitInterfaceImplementation) { continue; } if (!lookup.IsAccessible(member, isProtectedAllowed)) { continue; } if (memberPred == null || memberPred(member)) { wrapper.AddMember(member); } } var declaring = def.DeclaringTypeDefinition; while (declaring != null) { foreach (var member in declaring.GetMembers (m => m.IsStatic)) { if (memberPred == null || memberPred(member)) { wrapper.AddMember(member); } } declaring = declaring.DeclaringTypeDefinition; } } } foreach (var p in currentType.TypeParameters) { wrapper.AddTypeParameter(p); } } var scope = CSharpParsedFile.GetUsingScope(location).Resolve(Compilation); for (var n = scope; n != null; n = n.Parent) { foreach (var pair in n.UsingAliases) { wrapper.AddNamespace(pair.Key); } foreach (var u in n.Usings) { foreach (var type in u.Types) { if (!lookup.IsAccessible(type, false)) continue; IType addType = typePred != null ? typePred(type) : type; if (addType != null) { string name = type.Name; if (IsAttributeContext(node) && name.EndsWith("Attribute") && name.Length > "Attribute".Length) { name = name.Substring(0, name.Length - "Attribute".Length); } var a = wrapper.AddType(addType, name); if (a != null && callback != null) { callback(a, type); } } } } foreach (var type in n.Namespace.Types) { if (!lookup.IsAccessible(type, false)) continue; IType addType = typePred != null ? typePred(type) : type; if (addType != null) { var a2 = wrapper.AddType(addType, addType.Name); if (a2 != null && callback != null) { callback(a2, type); } } } foreach (var curNs in n.Namespace.ChildNamespaces) { wrapper.AddNamespace(curNs.Name); } } }
void AddTypesAndNamespaces(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Func<IType, IType> typePred = null, Predicate<IMember> memberPred = null, Action<ICompletionData, IType> callback = null, bool onlyAddConstructors = false) { var lookup = new MemberLookup(ctx.CurrentTypeDefinition, Compilation.MainAssembly); if (currentType != null) { for (var ct = ctx.CurrentTypeDefinition; ct != null; ct = ct.DeclaringTypeDefinition) { foreach (var nestedType in ct.GetNestedTypes ()) { if (!lookup.IsAccessible (nestedType.GetDefinition (), true)) continue; if (onlyAddConstructors) { if (!nestedType.GetConstructors().Any(c => lookup.IsAccessible(c, true))) continue; } if (typePred == null) { if (onlyAddConstructors) wrapper.AddConstructors (nestedType, false, IsAttributeContext(node)); else wrapper.AddType(nestedType, false, IsAttributeContext(node)); continue; } var type = typePred(nestedType); if (type != null) { var a2 = onlyAddConstructors ? wrapper.AddConstructors(type, false, IsAttributeContext(node)) : wrapper.AddType(type, false, IsAttributeContext(node)); if (a2 != null && callback != null) { callback(a2, type); } } continue; } } if (this.currentMember != null && !(node is AstType)) { var def = ctx.CurrentTypeDefinition; if (def == null && currentType != null) def = Compilation.MainAssembly.GetTypeDefinition(currentType.FullTypeName); if (def != null) { bool isProtectedAllowed = true; foreach (var member in def.GetMembers (m => currentMember.IsStatic ? m.IsStatic : true)) { if (member is IMethod && ((IMethod)member).FullName == "System.Object.Finalize") { continue; } if (member.SymbolKind == SymbolKind.Operator) { continue; } if (member.IsExplicitInterfaceImplementation) { continue; } if (!lookup.IsAccessible(member, isProtectedAllowed)) { continue; } if (memberPred == null || memberPred(member)) { wrapper.AddMember(member); } } var declaring = def.DeclaringTypeDefinition; while (declaring != null) { foreach (var member in declaring.GetMembers (m => m.IsStatic)) { if (memberPred == null || memberPred(member)) { wrapper.AddMember(member); } } declaring = declaring.DeclaringTypeDefinition; } } } if (ctx.CurrentTypeDefinition != null) { foreach (var p in ctx.CurrentTypeDefinition.TypeParameters) { wrapper.AddTypeParameter(p); } } } var scope = ctx.CurrentUsingScope; for (var n = scope; n != null; n = n.Parent) { foreach (var pair in n.UsingAliases) { wrapper.AddAlias(pair.Key); } foreach (var alias in n.ExternAliases) { wrapper.AddAlias(alias); } foreach (var u in n.Usings) { foreach (var type in u.Types) { if (!lookup.IsAccessible(type, false)) continue; IType addType = typePred != null ? typePred(type) : type; if (onlyAddConstructors && addType != null) { if (!addType.GetConstructors().Any(c => lookup.IsAccessible(c, true))) continue; } if (addType != null) { var a = onlyAddConstructors ? wrapper.AddConstructors(addType, false, IsAttributeContext(node)) : wrapper.AddType(addType, false, IsAttributeContext(node)); if (a != null && callback != null) { callback(a, type); } } } } foreach (var type in n.Namespace.Types) { if (!lookup.IsAccessible(type, false)) continue; IType addType = typePred != null ? typePred(type) : type; if (onlyAddConstructors && addType != null) { if (!addType.GetConstructors().Any(c => lookup.IsAccessible(c, true))) continue; } if (addType != null) { var a2 = onlyAddConstructors ? wrapper.AddConstructors(addType, false, IsAttributeContext(node)) : wrapper.AddType(addType, false); if (a2 != null && callback != null) { callback(a2, type); } } } foreach (var curNs in n.Namespace.ChildNamespaces) { wrapper.AddNamespace(lookup, curNs); } } if (node is AstType && node.Parent is Constraint && IncludeKeywordsInCompletionList) { wrapper.AddCustom ("new()"); } if (AutomaticallyAddImports) { state = GetState(); foreach (var type in Compilation.GetAllTypeDefinitions ()) { if (!lookup.IsAccessible (type, false)) continue; var resolveResult = state.LookupSimpleNameOrTypeName(type.Name, type.TypeArguments, NameLookupMode.Expression); if (resolveResult.Type.GetDefinition () == type) continue; if (onlyAddConstructors) { if (!type.GetConstructors().Any(c => lookup.IsAccessible(c, true))) continue; } wrapper.AddTypeImport(type, !resolveResult.IsError, onlyAddConstructors); } } }
void AddTypesAndNamespaces(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Predicate<IType> typePred = null, Predicate<IMember> memberPred = null) { var currentMember = ctx.CurrentMember; if (currentType != null) { for (var ct = currentType; ct != null; ct = ct.DeclaringTypeDefinition) { foreach (var nestedType in ct.NestedTypes) { if (typePred == null || typePred (nestedType.Resolve (ctx))) { string name = nestedType.Name; if (node is Attribute && name.EndsWith ("Attribute") && name.Length > "Attribute".Length) name = name.Substring (0, name.Length - "Attribute".Length); wrapper.AddType (nestedType, name); } } } if (this.currentMember != null) { var def = ctx.CurrentTypeDefinition ?? Compilation.MainAssembly.GetTypeDefinition (currentType); foreach (var member in def.GetMembers ()) { if (memberPred == null || memberPred (member)) wrapper.AddMember (member); } var declaring = def.DeclaringTypeDefinition; while (declaring != null) { foreach (var member in declaring.GetMembers (m => m.IsStatic)) { if (memberPred == null || memberPred (member)) wrapper.AddMember (member); } declaring = declaring.DeclaringTypeDefinition; } } foreach (var p in currentType.TypeParameters) { wrapper.AddTypeParameter (p); } } for (var n = state.CurrentUsingScope; n != null; n = n.Parent) { foreach (var pair in n.UsingAliases) { wrapper.AddNamespace (pair.Key); } foreach (var u in n.Usings) { foreach (var type in u.Types) { if (typePred == null || typePred (type)) { string name = type.Name; if (node is Attribute && name.EndsWith ("Attribute") && name.Length > "Attribute".Length) name = name.Substring (0, name.Length - "Attribute".Length); wrapper.AddType (type, name); } } } foreach (var type in n.Namespace.Types) { if (typePred == null || typePred (type)) wrapper.AddType (type, type.Name); } foreach (var curNs in n.Namespace.ChildNamespaces) { wrapper.AddNamespace (curNs.Name); } } }
void AddContextCompletion(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node) { if (state != null) { foreach (var variable in state.LocalVariables) { wrapper.AddVariable (variable); } } if (currentMember is IUnresolvedParameterizedMember) { var param = (IParameterizedMember)currentMember.CreateResolved (ctx); foreach (var p in param.Parameters) { wrapper.AddVariable (p); } } if (currentMember is IUnresolvedMethod) { var method = (IUnresolvedMethod)currentMember; foreach (var p in method.TypeParameters) { wrapper.AddTypeParameter (p); } } Predicate<IType> typePred = null; if (node is Attribute) { var attribute = Compilation.FindType (typeof(System.Attribute)); typePred = t => { return t.GetAllBaseTypeDefinitions ().Any (bt => bt.Equals (attribute)); }; } AddTypesAndNamespaces (wrapper, state, node, typePred); wrapper.Result.Add (factory.CreateLiteralCompletionData ("global")); if (currentMember != null) { AddKeywords (wrapper, statementStartKeywords); AddKeywords (wrapper, expressionLevelKeywords); } else if (currentType != null) { AddKeywords (wrapper, typeLevelKeywords); } else { AddKeywords (wrapper, globalLevelKeywords); } var prop = currentMember as IUnresolvedProperty; if (prop != null && prop.Setter != null && prop.Setter.Region.IsInside (location)) wrapper.AddCustom ("value"); if (currentMember is IUnresolvedEvent) wrapper.AddCustom ("value"); if (IsInSwitchContext (node)) { wrapper.AddCustom ("case"); wrapper.AddCustom ("default"); } AddKeywords (wrapper, primitiveTypesKeywords); wrapper.Result.AddRange (factory.CreateCodeTemplateCompletionData ()); if (node.Role == AstNode.Roles.Argument) { var resolved = ResolveExpression (CSharpParsedFile, node.Parent, Unit); var invokeResult = resolved != null ? resolved.Item1 as CSharpInvocationResolveResult : null; if (invokeResult != null) { int argNum = 0; foreach (var arg in node.Parent.Children.Where (c => c.Role == AstNode.Roles.Argument)) { if (arg == node) break; argNum++; } var param = argNum < invokeResult.Member.Parameters.Count ? invokeResult.Member.Parameters [argNum] : null; if (param != null && param.Type.Kind == TypeKind.Enum) { AddEnumMembers (wrapper, param.Type, state); } } } }
void AddTypesAndNamespaces(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Func<IType, IType> typePred = null, Predicate<IMember> memberPred = null, Action<ICompletionData, IType> callback = null) { var lookup = new MemberLookup(ctx.CurrentTypeDefinition, Compilation.MainAssembly); if (currentType != null) { for (var ct = ctx.CurrentTypeDefinition; ct != null; ct = ct.DeclaringTypeDefinition) { foreach (var nestedType in ct.GetNestedTypes ()) { if (!lookup.IsAccessible (nestedType.GetDefinition (), true)) continue; if (typePred == null) { wrapper.AddType(nestedType, false, IsAttributeContext(node)); continue; } var type = typePred(nestedType); if (type != null) { var a2 = wrapper.AddType(type, false, IsAttributeContext(node)); if (a2 != null && callback != null) { callback(a2, type); } } continue; } } if (this.currentMember != null && !(node is AstType)) { var def = ctx.CurrentTypeDefinition; if (def == null && currentType != null) def = Compilation.MainAssembly.GetTypeDefinition(currentType.FullTypeName); if (def != null) { bool isProtectedAllowed = true; foreach (var member in def.GetMembers (m => currentMember.IsStatic ? m.IsStatic : true)) { if (member is IMethod && ((IMethod)member).FullName == "System.Object.Finalize") { continue; } if (member.EntityType == EntityType.Operator) { continue; } if (member.IsExplicitInterfaceImplementation) { continue; } if (!lookup.IsAccessible(member, isProtectedAllowed)) { continue; } if (memberPred == null || memberPred(member)) { wrapper.AddMember(member); } } var declaring = def.DeclaringTypeDefinition; while (declaring != null) { foreach (var member in declaring.GetMembers (m => m.IsStatic)) { if (memberPred == null || memberPred(member)) { wrapper.AddMember(member); } } declaring = declaring.DeclaringTypeDefinition; } } } if (ctx.CurrentTypeDefinition != null) { foreach (var p in ctx.CurrentTypeDefinition.TypeParameters) { wrapper.AddTypeParameter(p); } } } var scope = ctx.CurrentUsingScope; for (var n = scope; n != null; n = n.Parent) { foreach (var pair in n.UsingAliases) { wrapper.AddAlias(pair.Key); } foreach (var alias in n.ExternAliases) { wrapper.AddAlias(alias); } foreach (var u in n.Usings) { foreach (var type in u.Types) { if (!lookup.IsAccessible(type, false)) continue; IType addType = typePred != null ? typePred(type) : type; if (addType != null) { var a = wrapper.AddType(addType, false, IsAttributeContext(node)); if (a != null && callback != null) { callback(a, type); } } } } foreach (var type in n.Namespace.Types) { if (!lookup.IsAccessible(type, false)) continue; IType addType = typePred != null ? typePred(type) : type; if (addType != null) { var a2 = wrapper.AddType(addType, false); if (a2 != null && callback != null) { callback(a2, type); } } } foreach (var curNs in n.Namespace.ChildNamespaces) { wrapper.AddNamespace(lookup, curNs); } } if (node is AstType && node.Parent is Constraint) { wrapper.AddCustom ("new()"); } }
void AddContextCompletion(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node) { if (state != null) { foreach (var variable in state.LocalVariables) { wrapper.AddVariable (variable); } } if (ctx.CurrentMember is IParameterizedMember) { var param = (IParameterizedMember)ctx.CurrentMember; foreach (var p in param.Parameters) { wrapper.AddVariable (p); } } if (currentMember is IUnresolvedMethod) { var method = (IUnresolvedMethod)currentMember; foreach (var p in method.TypeParameters) { wrapper.AddTypeParameter (p); } } Predicate<IType> typePred = null; if (node is Attribute) { var attribute = Compilation.FindType (typeof (System.Attribute)); typePred = t => { return t.GetAllBaseTypeDefinitions ().Any (bt => bt.Equals (attribute)); }; } AddTypesAndNamespaces (wrapper, state, node, typePred); wrapper.Result.Add (factory.CreateLiteralCompletionData ("global")); if (state.CurrentMember != null) { AddKeywords (wrapper, statementStartKeywords); AddKeywords (wrapper, expressionLevelKeywords); } else if (state.CurrentTypeDefinition != null) { AddKeywords (wrapper, typeLevelKeywords); } else { AddKeywords (wrapper, globalLevelKeywords); } var prop = currentMember as IUnresolvedProperty; if (prop != null && prop.Setter.Region.IsInside (location)) wrapper.AddCustom ("value"); if (currentMember is IUnresolvedEvent) wrapper.AddCustom ("value"); if (IsInSwitchContext (node)) { wrapper.AddCustom ("case"); wrapper.AddCustom ("default"); } AddKeywords (wrapper, primitiveTypesKeywords); wrapper.Result.AddRange (factory.CreateCodeTemplateCompletionData ()); }