From 249752087ef841a6ede2a075bf17a6adaa37d1c2 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Tue, 2 Apr 2019 21:55:37 -0700 Subject: [PATCH] Fix csharp intellisense in _Imports.razor (dotnet/aspnetcore-tooling#387) * Fix csharp intellisense in _Imports.razor * Feedback \n\nCommit migrated from https://github.com/dotnet/aspnetcore-tooling/commit/229951a5c8640651f9724fda38361601ed5fa286 --- ...faultRazorIntermediateNodeLoweringPhase.cs | 75 +++++++++++++++++-- 1 file changed, 70 insertions(+), 5 deletions(-) diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorIntermediateNodeLoweringPhase.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorIntermediateNodeLoweringPhase.cs index 232ce738fb..7056b178e7 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorIntermediateNodeLoweringPhase.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorIntermediateNodeLoweringPhase.cs @@ -1885,36 +1885,101 @@ namespace Microsoft.AspNetCore.Razor.Language { _document.Diagnostics.Add( ComponentDiagnosticFactory.Create_UnsupportedComponentImportContent(BuildSourceSpanFromNode(node))); + + base.VisitMarkupElement(node); } public override void VisitMarkupCommentBlock(MarkupCommentBlockSyntax node) { _document.Diagnostics.Add( ComponentDiagnosticFactory.Create_UnsupportedComponentImportContent(BuildSourceSpanFromNode(node))); + + base.VisitMarkupCommentBlock(node); } public override void VisitMarkupTagHelperElement(MarkupTagHelperElementSyntax node) { _document.Diagnostics.Add( ComponentDiagnosticFactory.Create_UnsupportedComponentImportContent(BuildSourceSpanFromNode(node))); - } - public override void VisitCSharpImplicitExpression(CSharpImplicitExpressionSyntax node) - { - _document.Diagnostics.Add( - ComponentDiagnosticFactory.Create_UnsupportedComponentImportContent(BuildSourceSpanFromNode(node))); + base.VisitMarkupTagHelperElement(node); } public override void VisitCSharpExplicitExpression(CSharpExplicitExpressionSyntax node) { _document.Diagnostics.Add( ComponentDiagnosticFactory.Create_UnsupportedComponentImportContent(BuildSourceSpanFromNode(node))); + + base.VisitCSharpExplicitExpression(node); + } + + public override void VisitCSharpImplicitExpression(CSharpImplicitExpressionSyntax node) + { + // We typically don't want C# in imports files except for directives. But since Razor directive intellisense + // is tied to C# intellisense during design time, we want to still generate and IR node for implicit expressions. + // Otherwise, there will be no source mapping when someone types an `@` leading to no intellisense. + if (node.FirstAncestorOrSelf(n => n is MarkupStartTagSyntax || n is MarkupEndTagSyntax) != null) + { + // We don't care about implicit expresssion in attributes. + return; + } + + var expressionNode = new CSharpExpressionIntermediateNode(); + + _builder.Push(expressionNode); + + base.VisitCSharpImplicitExpression(node); + + _builder.Pop(); + + if (expressionNode.Children.Count > 0) + { + var sourceRangeStart = expressionNode + .Children + .FirstOrDefault(child => child.Source != null) + ?.Source; + + if (sourceRangeStart != null) + { + var contentLength = expressionNode.Children.Sum(child => child.Source?.Length ?? 0); + + expressionNode.Source = new SourceSpan( + sourceRangeStart.Value.FilePath ?? SourceDocument.FilePath, + sourceRangeStart.Value.AbsoluteIndex, + sourceRangeStart.Value.LineIndex, + sourceRangeStart.Value.CharacterIndex, + contentLength); + } + } + + _document.Diagnostics.Add( + ComponentDiagnosticFactory.Create_UnsupportedComponentImportContent(expressionNode.Source)); + + base.VisitCSharpImplicitExpression(node); + } + + public override void VisitCSharpExpressionLiteral(CSharpExpressionLiteralSyntax node) + { + if (node.FirstAncestorOrSelf(n => n is CSharpImplicitExpressionSyntax) == null) + { + // We only care about implicit expressions. + return; + } + + _builder.Add(new IntermediateToken() + { + Content = node.GetContent(), + Kind = TokenKind.CSharp, + Source = BuildSourceSpanFromNode(node), + }); } public override void VisitCSharpStatement(CSharpStatementSyntax node) { _document.Diagnostics.Add( ComponentDiagnosticFactory.Create_UnsupportedComponentImportContent(BuildSourceSpanFromNode(node))); + + base.VisitCSharpStatement(node); } }