201
238
// timer.Dispose ();
242
class CSharpCompletionDataList : CompletionDataList
244
public CSharpResolver Resolver {
252
CSharpCompletionDataList List { get; set; }
205
255
ICompletionDataList InternalHandleCodeCompletion (CodeCompletionContext completionContext, char completionChar, bool ctrlSpace, ref int triggerWordLength)
208
if (textEditorData.CurrentMode is CompletionTextLinkMode) {
209
if (!((CompletionTextLinkMode)textEditorData.CurrentMode).TriggerCodeCompletion)
257
var data = TextEditorData;
258
if (data.CurrentMode is TextLinkEditMode) {
259
if (((TextLinkEditMode)data.CurrentMode).TextLinkMode == TextLinkMode.EditIdentifier)
211
} else if (textEditorData.CurrentMode is Mono.TextEditor.TextLinkEditMode) {
214
if (Unit == null || CSharpParsedFile == null)
216
var list = new CompletionDataList ();
262
if (Unit == null || CSharpUnresolvedFile == null)
264
if(typeSystemSegmentTree == null)
267
var list = new CSharpCompletionDataList ();
268
list.Resolver = CSharpUnresolvedFile != null ? CSharpUnresolvedFile.GetResolver (UnresolvedFileCompilation, Document.Editor.Caret.Location) : new CSharpResolver (Compilation);
269
var ctx = CSharpUnresolvedFile.GetTypeResolveContext (UnresolvedFileCompilation, data.Caret.Location) as CSharpTypeResolveContext;
217
271
var engine = new CSharpCompletionEngine (
218
textEditorData.Document,
273
typeSystemSegmentTree,
274
new CompletionDataFactory (this, new CSharpResolver (ctx)),
220
275
Document.GetProjectContext (),
221
CSharpParsedFile.GetTypeResolveContext (Document.Compilation, document.Editor.Caret.Location) as CSharpTypeResolveContext,
225
engine.MemberProvider = typeSystemSegmentTree;
279
if (Document.HasProject) {
280
var configuration = Document.Project.GetConfiguration (MonoDevelop.Ide.IdeApp.Workspace.ActiveConfiguration) as DotNetProjectConfiguration;
281
var par = configuration != null ? configuration.CompilationParameters as CSharpCompilerParameters : null;
283
engine.LanguageVersion = MonoDevelop.CSharp.Parser.TypeSystemParser.ConvertLanguageVersion (par.LangVersion);
226
286
engine.FormattingPolicy = FormattingPolicy.CreateOptions ();
227
engine.EolMarker = textEditorData.EolMarker;
228
engine.IndentString = textEditorData.Options.IndentationString;
229
list.AddRange (engine.GetCompletionData (completionContext.TriggerOffset, ctrlSpace));
287
engine.EolMarker = data.EolMarker;
288
engine.IndentString = data.Options.IndentationString;
290
foreach (var cd in engine.GetCompletionData (completionContext.TriggerOffset, ctrlSpace)) {
293
((IListData)cd).List = list;
295
} catch (Exception e) {
296
LoggingService.LogError ("Error while getting completion data.", e);
230
298
list.AutoCompleteEmptyMatch = engine.AutoCompleteEmptyMatch;
299
list.AutoCompleteEmptyMatchOnCurlyBrace = engine.AutoCompleteEmptyMatchOnCurlyBracket;
231
300
list.AutoSelect = engine.AutoSelect;
232
301
list.DefaultCompletionString = engine.DefaultCompletionString;
233
302
list.CloseOnSquareBrackets = engine.CloseOnSquareBrackets;
477
598
return parentheses != 1 || bracket > 0 ? -1 : index;
480
602
#region ICompletionDataFactory implementation
481
ICompletionData ICompletionDataFactory.CreateEntityCompletionData (IEntity entity)
483
return new MemberCompletionData (this, entity, OutputFlags.IncludeGenerics | OutputFlags.HideArrayBrackets | OutputFlags.IncludeParameterName) {
484
HideExtensionParameter = true
488
ICompletionData ICompletionDataFactory.CreateEntityCompletionData (IEntity entity, string text)
490
return new CompletionData (text, entity.GetStockIcon (), null, text);
493
ICompletionData ICompletionDataFactory.CreateEntityCompletionData (IUnresolvedEntity entity)
495
var context = CSharpParsedFile.GetTypeResolveContext (Document.Compilation, document.Editor.Caret.Location);
496
var resolvedEntity = ((IUnresolvedMember)entity).CreateResolved (context);
498
return new MemberCompletionData (this, resolvedEntity, OutputFlags.IncludeGenerics | OutputFlags.HideArrayBrackets | OutputFlags.IncludeParameterName) {
499
HideExtensionParameter = true
503
ICompletionData ICompletionDataFactory.CreateEntityCompletionData (IUnresolvedEntity entity, string text)
505
var context = CSharpParsedFile.GetTypeResolveContext (Document.Compilation, document.Editor.Caret.Location);
506
var resolvedEntity = ((IUnresolvedMember)entity).CreateResolved (context);
507
return new MemberCompletionData (this, resolvedEntity, OutputFlags.IncludeGenerics | OutputFlags.HideArrayBrackets | OutputFlags.IncludeParameterName) {
508
HideExtensionParameter = true
512
ICompletionData ICompletionDataFactory.CreateTypeCompletionData (IType type, string shortType)
514
var result = new CompletionData (shortType, type.GetStockIcon ());
515
if (!(type is ParameterizedType) && type.TypeParameterCount > 0) {
516
var sb = new StringBuilder (shortType);
518
for (int i = 0; i < type.TypeParameterCount; i++) {
521
sb.Append (GetAmbience ().GetString (type.GetDefinition ().TypeParameters[i], OutputFlags.ClassBrowserEntries));
524
result.DisplayText = sb.ToString ();
529
ICompletionData ICompletionDataFactory.CreateTypeCompletionData (IUnresolvedTypeDefinition type, string shortType)
531
return new CompletionData (shortType, type.GetStockIcon ());
534
ICompletionData ICompletionDataFactory.CreateLiteralCompletionData (string title, string description, string insertText)
536
return new CompletionData (title, "md-keyword", description, insertText ?? title);
539
ICompletionData ICompletionDataFactory.CreateNamespaceCompletionData (string name)
541
return new CompletionData (name, AstStockIcons.Namespace);
544
ICompletionData ICompletionDataFactory.CreateVariableCompletionData (IVariable variable)
546
return new VariableCompletionData (variable);
549
ICompletionData ICompletionDataFactory.CreateVariableCompletionData (IUnresolvedTypeParameter parameter)
551
return new CompletionData (parameter.Name, parameter.GetStockIcon ());
554
ICompletionData ICompletionDataFactory.CreateEventCreationCompletionData (string varName, IType delegateType, IEvent evt, string parameterDefinition, IUnresolvedMember currentMember, IUnresolvedTypeDefinition currentType)
556
return new EventCreationCompletionData (this, varName, delegateType, evt, parameterDefinition, currentMember, currentType);
559
ICompletionData ICompletionDataFactory.CreateNewOverrideCompletionData (int declarationBegin, IUnresolvedTypeDefinition type, IMember m)
561
return new NewOverrideCompletionData (this, declarationBegin, type, m);
563
ICompletionData ICompletionDataFactory.CreateNewPartialCompletionData (int declarationBegin, IUnresolvedTypeDefinition type, IUnresolvedMember m)
565
var ctx = CSharpParsedFile.GetTypeResolveContext (Compilation, document.Editor.Caret.Location);
566
return new NewOverrideCompletionData (this, declarationBegin, type, m.CreateResolved (ctx));
568
IEnumerable<ICompletionData> ICompletionDataFactory.CreateCodeTemplateCompletionData ()
570
var result = new CompletionDataList ();
571
CodeTemplateService.AddCompletionDataForMime ("text/x-csharp", result);
575
IEnumerable<ICompletionData> ICompletionDataFactory.CreatePreProcessorDefinesCompletionData ()
577
var project = document.Project;
580
var configuration = project.GetConfiguration (MonoDevelop.Ide.IdeApp.Workspace.ActiveConfiguration) as DotNetProjectConfiguration;
581
var par = configuration != null ? configuration.CompilationParameters as CSharpCompilerParameters : null;
584
foreach (var define in par.DefineSymbols.Split (';', ',', ' ', '\t').Where (s => !string.IsNullOrWhiteSpace (s)))
585
yield return new CompletionData (define, "md-keyword");
603
class CompletionDataFactory : ICompletionDataFactory
605
CSharpCompletionTextEditorExtension ext;
606
// readonly CSharpResolver state;
607
readonly TypeSystemAstBuilder builder;
609
public CompletionDataFactory (CSharpCompletionTextEditorExtension ext, CSharpResolver state)
611
// this.state = state;
612
builder = new TypeSystemAstBuilder(state);
616
ICompletionData ICompletionDataFactory.CreateEntityCompletionData (IEntity entity)
618
return new MemberCompletionData (ext, entity, OutputFlags.IncludeGenerics | OutputFlags.HideArrayBrackets | OutputFlags.IncludeParameterName) {
619
HideExtensionParameter = true
623
class GenericTooltipCompletionData : CompletionData, IListData
625
readonly Func<CSharpCompletionDataList, bool, TooltipInformation> tooltipFunc;
627
#region IListData implementation
629
CSharpCompletionDataList list;
630
public CSharpCompletionDataList List {
636
if (overloads != null) {
637
foreach (var overload in overloads.Skip (1)) {
638
var ld = overload as IListData;
648
public GenericTooltipCompletionData (Func<CSharpCompletionDataList, bool, TooltipInformation> tooltipFunc, string text, string icon) : base (text, icon)
650
this.tooltipFunc = tooltipFunc;
653
public GenericTooltipCompletionData (Func<CSharpCompletionDataList, bool, TooltipInformation> tooltipFunc, string text, string icon, string description, string completionText) : base (text, icon, description, completionText)
655
this.tooltipFunc = tooltipFunc;
658
public override TooltipInformation CreateTooltipInformation (bool smartWrap)
660
return tooltipFunc (List, smartWrap);
663
protected List<ICompletionData> overloads;
664
public override bool HasOverloads {
665
get { return overloads != null && overloads.Count > 0; }
668
public override IEnumerable<ICompletionData> OverloadedData {
674
public override void AddOverload (ICSharpCode.NRefactory.Completion.ICompletionData data)
676
if (overloads == null) {
677
overloads = new List<ICompletionData> ();
678
overloads.Add (this);
680
overloads.Add (data);
683
public override void InsertCompletionText (CompletionListWindow window, ref KeyActions ka, Gdk.Key closeChar, char keyChar, Gdk.ModifierType modifier)
685
var currentWord = GetCurrentWord (window);
686
if (CompletionText == "new()" && keyChar == '(') {
687
window.CompletionWidget.SetCompletionText (window.CodeCompletionContext, currentWord, "new");
689
window.CompletionWidget.SetCompletionText (window.CodeCompletionContext, currentWord, CompletionText);
695
class LazyGenericTooltipCompletionData : GenericTooltipCompletionData
697
Lazy<string> displayText;
698
public override string DisplayText {
700
return displayText.Value;
704
public override string CompletionText {
706
return displayText.Value;
710
public LazyGenericTooltipCompletionData (Func<CSharpCompletionDataList, bool, TooltipInformation> tooltipFunc, Lazy<string> displayText, string icon) : base (tooltipFunc, null, icon)
712
this.displayText = displayText;
716
class TypeCompletionData : LazyGenericTooltipCompletionData, IListData
719
CSharpCompletionTextEditorExtension ext;
720
CSharpUnresolvedFile file;
721
ICompilation compilation;
722
// CSharpResolver resolver;
726
return DisplayText + type.TypeParameterCount;
730
public override string CompletionText {
732
if (type.TypeParameterCount > 0 && !type.IsParameterized)
734
return base.CompletionText;
738
public override TooltipInformation CreateTooltipInformation (bool smartWrap)
740
var def = type.GetDefinition ();
741
var result = def != null ? MemberCompletionData.CreateTooltipInformation (compilation, file, List.Resolver, ext.TextEditorData, ext.FormattingPolicy, def, smartWrap) : new TooltipInformation ();
742
if (ConflictingTypes != null) {
743
var conflicts = new StringBuilder ();
744
var sig = new SignatureMarkupCreator (List.Resolver, ext.FormattingPolicy.CreateOptions ());
745
for (int i = 0; i < ConflictingTypes.Count; i++) {
746
var ct = ConflictingTypes[i];
748
conflicts.AppendLine (",");
749
// if ((i + 1) % 5 == 0)
750
// conflicts.Append (Environment.NewLine + "\t");
751
conflicts.Append (sig.GetTypeReferenceString (((TypeCompletionData)ct).type));
753
result.AddCategory ("Type Conflicts", conflicts.ToString ());
758
public TypeCompletionData (IType type, CSharpCompletionTextEditorExtension ext, Lazy<string> displayText, string icon) : base (null, displayText, icon)
762
this.file = ext.CSharpUnresolvedFile;
763
this.compilation = ext.UnresolvedFileCompilation;
766
Dictionary<string, ICSharpCode.NRefactory.Completion.ICompletionData> addedDatas = new Dictionary<string, ICSharpCode.NRefactory.Completion.ICompletionData> ();
768
List<ICompletionData> ConflictingTypes = null;
770
public override void AddOverload (ICSharpCode.NRefactory.Completion.ICompletionData data)
772
if (overloads == null)
773
addedDatas [IdString] = this;
775
if (data is TypeCompletionData) {
776
string id = ((TypeCompletionData)data).IdString;
777
ICompletionData oldData;
778
if (addedDatas.TryGetValue (id, out oldData)) {
779
var old = (TypeCompletionData)oldData;
780
if (old.ConflictingTypes == null)
781
old.ConflictingTypes = new List<ICompletionData> ();
782
old.ConflictingTypes.Add (data);
785
addedDatas [id] = data;
788
base.AddOverload (data);
793
ICompletionData ICompletionDataFactory.CreateEntityCompletionData (IEntity entity, string text)
795
return new GenericTooltipCompletionData ((list, sw) => MemberCompletionData.CreateTooltipInformation (ext, list.Resolver, entity, sw), text, entity.GetStockIcon ());
798
ICompletionData ICompletionDataFactory.CreateTypeCompletionData (IType type, bool showFullName, bool isInAttributeContext)
800
Lazy<string> displayText = new Lazy<string> (delegate {
801
string name = showFullName ? builder.ConvertType(type).ToString() : type.Name;
802
if (isInAttributeContext && name.EndsWith("Attribute") && name.Length > "Attribute".Length) {
803
name = name.Substring(0, name.Length - "Attribute".Length);
808
var result = new TypeCompletionData (type, ext,
810
type.GetStockIcon ());
814
ICompletionData ICompletionDataFactory.CreateMemberCompletionData(IType type, IEntity member)
816
Lazy<string> displayText = new Lazy<string> (delegate {
817
string name = builder.ConvertType(type).ToString();
818
return name + "."+ member.Name;
821
var result = new LazyGenericTooltipCompletionData (
822
(List, sw) => new TooltipInformation (),
824
member.GetStockIcon ());
829
ICompletionData ICompletionDataFactory.CreateLiteralCompletionData (string title, string description, string insertText)
831
return new GenericTooltipCompletionData ((list, smartWrap) => {
832
var sig = new SignatureMarkupCreator (list.Resolver, ext.FormattingPolicy.CreateOptions ());
833
sig.BreakLineAfterReturnType = smartWrap;
834
return sig.GetKeywordTooltip (title, null);
835
}, title, "md-keyword", description, insertText ?? title);
838
ICompletionData ICompletionDataFactory.CreateNamespaceCompletionData (INamespace name)
840
return new CompletionData (name.Name, AstStockIcons.Namespace);
843
ICompletionData ICompletionDataFactory.CreateVariableCompletionData (IVariable variable)
845
return new VariableCompletionData (ext, variable);
848
ICompletionData ICompletionDataFactory.CreateVariableCompletionData (ITypeParameter parameter)
850
return new CompletionData (parameter.Name, parameter.GetStockIcon ());
853
ICompletionData ICompletionDataFactory.CreateEventCreationCompletionData (string varName, IType delegateType, IEvent evt, string parameterDefinition, IUnresolvedMember currentMember, IUnresolvedTypeDefinition currentType)
855
return new EventCreationCompletionData (ext, varName, delegateType, evt, parameterDefinition, currentMember, currentType);
858
ICompletionData ICompletionDataFactory.CreateNewOverrideCompletionData (int declarationBegin, IUnresolvedTypeDefinition type, IMember m)
860
return new NewOverrideCompletionData (ext, declarationBegin, type, m);
862
ICompletionData ICompletionDataFactory.CreateNewPartialCompletionData (int declarationBegin, IUnresolvedTypeDefinition type, IUnresolvedMember m)
864
var ctx = ext.CSharpUnresolvedFile.GetTypeResolveContext (ext.UnresolvedFileCompilation, ext.document.Editor.Caret.Location);
865
return new NewOverrideCompletionData (ext, declarationBegin, type, m.CreateResolved (ctx));
867
IEnumerable<ICompletionData> ICompletionDataFactory.CreateCodeTemplateCompletionData ()
869
var result = new CompletionDataList ();
870
CodeTemplateService.AddCompletionDataForMime ("text/x-csharp", result);
874
IEnumerable<ICompletionData> ICompletionDataFactory.CreatePreProcessorDefinesCompletionData ()
876
var project = ext.document.Project;
879
var configuration = project.GetConfiguration (MonoDevelop.Ide.IdeApp.Workspace.ActiveConfiguration) as DotNetProjectConfiguration;
880
var par = configuration != null ? configuration.CompilationParameters as CSharpCompilerParameters : null;
883
foreach (var define in par.DefineSymbols.Split (';', ',', ' ', '\t').Where (s => !string.IsNullOrWhiteSpace (s)))
884
yield return new CompletionData (define, "md-keyword");
888
ICompletionData ICompletionDataFactory.CreateImportCompletionData(IType type, bool useFullName)
890
// atm only used in #develop
891
throw new NotImplementedException ();