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()); }
public override bool HandleKeyPress(CodeEditorControl editor, char ch) { VBExpressionFinder ef = new VBExpressionFinder(); 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 "For Each": case "typeof": 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 == null || 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"))) { //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 == '\n') { 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)); }