2
// MonoCSharpCompletionEngine.cs
5
// Mike Krüger <mkrueger@xamarin.com>
7
// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com)
9
// Permission is hereby granted, free of charge, to any person obtaining a copy
10
// of this software and associated documentation files (the "Software"), to deal
11
// in the Software without restriction, including without limitation the rights
12
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
// copies of the Software, and to permit persons to whom the Software is
14
// furnished to do so, subject to the following conditions:
16
// The above copyright notice and this permission notice shall be included in
17
// all copies or substantial portions of the Software.
19
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
using ICSharpCode.NRefactory.CSharp.Completion;
28
using System.Collections.Generic;
29
using MonoDevelop.CodeGeneration;
30
using ICSharpCode.NRefactory.TypeSystem;
32
using MonoDevelop.CSharp.Refactoring.CodeActions;
33
using ICSharpCode.NRefactory.Editor;
35
namespace MonoDevelop.CSharp.Completion
37
class MonoCSharpCompletionEngine : CSharpCompletionEngine
39
readonly CSharpCompletionTextEditorExtension ext;
41
public CSharpCompletionTextEditorExtension Ext {
47
public MDRefactoringContext MDRefactoringCtx {
49
return ext.MDRefactoringCtx;
53
public MonoCSharpCompletionEngine (CSharpCompletionTextEditorExtension ext, ICSharpCode.NRefactory.Editor.IDocument document, ICompletionContextProvider completionContextProvider, ICompletionDataFactory factory, ICSharpCode.NRefactory.TypeSystem.IProjectContent content, ICSharpCode.NRefactory.CSharp.TypeSystem.CSharpTypeResolveContext ctx) : base (document, completionContextProvider, factory, content, ctx)
58
protected override void AddVirtuals (List<IMember> alreadyInserted, CompletionDataWrapper col, string modifiers, IType curType, int declarationBegin)
60
base.AddVirtuals (alreadyInserted, col, modifiers, curType, declarationBegin);
61
foreach (var member in GetProtocolMembers (curType)) {
62
if (alreadyInserted.Contains (member))
64
if (BaseExportCodeGenerator.IsImplemented (curType, member))
66
alreadyInserted.Add (member);
67
var data = new ProtocolCompletionData (this, declarationBegin, member);
72
IEnumerable<IMember> GetProtocolMembers (IType curType)
74
foreach (var t in curType.DirectBaseTypes) {
76
if (!BaseExportCodeGenerator.HasProtocolAttribute (t, out name))
78
var protocolType = Compilation.FindType (new FullTypeName (new TopLevelTypeName (t.Namespace, name)));
79
if (protocolType == null)
81
foreach (var member in protocolType.GetMethods (null, GetMemberOptions.IgnoreInheritedMembers)) {
82
if (member.ImplementedInterfaceMembers.Any () || member.IsAbstract || !member.IsVirtual)
84
if (member.Attributes.Any (a => a.AttributeType.Name == "ExportAttribute" && a.AttributeType.Namespace == "MonoTouch.Foundation")) {
88
foreach (var member in protocolType.GetProperties (null, GetMemberOptions.IgnoreInheritedMembers)) {
89
if (member.ImplementedInterfaceMembers.Any () || member.IsAbstract || !member.IsVirtual)
91
if (member.CanGet && member.Getter.Attributes.Any (a => a.AttributeType.Name == "ExportAttribute" && a.AttributeType.Namespace == "MonoTouch.Foundation") ||
92
member.CanSet && member.Setter.Attributes.Any (a => a.AttributeType.Name == "ExportAttribute" && a.AttributeType.Namespace == "MonoTouch.Foundation"))