Skip to content

Compiler: Rework IntermediateToken and LazyIntermediateToken #12032

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,7 @@ public void ModelExpressionPass_NonModelExpressionProperty_Ignored()
var tagHelperNode = documentNode.GetTagHelperNode();
var setProperty = tagHelperNode.Children.OfType<TagHelperPropertyIntermediateNode>().Single();

var token = Assert.IsAssignableFrom<IntermediateToken>(Assert.Single(setProperty.Children));
Assert.True(token.IsCSharp);
var token = Assert.IsAssignableFrom<CSharpIntermediateToken>(Assert.Single(setProperty.Children));
Assert.Equal("17", token.Content);
}

Expand Down Expand Up @@ -86,8 +85,7 @@ public void ModelExpressionPass_ModelExpressionProperty_SimpleExpression()
var expression = Assert.IsType<CSharpExpressionIntermediateNode>(Assert.Single(setProperty.Children));
Assert.Equal("ModelExpressionProvider.CreateModelExpression(ViewData, __model => __model.Bar)", expression.GetCSharpContent());

var originalNode = Assert.IsAssignableFrom<IntermediateToken>(expression.Children[2]);
Assert.Equal(TokenKind.CSharp, originalNode.Kind);
var originalNode = Assert.IsAssignableFrom<CSharpIntermediateToken>(expression.Children[2]);
Assert.Equal("Bar", originalNode.Content);
var source = Assert.NotNull(originalNode.Source);
Assert.Equal(new SourceSpan("test.cshtml", 51, 1, 8, 3), source);
Expand Down Expand Up @@ -123,8 +121,7 @@ public void ModelExpressionPass_ModelExpressionProperty_ComplexExpression()
var expression = Assert.IsType<CSharpExpressionIntermediateNode>(Assert.Single(setProperty.Children));
Assert.Equal("ModelExpressionProvider.CreateModelExpression(ViewData, __model => Bar)", expression.GetCSharpContent());

var originalNode = Assert.IsAssignableFrom<IntermediateToken>(expression.Children[1]);
Assert.Equal(TokenKind.CSharp, originalNode.Kind);
var originalNode = Assert.IsAssignableFrom<CSharpIntermediateToken>(expression.Children[1]);
Assert.Equal("Bar", originalNode.Content);
var source = Assert.NotNull(originalNode.Source);
Assert.Equal(new SourceSpan("test.cshtml", 52, 1, 9, 3), source);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,8 +207,7 @@ public void Execute_AddsRazorViewAttribute_ToViews()
node =>
{
var csharpCode = Assert.IsType<CSharpCodeIntermediateNode>(node);
var token = Assert.IsAssignableFrom<IntermediateToken>(Assert.Single(csharpCode.Children));
Assert.Equal(TokenKind.CSharp, token.Kind);
var token = Assert.IsAssignableFrom<CSharpIntermediateToken>(Assert.Single(csharpCode.Children));
Assert.Equal(expectedAttribute, token.Content);
},
node => Assert.Same(@namespace, node));
Expand Down Expand Up @@ -255,8 +254,7 @@ public void Execute_EscapesViewPathWhenAddingAttributeToViews()
node =>
{
var csharpCode = Assert.IsType<CSharpCodeIntermediateNode>(node);
var token = Assert.IsAssignableFrom<IntermediateToken>(Assert.Single(csharpCode.Children));
Assert.Equal(TokenKind.CSharp, token.Kind);
var token = Assert.IsAssignableFrom<CSharpIntermediateToken>(Assert.Single(csharpCode.Children));
Assert.Equal(expectedAttribute, token.Content);
},
node => Assert.Same(@namespace, node));
Expand Down Expand Up @@ -311,8 +309,7 @@ public void Execute_AddsRazorPagettribute_ToPage()
node =>
{
var csharpCode = Assert.IsType<CSharpCodeIntermediateNode>(node);
var token = Assert.IsAssignableFrom<IntermediateToken>(Assert.Single(csharpCode.Children));
Assert.Equal(TokenKind.CSharp, token.Kind);
var token = Assert.IsAssignableFrom<CSharpIntermediateToken>(Assert.Single(csharpCode.Children));
Assert.Equal(expectedAttribute, token.Content);
},
node => Assert.Same(@namespace, node));
Expand Down Expand Up @@ -358,8 +355,7 @@ public void Execute_EscapesViewPathAndRouteWhenAddingAttributeToPage()
node =>
{
var csharpCode = Assert.IsType<CSharpCodeIntermediateNode>(node);
var token = Assert.IsAssignableFrom<IntermediateToken>(Assert.Single(csharpCode.Children));
Assert.Equal(TokenKind.CSharp, token.Kind);
var token = Assert.IsAssignableFrom<CSharpIntermediateToken>(Assert.Single(csharpCode.Children));
Assert.Equal(expectedAttribute, token.Content);
},
node => Assert.Same(@namespace, node));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,7 @@ public void InstrumentationPass_NoOps_ForDesignTime()

builder.Push(new HtmlContentIntermediateNode());

builder.Add(new IntermediateToken()
{
Content = "Hi",
Kind = TokenKind.Html
});
builder.Add(IntermediateNodeFactory.HtmlToken("Hi"));

builder.Pop();

Expand All @@ -54,12 +50,7 @@ public void InstrumentationPass_InstrumentsHtml()
Source = CreateSource(1),
});

builder.Add(new IntermediateToken()
{
Content = "Hi",
Kind = TokenKind.Html,
Source = CreateSource(1)
});
builder.Add(IntermediateNodeFactory.HtmlToken("Hi", CreateSource(1)));

builder.Pop();

Expand All @@ -85,11 +76,7 @@ public void InstrumentationPass_SkipsHtml_WithoutLocation()

builder.Push(new HtmlContentIntermediateNode());

builder.Add(new IntermediateToken()
{
Content = "Hi",
Kind = TokenKind.Html
});
builder.Add(IntermediateNodeFactory.HtmlToken("Hi"));

builder.Pop();

Expand All @@ -116,11 +103,7 @@ public void InstrumentationPass_InstrumentsCSharpExpression()
Source = CreateSource(2),
});

builder.Add(new IntermediateToken()
{
Content = "Hi",
Kind = TokenKind.CSharp
});
builder.Add(IntermediateNodeFactory.CSharpToken("Hi"));

// Act
ProjectEngine.ExecutePass<InstrumentationPass>(codeDocument, documentNode);
Expand All @@ -144,11 +127,7 @@ public void InstrumentationPass_SkipsCSharpExpression_WithoutLocation()

builder.Push(new CSharpExpressionIntermediateNode());

builder.Add(new IntermediateToken()
{
Content = "Hi",
Kind = TokenKind.CSharp
});
builder.Add(IntermediateNodeFactory.CSharpToken("Hi"));

// Act
ProjectEngine.ExecutePass<InstrumentationPass>(codeDocument, documentNode);
Expand Down Expand Up @@ -177,11 +156,7 @@ public void InstrumentationPass_SkipsCSharpExpression_InsideTagHelperAttribute()
Source = CreateSource(5)
});

builder.Add(new IntermediateToken()
{
Content = "Hi",
Kind = TokenKind.CSharp
});
builder.Add(IntermediateNodeFactory.CSharpToken("Hi"));

// Act
ProjectEngine.ExecutePass<InstrumentationPass>(codeDocument, documentNode);
Expand Down Expand Up @@ -222,11 +197,7 @@ public void InstrumentationPass_SkipsCSharpExpression_InsideTagHelperProperty()
Source = CreateSource(5)
});

builder.Add(new IntermediateToken()
{
Content = "Hi",
Kind = TokenKind.CSharp
});
builder.Add(IntermediateNodeFactory.CSharpToken("Hi"));

// Act
ProjectEngine.ExecutePass<InstrumentationPass>(codeDocument, documentNode);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@ public void ModelExpressionPass_NonModelExpressionProperty_Ignored()
var tagHelperNode = documentNode.GetTagHelperNode();
var setProperty = tagHelperNode.Children.OfType<TagHelperPropertyIntermediateNode>().Single();

var token = Assert.IsAssignableFrom<IntermediateToken>(Assert.Single(setProperty.Children));
Assert.True(token.IsCSharp);
var token = Assert.IsAssignableFrom<CSharpIntermediateToken>(Assert.Single(setProperty.Children));
Assert.Equal("17", token.Content);
}

Expand Down Expand Up @@ -85,8 +84,7 @@ public void ModelExpressionPass_ModelExpressionProperty_SimpleExpression()
var expression = Assert.IsType<CSharpExpressionIntermediateNode>(Assert.Single(setProperty.Children));
Assert.Equal("ModelExpressionProvider.CreateModelExpression(ViewData, __model => __model.Bar)", expression.GetCSharpContent());

var originalNode = Assert.IsAssignableFrom<IntermediateToken>(expression.Children[2]);
Assert.Equal(TokenKind.CSharp, originalNode.Kind);
var originalNode = Assert.IsAssignableFrom<CSharpIntermediateToken>(expression.Children[2]);
Assert.Equal("Bar", originalNode.Content);
var source = Assert.NotNull(originalNode.Source);
Assert.Equal(new SourceSpan("test.cshtml", 51, 1, 8, 3), source);
Expand Down Expand Up @@ -122,8 +120,7 @@ public void ModelExpressionPass_ModelExpressionProperty_ComplexExpression()
var expression = Assert.IsType<CSharpExpressionIntermediateNode>(Assert.Single(setProperty.Children));
Assert.Equal("ModelExpressionProvider.CreateModelExpression(ViewData, __model => Bar)", expression.GetCSharpContent());

var originalNode = Assert.IsAssignableFrom<IntermediateToken>(expression.Children[1]);
Assert.Equal(TokenKind.CSharp, originalNode.Kind);
var originalNode = Assert.IsAssignableFrom<CSharpIntermediateToken>(expression.Children[1]);
Assert.Equal("Bar", originalNode.Content);
var source = Assert.NotNull(originalNode.Source);
Assert.Equal(new SourceSpan("test.cshtml", 52, 1, 9, 3), source);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@ public void ModelExpressionPass_NonModelExpressionProperty_Ignored()
var tagHelperNode = documentNode.GetTagHelperNode();
var setProperty = tagHelperNode.Children.OfType<TagHelperPropertyIntermediateNode>().Single();

var token = Assert.IsAssignableFrom<IntermediateToken>(Assert.Single(setProperty.Children));
Assert.True(token.IsCSharp);
var token = Assert.IsAssignableFrom<CSharpIntermediateToken>(Assert.Single(setProperty.Children));
Assert.Equal("17", token.Content);
}

Expand Down Expand Up @@ -85,8 +84,7 @@ public void ModelExpressionPass_ModelExpressionProperty_SimpleExpression()
var expression = Assert.IsType<CSharpExpressionIntermediateNode>(Assert.Single(setProperty.Children));
Assert.Equal("ModelExpressionProvider.CreateModelExpression(ViewData, __model => __model.Bar)", expression.GetCSharpContent());

var originalNode = Assert.IsAssignableFrom<IntermediateToken>(expression.Children[2]);
Assert.Equal(TokenKind.CSharp, originalNode.Kind);
var originalNode = Assert.IsAssignableFrom<CSharpIntermediateToken>(expression.Children[2]);
Assert.Equal("Bar", originalNode.Content);
var source = Assert.NotNull(originalNode.Source);
Assert.Equal(new SourceSpan("test.cshtml", 51, 1, 8, 3), source);
Expand Down Expand Up @@ -122,8 +120,7 @@ public void ModelExpressionPass_ModelExpressionProperty_ComplexExpression()
var expression = Assert.IsType<CSharpExpressionIntermediateNode>(Assert.Single(setProperty.Children));
Assert.Equal("ModelExpressionProvider.CreateModelExpression(ViewData, __model => Bar)", expression.GetCSharpContent());

var originalNode = Assert.IsAssignableFrom<IntermediateToken>(expression.Children[1]);
Assert.Equal(TokenKind.CSharp, originalNode.Kind);
var originalNode = Assert.IsAssignableFrom<CSharpIntermediateToken>(expression.Children[1]);
Assert.Equal("Bar", originalNode.Content);
var source = Assert.NotNull(originalNode.Source);
Assert.Equal(new SourceSpan("test.cshtml", 52, 1, 9, 3), source);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

using System.Collections.Generic;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Test.Utilities;
Expand Down Expand Up @@ -175,18 +172,14 @@ public void WriteDocument_WritesClass()
var builder = IntermediateNodeBuilder.Create(document);
builder.Add(new ClassDeclarationIntermediateNode()
{
Modifiers =
{
"internal"
},
Modifiers = { "internal" },
BaseType = new BaseTypeWithModel("TestBase"),
Interfaces = [IntermediateToken.CreateCSharpToken("IFoo"), IntermediateToken.CreateCSharpToken("IBar")],
TypeParameters = new List<TypeParameter>
{
new TypeParameter() { ParameterName = "TKey", },
new TypeParameter() { ParameterName = "TValue", },
},
ClassName = "TestClass",
Interfaces = [IntermediateNodeFactory.CSharpToken("IFoo"), IntermediateNodeFactory. CSharpToken("IBar")],
TypeParameters = [
new TypeParameter() { ParameterName = "TKey" },
new TypeParameter() { ParameterName = "TValue" },
],
ClassName = "TestClass"
});

var codeDocument = TestRazorCodeDocument.CreateEmpty();
Expand Down Expand Up @@ -222,19 +215,15 @@ public void WriteDocument_WithNullableContext_WritesClass()
var builder = IntermediateNodeBuilder.Create(document);
builder.Add(new ClassDeclarationIntermediateNode()
{
Modifiers =
{
"internal"
},
Modifiers = { "internal" },
BaseType = new BaseTypeWithModel("TestBase"),
Interfaces = [IntermediateToken.CreateCSharpToken("IFoo"), IntermediateToken.CreateCSharpToken("IBar")],
TypeParameters = new List<TypeParameter>
{
new TypeParameter() { ParameterName = "TKey", },
new TypeParameter() { ParameterName = "TValue", },
},
Interfaces = [IntermediateNodeFactory.CSharpToken("IFoo"), IntermediateNodeFactory.CSharpToken("IBar")],
TypeParameters = [
new TypeParameter() { ParameterName = "TKey" },
new TypeParameter() { ParameterName = "TValue" },
],
ClassName = "TestClass",
NullableContext = true,
NullableContext = true
});

var codeDocument = TestRazorCodeDocument.CreateEmpty();
Expand Down Expand Up @@ -272,18 +261,14 @@ public void WriteDocument_WritesClass_ConstrainedGenericTypeParameters()
var builder = IntermediateNodeBuilder.Create(document);
builder.Add(new ClassDeclarationIntermediateNode()
{
Modifiers =
{
"internal"
},
Modifiers = { "internal" },
BaseType = new BaseTypeWithModel("TestBase"),
Interfaces = [IntermediateToken.CreateCSharpToken("IFoo"), IntermediateToken.CreateCSharpToken("IBar")],
TypeParameters = new List<TypeParameter>
{
new TypeParameter() { ParameterName = "TKey", Constraints = "where TKey : class" },
new TypeParameter() { ParameterName = "TValue", Constraints = "where TValue : class" },
},
ClassName = "TestClass",
Interfaces = [IntermediateNodeFactory.CSharpToken("IFoo"), IntermediateNodeFactory.CSharpToken("IBar")],
TypeParameters = [
new TypeParameter() { ParameterName = "TKey", Constraints = "where TKey : class" },
new TypeParameter() { ParameterName = "TValue", Constraints = "where TValue : class" },
],
ClassName = "TestClass"
});

var codeDocument = TestRazorCodeDocument.CreateEmpty();
Expand Down Expand Up @@ -321,32 +306,23 @@ public void WriteDocument_WritesMethod()
var builder = IntermediateNodeBuilder.Create(document);
builder.Add(new MethodDeclarationIntermediateNode()
{
Modifiers =
{
"internal",
"virtual",
"async",
},
Modifiers = { "internal", "virtual", "async", },
MethodName = "TestMethod",
Parameters =
{
new MethodParameter()
{
new MethodParameter()
{
Modifiers =
{
"readonly",
"ref",
},
ParameterName = "a",
TypeName = "int",
},
new MethodParameter()
{
ParameterName = "b",
TypeName = "string",
}
Modifiers = { "readonly", "ref" },
ParameterName = "a",
TypeName = "int"
},
ReturnType = "string",
new MethodParameter()
{
ParameterName = "b",
TypeName = "string"
}
},
ReturnType = "string"
});

var codeDocument = TestRazorCodeDocument.CreateEmpty();
Expand Down Expand Up @@ -384,11 +360,7 @@ public void WriteDocument_WritesField()
var builder = IntermediateNodeBuilder.Create(document);
builder.Add(new FieldDeclarationIntermediateNode()
{
Modifiers =
{
"internal",
"readonly",
},
Modifiers = { "internal", "readonly", },
FieldName = "_foo",
FieldType = "string",
});
Expand Down Expand Up @@ -424,13 +396,9 @@ public void WriteDocument_WritesProperty()
var builder = IntermediateNodeBuilder.Create(document);
builder.Add(new PropertyDeclarationIntermediateNode()
{
Modifiers =
{
"internal",
"virtual",
},
Modifiers = { "internal", "virtual", },
PropertyName = "Foo",
PropertyType = IntermediateToken.CreateCSharpToken("string"),
PropertyType = IntermediateNodeFactory.CSharpToken("string"),
PropertyExpression = "default"
});

Expand Down
Loading
Loading