private CodeCompletionKeyPressResult?CompleteAssigment(ITextEditor editor, char ch, CSharpExpressionFinder ef) { CodeCompletionKeyPressResult?returnResult = null; string documentText = editor.Document.Text; int position = editor.Caret.Offset - 2; if (position > 0) { ExpressionResult result = ef.FindFullExpression(documentText, position); if (result.Expression != null) { ResolveResult resolveResult = ParserService.Resolve(result, editor.Caret.Line, editor.Caret.Column, editor.Document.Text, documentText, ProjectContent); if (resolveResult != null && resolveResult.ResolvedType != null) { if (ProvideContextCompletion(editor, resolveResult.ResolvedType, ch)) { returnResult = CodeCompletionKeyPressResult.Completed; } } } } return(returnResult); }
void OnToolTipRequest(object sender, TextEditor.ToolTipRequestEventArgs e) { if (e.InDocument && !e.ToolTipShown) { IExpressionFinder expressionFinder; expressionFinder = new CSharpExpressionFinder(mainForm.parseInformation); ExpressionResult expression = expressionFinder.FindFullExpression( editor.Text, editor.Document.PositionToOffset(e.LogicalPosition)); if (expression.Region.IsEmpty) { expression.Region = new DomRegion(e.LogicalPosition.Line + 1, e.LogicalPosition.Column + 1); } TextEditor.TextArea textArea = editor.ActiveTextAreaControl.TextArea; NRefactoryResolver resolver = new NRefactoryResolver(mainForm.myProjectContent.Language); ResolveResult rr = resolver.Resolve(expression, mainForm.parseInformation, textArea.MotherTextEditorControl.Text); string toolTipText = GetText(rr); if (toolTipText != null) { e.ShowToolTip(toolTipText); } } }
private object GetParameter() { var expressionFinder = new CSharpExpressionFinder(ParserService.GetParseInformation(AssociatedObject.Text, ProjectContent)); var caret = AssociatedObject.TextArea.Caret; var result = expressionFinder.FindFullExpression(AssociatedObject.Text, caret.Offset); var resolveResult = ParserService.Resolve(result, caret.Line, caret.Column, AssociatedObject.Text, ProjectContent); if (resolveResult == null || !resolveResult.IsValid) { return(null); } if (resolveResult is MemberResolveResult) { return(((MemberResolveResult)resolveResult).ResolvedMember); } if (resolveResult is TypeResolveResult) { return(((TypeResolveResult)resolveResult).ResolvedClass); } if (resolveResult is NamespaceResolveResult) { return(new NamespaceEntry(((NamespaceResolveResult)resolveResult).Name)); } return(null); }
void FindFull(string program, string location, string expectedExpression, ExpressionContext expectedContext) { int pos = program.IndexOf(location); if (pos < 0) { Assert.Fail("location not found in program"); } ExpressionResult er = ef.FindFullExpression(program, pos); Assert.AreEqual(expectedExpression, er.Expression); Assert.AreEqual(expectedContext.ToString(), er.Context.ToString()); }
private ResolveResult resolveLocation(TextLocation logicalPosition) { var textArea = textEditor.ActiveTextAreaControl.TextArea; var targetText = ""; var targetOffset = 0; if (CodeCompleteCaretLocationOffset.Line == 0) { targetText = textEditor.get_Text();//.Text; targetOffset = textEditor.Document.PositionToOffset(logicalPosition); } else { var firstMethodOffset = calculateFirstMethodOffset(); targetText = getAdjustedSnippetText(textArea, firstMethodOffset); targetOffset = firstMethodOffset + textArea.Caret.Offset; } ExpressionResult expression; //getExpressionFromTextArea(textArea); IExpressionFinder expressionFinder; expressionFinder = new CSharpExpressionFinder(this.parseInformation); expression = expressionFinder.FindFullExpression(targetText, targetOffset); /*IExpressionFinder expressionFinder; * expressionFinder = new CSharpExpressionFinder(this.parseInformation); * ExpressionResult expression = expressionFinder.FindFullExpression( * textEditor.Text, * textEditor.Document.PositionToOffset(logicalPosition)); */ if (expression.Region.IsEmpty) { expression.Region = new DomRegion(logicalPosition.Line + 1, logicalPosition.Column + 1); } NRefactoryResolver resolver = new NRefactoryResolver(this.myProjectContent.Language); ResolveResult rr = resolver.Resolve(expression, this.parseInformation, targetText); //textArea.MotherTextEditorControl.Text); return(rr); }
public override bool HandleKeyPress(CodeEditorControl editor, char ch) { CSharpExpressionFinder ef = new CSharpExpressionFinder(editor.ActiveViewControl.FileName); int cursor = editor.ActiveViewControl.Caret.Offset; ExpressionContext context = null; if (ch == '(') { if (CodeCompletionOptions.KeywordCompletionEnabled) { switch (editor.ActiveViewControl.Caret.CurrentWord.Text.Trim()) { case "for": case "lock": context = ExpressionContext.Default; break; case "using": context = ExpressionContext.TypeDerivingFrom(ScriptControl.Parser.ProjectParser.CurrentProjectContent.GetClass("System.IDisposable"), false); break; case "catch": context = ExpressionContext.TypeDerivingFrom(ScriptControl.Parser.ProjectParser.CurrentProjectContent.GetClass("System.Exception"), false); break; case "foreach": case "typeof": case "sizeof": case "default": context = ExpressionContext.Type; break; } } if (context != null) { if (IsInComment(editor)) { return(false); } editor.ActiveViewControl.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(context), ch); return(true); } else if (EnableMethodInsight) { editor.ActiveViewControl.ShowInsightWindow(new MethodInsightDataProvider()); return(true); } return(false); } else if (ch == '[') { Word curWord = editor.ActiveViewControl.Caret.CurrentWord; //Word preWord = curWord.Row.FormattedWords[curWord.Index-1]; //int lineOffset = editor.ActiveViewControl.Document.Text.Substring(0, editor.ActiveViewControl.Caret.Offset - editor.ActiveViewControl.Caret.Position.X).Length; //TextPoint tp = editor.ActiveViewControl.Document.IntPosToPoint(lineOffset); if (curWord.Text.Length == 0) { // [ is first character on the line // -> Attribute completion editor.ActiveViewControl.ShowCompletionWindow(new AttributesDataProvider(ScriptControl.Parser.ProjectParser.CurrentProjectContent), ch); return(true); } } else if (ch == ',' && CodeCompletionOptions.InsightRefreshOnComma && CodeCompletionOptions.InsightEnabled) { if (InsightRefreshOnComma(editor, ch)) { return(true); } } else if (ch == '=') { string curLine = editor.ActiveViewControl.Caret.CurrentRow.Text; string documentText = ScriptControl.Parser.ProjectParser.GetFileContents(editor.FileName); int position = editor.ActiveViewControl.Caret.Offset - 2; if (position > 0 && (documentText[position + 1] == '+')) { ExpressionResult result = ef.FindFullExpression(documentText, position); if (result.Expression != null) { ResolveResult resolveResult = ScriptControl.Parser.ProjectParser.GetResolver().Resolve(result, editor.ActiveViewControl.Caret.Position.Y + 1, editor.ActiveViewControl.Caret.Position.X + 1, editor.ActiveViewControl.FileName, documentText); if (resolveResult != null && resolveResult.ResolvedType != null) { IClass underlyingClass = resolveResult.ResolvedType.GetUnderlyingClass(); if (underlyingClass == null && resolveResult.ResolvedType.FullyQualifiedName.Length > 0) { underlyingClass = ScriptControl.Parser.ProjectParser.CurrentProjectContent.GetClass(resolveResult.ResolvedType.FullyQualifiedName); } //if (underlyingClass != null && underlyingClass.IsTypeInInheritanceTree(ScriptControl.Parser.ProjectParser.CurrentProjectContent.GetClass("System.MulticastDelegate"))) { if (underlyingClass != null && underlyingClass.IsTypeInInheritanceTree(ScriptControl.Parser.ProjectParser.CurrentProjectContent.GetClass("System.Delegate"))) { //EventHandlerCompletitionDataProvider eventHandlerProvider = new EventHandlerCompletitionDataProvider(result.Expression, resolveResult); //eventHandlerProvider.InsertSpace = true; //editor.ActiveViewControl.ShowCompletionWindow(eventHandlerProvider, ch); } } } } else if (position > 0) { ExpressionResult result = ef.FindFullExpression(documentText, position); if (result.Expression != null) { ResolveResult resolveResult = ScriptControl.Parser.ProjectParser.GetResolver().Resolve(result, editor.ActiveViewControl.Caret.Position.Y + 1, editor.ActiveViewControl.Caret.Position.X + 1, editor.ActiveViewControl.FileName, documentText); if (resolveResult != null && resolveResult.ResolvedType != null) { if (ProvideContextCompletion(editor, resolveResult.ResolvedType, ch)) { return(true); } } } } } else if (ch == ';') { string curLine = editor.ActiveViewControl.Caret.CurrentRow.Text; // don't return true when inference succeeds, otherwise the ';' won't be added to the document. TryDeclarationTypeInference(editor, curLine); } return(base.HandleKeyPress(editor, ch)); }
public override bool HandleKeyPress(SharpDevelopTextAreaControl editor, char ch) { CSharpExpressionFinder ef = CreateExpressionFinder(editor.FileName); int cursor = editor.ActiveTextAreaControl.Caret.Offset; ExpressionContext context = null; if (ch == '(') { if (context != null) { if (IsInComment(editor)) { return(false); } editor.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(context), ch); return(true); } else if (EnableMethodInsight && CodeCompletionOptions.InsightEnabled) { editor.ShowInsightWindow(new MethodInsightDataProvider()); return(true); } return(false); } else if (ch == '[') { LineSegment line = editor.Document.GetLineSegmentForOffset(cursor); if (TextUtilities.FindPrevWordStart(editor.Document, cursor) <= line.Offset) { // [ is first character on the line // -> Attribute completion editor.ShowCompletionWindow(new AttributesDataProvider(ParserService.CurrentProjectContent), ch); return(true); } } else if (ch == ',' && CodeCompletionOptions.InsightRefreshOnComma && CodeCompletionOptions.InsightEnabled) { if (InsightRefreshOnComma(editor, ch)) { return(true); } } else if (ch == '=') { LineSegment curLine = editor.Document.GetLineSegmentForOffset(cursor); string documentText = editor.Text; int position = editor.ActiveTextAreaControl.Caret.Offset - 2; if (position > 0 && (documentText[position + 1] == '+')) { ExpressionResult result = ef.FindFullExpression(documentText, position); if (result.Expression != null) { ResolveResult resolveResult = ParserService.Resolve(result, editor.ActiveTextAreaControl.Caret.Line + 1, editor.ActiveTextAreaControl.Caret.Column + 1, editor.FileName, documentText); if (resolveResult != null && resolveResult.ResolvedType != null) { IClass underlyingClass = resolveResult.ResolvedType.GetUnderlyingClass(); if (underlyingClass != null && underlyingClass.IsTypeInInheritanceTree(ParserService.CurrentProjectContent.GetClass("System.MulticastDelegate", 0))) { EventHandlerCompletitionDataProvider eventHandlerProvider = new EventHandlerCompletitionDataProvider(result.Expression, resolveResult); eventHandlerProvider.InsertSpace = true; editor.ShowCompletionWindow(eventHandlerProvider, ch); } } } } else if (position > 0) { ExpressionResult result = ef.FindFullExpression(documentText, position); if (result.Expression != null) { ResolveResult resolveResult = ParserService.Resolve(result, editor.ActiveTextAreaControl.Caret.Line + 1, editor.ActiveTextAreaControl.Caret.Column + 1, editor.FileName, documentText); if (resolveResult != null && resolveResult.ResolvedType != null) { if (ProvideContextCompletion(editor, resolveResult.ResolvedType, ch)) { return(true); } } } } } else if (ch == '.') { editor.ShowCompletionWindow(new CSharpCodeCompletionDataProvider(), ch); return(true); } else if (ch == '>') { if (IsInComment(editor)) { return(false); } char prevChar = cursor > 1 ? editor.Document.GetCharAt(cursor - 1) : ' '; if (prevChar == '-') { editor.ShowCompletionWindow(new PointerArrowCompletionDataProvider(), ch); return(true); } } if (char.IsLetter(ch) && CodeCompletionOptions.CompleteWhenTyping) { if (editor.ActiveTextAreaControl.SelectionManager.HasSomethingSelected) { // allow code completion when overwriting an identifier cursor = editor.ActiveTextAreaControl.SelectionManager.SelectionCollection[0].Offset; int endOffset = editor.ActiveTextAreaControl.SelectionManager.SelectionCollection[0].EndOffset; // but block code completion when overwriting only part of an identifier if (endOffset < editor.Document.TextLength && char.IsLetterOrDigit(editor.Document.GetCharAt(endOffset))) { return(false); } editor.ActiveTextAreaControl.SelectionManager.RemoveSelectedText(); editor.ActiveTextAreaControl.Caret.Position = editor.Document.OffsetToPosition(cursor); } char prevChar = cursor > 1 ? editor.Document.GetCharAt(cursor - 1) : ' '; bool afterUnderscore = prevChar == '_'; if (afterUnderscore) { cursor--; prevChar = cursor > 1 ? editor.Document.GetCharAt(cursor - 1) : ' '; } if (!char.IsLetterOrDigit(prevChar) && prevChar != '.' && !IsInComment(editor)) { ExpressionResult result = ef.FindExpression(editor.Text, cursor); LoggingService.Debug("CC: Beginning to type a word, result=" + result); if (result.Context != ExpressionContext.IdentifierExpected) { editor.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(result.Context) { ShowTemplates = true, AllowCompleteExistingExpression = afterUnderscore }, '\0'); } } } return(base.HandleKeyPress(editor, ch)); }
public override CodeCompletionKeyPressResult HandleKeyPress(ITextEditor editor, char ch) { CSharpExpressionFinder ef = CreateExpressionFinder(editor.FileName); int cursor = editor.Caret.Offset; if (ch == '[') { var line = editor.Document.GetLineForOffset(cursor); /* TODO: AVALONEDIT Reimplement this * if (TextUtilities.FindPrevWordStart(editor.ActiveTextAreaControl.Document, cursor) <= line.Offset) { * // [ is first character on the line * // -> Attribute completion * editor.ShowCompletionWindow(new AttributesDataProvider(ParserService.CurrentProjectContent), ch); * return true; * }*/ } else if (ch == ',' && CodeCompletionOptions.InsightRefreshOnComma && CodeCompletionOptions.InsightEnabled) { IInsightWindow insightWindow; if (insightHandler.InsightRefreshOnComma(editor, ch, out insightWindow)) { return(CodeCompletionKeyPressResult.Completed); } } else if (ch == '=') { var curLine = editor.Document.GetLineForOffset(cursor); string documentText = editor.Document.Text; int position = editor.Caret.Offset - 2; if (position > 0 && (documentText[position + 1] == '+')) { ExpressionResult result = ef.FindFullExpression(documentText, position); if (result.Expression != null) { ResolveResult resolveResult = ParserService.Resolve(result, editor.Caret.Line, editor.Caret.Column, editor.FileName, documentText); if (resolveResult != null && resolveResult.ResolvedType != null) { IClass underlyingClass = resolveResult.ResolvedType.GetUnderlyingClass(); if (underlyingClass != null && underlyingClass.IsTypeInInheritanceTree(ParserService.CurrentProjectContent.GetClass("System.MulticastDelegate", 0))) { EventHandlerCompletionItemProvider eventHandlerProvider = new EventHandlerCompletionItemProvider(result.Expression, resolveResult); eventHandlerProvider.ShowCompletion(editor); return(CodeCompletionKeyPressResult.Completed); } } } } else if (position > 0) { ExpressionResult result = ef.FindFullExpression(documentText, position); if (result.Expression != null) { ResolveResult resolveResult = ParserService.Resolve(result, editor.Caret.Line, editor.Caret.Column, editor.FileName, documentText); if (resolveResult != null && resolveResult.ResolvedType != null) { if (ProvideContextCompletion(editor, resolveResult.ResolvedType, ch)) { return(CodeCompletionKeyPressResult.Completed); } } } } } else if (ch == '.') { new CSharpCodeCompletionDataProvider().ShowCompletion(editor); return(CodeCompletionKeyPressResult.Completed); } else if (ch == '>') { if (IsInComment(editor)) { return(CodeCompletionKeyPressResult.None); } char prevChar = cursor > 1 ? editor.Document.GetCharAt(cursor - 1) : ' '; if (prevChar == '-') { new PointerArrowCompletionDataProvider().ShowCompletion(editor); return(CodeCompletionKeyPressResult.Completed); } } if (char.IsLetter(ch) && CodeCompletionOptions.CompleteWhenTyping) { if (editor.SelectionLength > 0) { // allow code completion when overwriting an identifier int endOffset = editor.SelectionStart + editor.SelectionLength; // but block code completion when overwriting only part of an identifier if (endOffset < editor.Document.TextLength && char.IsLetterOrDigit(editor.Document.GetCharAt(endOffset))) { return(CodeCompletionKeyPressResult.None); } editor.Document.Remove(editor.SelectionStart, editor.SelectionLength); // Read caret position again after removal - this is required because the document might change in other // locations, too (e.g. bound elements in snippets). cursor = editor.Caret.Offset; } char prevChar = cursor > 1 ? editor.Document.GetCharAt(cursor - 1) : ' '; bool afterUnderscore = prevChar == '_'; if (afterUnderscore) { cursor--; prevChar = cursor > 1 ? editor.Document.GetCharAt(cursor - 1) : ' '; } if (!char.IsLetterOrDigit(prevChar) && prevChar != '.' && !IsInComment(editor)) { ExpressionResult result = ef.FindExpression(editor.Document.Text, cursor); LoggingService.Debug("CC: Beginning to type a word, result=" + result); if (result.Context != ExpressionContext.IdentifierExpected) { var ctrlSpaceProvider = new NRefactoryCtrlSpaceCompletionItemProvider(LanguageProperties.CSharp, result.Context); ctrlSpaceProvider.ShowTemplates = true; ctrlSpaceProvider.AllowCompleteExistingExpression = afterUnderscore; ctrlSpaceProvider.ShowCompletion(editor); return(CodeCompletionKeyPressResult.CompletedIncludeKeyInCompletion); } } } return(base.HandleKeyPress(editor, ch)); }
public override bool HandleKeyPress(SharpDevelopTextAreaControl editor, char ch) { CSharpExpressionFinder ef = new CSharpExpressionFinder(editor.FileName); int cursor = editor.ActiveTextAreaControl.Caret.Offset; ExpressionContext context = null; if (ch == '(') { if (CodeCompletionOptions.KeywordCompletionEnabled) { switch (editor.GetWordBeforeCaret().Trim()) { case "for": case "lock": context = ExpressionContext.Default; break; case "using": context = ExpressionContext.TypeDerivingFrom(ParserService.CurrentProjectContent.GetClass("System.IDisposable"), false); break; case "catch": context = ExpressionContext.TypeDerivingFrom(ParserService.CurrentProjectContent.GetClass("System.Exception"), false); break; case "foreach": case "typeof": case "sizeof": case "default": context = ExpressionContext.Type; break; } } if (context != null) { if (IsInComment(editor)) { return(false); } editor.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(context), ch); return(true); } else if (EnableMethodInsight && CodeCompletionOptions.InsightEnabled) { editor.ShowInsightWindow(new MethodInsightDataProvider()); return(true); } return(false); } else if (ch == '[') { LineSegment line = editor.Document.GetLineSegmentForOffset(cursor); if (TextUtilities.FindPrevWordStart(editor.Document, cursor) <= line.Offset) { // [ is first character on the line // -> Attribute completion editor.ShowCompletionWindow(new AttributesDataProvider(ParserService.CurrentProjectContent), ch); return(true); } } else if (ch == ',' && CodeCompletionOptions.InsightRefreshOnComma && CodeCompletionOptions.InsightEnabled) { if (InsightRefreshOnComma(editor, ch)) { return(true); } } else if (ch == '=') { LineSegment curLine = editor.Document.GetLineSegmentForOffset(cursor); string documentText = editor.Text; int position = editor.ActiveTextAreaControl.Caret.Offset - 2; if (position > 0 && (documentText[position + 1] == '+')) { ExpressionResult result = ef.FindFullExpression(documentText, position); if (result.Expression != null) { ResolveResult resolveResult = ParserService.Resolve(result, editor.ActiveTextAreaControl.Caret.Line + 1, editor.ActiveTextAreaControl.Caret.Column + 1, editor.FileName, documentText); if (resolveResult != null && resolveResult.ResolvedType != null) { IClass underlyingClass = resolveResult.ResolvedType.GetUnderlyingClass(); if (underlyingClass != null && underlyingClass.IsTypeInInheritanceTree(ParserService.CurrentProjectContent.GetClass("System.MulticastDelegate"))) { EventHandlerCompletitionDataProvider eventHandlerProvider = new EventHandlerCompletitionDataProvider(result.Expression, resolveResult); eventHandlerProvider.InsertSpace = true; editor.ShowCompletionWindow(eventHandlerProvider, ch); } } } } else if (position > 0) { ExpressionResult result = ef.FindFullExpression(documentText, position); if (result.Expression != null) { ResolveResult resolveResult = ParserService.Resolve(result, editor.ActiveTextAreaControl.Caret.Line + 1, editor.ActiveTextAreaControl.Caret.Column + 1, editor.FileName, documentText); if (resolveResult != null && resolveResult.ResolvedType != null) { if (ProvideContextCompletion(editor, resolveResult.ResolvedType, ch)) { return(true); } } } } } else if (ch == ';') { LineSegment curLine = editor.Document.GetLineSegmentForOffset(cursor); // don't return true when inference succeeds, otherwise the ';' won't be added to the document. TryDeclarationTypeInference(editor, curLine); } return(base.HandleKeyPress(editor, ch)); }