From 4aef0a218927304c9a20784d587ec2db19738809 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Thu, 13 Sep 2012 21:32:16 +0100 Subject: [PATCH] Add simple dot completion for C# Razor files. Support very basic dot completion for T4MVC code inside a C# Razor file. --- .../AspNet.Mvc/Project/AspNet.Mvc.addin | 12 +++++ .../AspNet.Mvc/Project/AspNet.Mvc.csproj | 5 ++ .../RazorCSharpCompletionBinding.cs | 30 +++++++++++ .../RazorCSharpDotCompletionDataProvider.cs | 23 +++++++++ .../Completion/RazorCSharpExpressionFinder.cs | 43 ++++++++++++++++ .../Src/Completion/RazorCSharpParser.cs | 50 +++++++++++++++++++ .../Project/Src/Folding/FoldGenerator.cs | 2 +- 7 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpCompletionBinding.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpDotCompletionDataProvider.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpExpressionFinder.cs create mode 100644 src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpParser.cs diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.addin b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.addin index 7bdb43077a..d68ee53668 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.addin +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.addin @@ -124,4 +124,16 @@ class="ICSharpCode.AspNet.Mvc.WebProjectOptionsPanel"/> + + + + + + + + diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj index 34524f74cd..1f159d0b72 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj @@ -122,6 +122,10 @@ + + + + @@ -257,6 +261,7 @@ + diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpCompletionBinding.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpCompletionBinding.cs new file mode 100644 index 0000000000..4b8790a13f --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpCompletionBinding.cs @@ -0,0 +1,30 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Editor.CodeCompletion; + +namespace ICSharpCode.AspNet.Mvc.Completion +{ + public class RazorCSharpCompletionBinding : ICodeCompletionBinding + { + public RazorCSharpCompletionBinding() + { + } + + public CodeCompletionKeyPressResult HandleKeyPress(ITextEditor editor, char ch) + { + if (ch == '.') { + new RazorCSharpDotCompletionDataProvider().ShowCompletion(editor); + return CodeCompletionKeyPressResult.Completed; + } + return CodeCompletionKeyPressResult.None; + } + + public bool CtrlSpace(ITextEditor editor) + { + return false; + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpDotCompletionDataProvider.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpDotCompletionDataProvider.cs new file mode 100644 index 0000000000..3e3c647365 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpDotCompletionDataProvider.cs @@ -0,0 +1,23 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver; +using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Editor.CodeCompletion; + +namespace ICSharpCode.AspNet.Mvc.Completion +{ + public class RazorCSharpDotCompletionDataProvider : DotCodeCompletionItemProvider + { + public override ResolveResult Resolve(ITextEditor editor, ExpressionResult expressionResult) + { + ParseInformation parseInfo = ParserService.GetParseInformation(editor.FileName); + NRefactoryResolver resolver = new NRefactoryResolver(LanguageProperties.CSharp); + resolver.LimitMethodExtractionUntilLine = editor.Caret.Line; + return resolver.Resolve(expressionResult, parseInfo, editor.Document.Text); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpExpressionFinder.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpExpressionFinder.cs new file mode 100644 index 0000000000..705f4c8029 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpExpressionFinder.cs @@ -0,0 +1,43 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.AspNet.Mvc.Completion +{ + public class RazorCSharpExpressionFinder : IExpressionFinder + { + public RazorCSharpExpressionFinder() + { + } + + public ExpressionResult FindExpression(string text, int offset) + { + int position = offset - 1; + while (position > 0 && IsValidCharacter(text[position])) { + position--; + } + position++; + string expression = text.Substring(position, offset - position); + return new ExpressionResult(expression); + } + + bool IsValidCharacter(char ch) + { + return Char.IsLetterOrDigit(ch) || + (ch == '.') || + (ch == '_'); + } + + public ExpressionResult FindFullExpression(string text, int offset) + { + return ExpressionResult.Empty; + } + + public string RemoveLastPart(string expression) + { + return expression; + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpParser.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpParser.cs new file mode 100644 index 0000000000..b1a278c26d --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpParser.cs @@ -0,0 +1,50 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.IO; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Dom.CSharp; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.AspNet.Mvc.Completion +{ + public class RazorCSharpParser : IParser + { + public RazorCSharpParser() + { + } + + public string[] LexerTags { get; set; } + + public LanguageProperties Language { + get { return LanguageProperties.CSharp; } + } + + public IExpressionFinder CreateExpressionFinder(string fileName) + { + return new RazorCSharpExpressionFinder(); + } + + public bool CanParse(string fileName) + { + return Path.GetExtension(fileName).Equals(".cshtml", StringComparison.OrdinalIgnoreCase); + } + + public bool CanParse(IProject project) + { + return project.Language == "C#"; + } + + public ICompilationUnit Parse(IProjectContent projectContent, string fileName, ITextBuffer fileContent) + { + return new DefaultCompilationUnit(projectContent); + } + + public IResolver CreateResolver() + { + return null; + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/FoldGenerator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/FoldGenerator.cs index a65867b9bb..9dcefd4b2a 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/FoldGenerator.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/FoldGenerator.cs @@ -30,8 +30,8 @@ namespace ICSharpCode.AspNet.Mvc.Folding public void Dispose() { - IsParseInformationFoldingEnabled = true; textEditor.Dispose(); + IsParseInformationFoldingEnabled = true; } public void GenerateFolds()