/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/CSharp/Test/Symbol/Compilation/GetSemanticInfoBrokenCodeTests.cs
392 строки
12 KB
Jared Parsons
generated move
28 сен 2020, 19:36
28 сен 2020, 19:36
1cca63b
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System.Collections.Generic; using System.Linq; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Text; using Roslyn.Test.Utilities; using Xunit; namespace Microsoft.CodeAnalysis.CSharp.UnitTests { public partial class GetSemanticInfoTests : SemanticModelTestBase { [WorkItem(545639, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545639")] [Fact] public void Bug14200() { var text = @"abstract class A { public abstract object this[object x] = { get; } }"; var tree = Parse(text); var comp = CreateCompilation(tree); var model = comp.GetSemanticModel(tree); VisitAllExpressions(model, tree.GetCompilationUnitRoot()); } [WorkItem(546285, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546285")] [Fact] public void OmittedArraySize() { var text = @"class A { void M() { /*<bind>*/new object[ class/*</bind>*/ B { }"; var tree = Parse(text); var comp = CreateCompilation(tree); var model = comp.GetSemanticModel(tree); var expr = GetExprSyntaxForBinding(GetExprSyntaxList(tree)); VisitAllExpressions(model, expr); } [Fact] public void NullableObjCreation() { var text = @"class A { void M() { var o = new /*<bind>*/ S1? /*</bind>*/() { i = 1 }; } struct S1 { int i; } }"; var tree = Parse(text); var comp = CreateCompilation(tree); var model = comp.GetSemanticModel(tree); var expr = GetExprSyntaxForBinding(GetExprSyntaxList(tree)); VisitAllExpressions(model, expr); } /// <summary> /// Constructed types from the same generic error /// type should compare equal. /// </summary> [Fact] public void ConstructedTypeWithConstructedErrorTypeArgument() { var text = @"class A<T> { } class C { static void M() { var o = /*<bind>*/new A<B<object>>/*</bind>*/(); } }"; var tree = Parse(text); var comp = CreateCompilation(tree); var model = comp.GetSemanticModel(tree); var expr = GetExprSyntaxForBinding(GetExprSyntaxList(tree)); VisitAllExpressions(model, expr); } [WorkItem(546332, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546332")] [Fact] public void ExpressionInStructuredTrivia() { var text = @"#if e==true"; var tree = Parse(text); var comp = CreateCompilation(tree); var model = comp.GetSemanticModel(tree); foreach (var expr in GetAllExpressions(tree.GetCompilationUnitRoot())) { model.GetTypeInfo(expr); } } [WorkItem(546637, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546637")] [Fact()] public void Bug16411() { var text = @"class C { void M1() { M2(() => { x } [A] void M2() { } }"; var tree = Parse(text); var comp = CreateCompilation(tree); var model = comp.GetSemanticModel(tree); VisitAllExpressions(model, tree.GetCompilationUnitRoot()); } [WorkItem(547065, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/547065")] [Fact] public void Bug17789() { var text = @"delegate U D<T, U>(T t); static class C { static string[] M(string[] s) { return s.Select(arg => arg.F().G } static string F(this string o) { return o; } static U[] Select<T, U>(this T[] t, D<T, U> d) { return null; } }"; var tree = Parse(text); var comp = CreateCompilation(tree); var model = comp.GetSemanticModel(tree); foreach (var stmt in GetAllStatements(tree.GetCompilationUnitRoot())) { model.AnalyzeDataFlow(stmt); } } [WorkItem(578141, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/578141")] [Fact] public void IsImplicitlyDeclared() { var text = @"object F; abstract object P { get; set; } abstract void M();"; var tree = Parse(text); var comp = CreateCompilation(tree); var model = comp.GetSemanticModel(tree); var diagnostics = model.GetDiagnostics().ToArray(); Assert.NotEmpty(diagnostics); var type = comp.GlobalNamespace.GetMember<NamedTypeSymbol>(TypeSymbol.ImplicitTypeName); Assert.True(type.IsImplicitlyDeclared); Symbol member; member = type.GetMember<Symbol>("F"); Assert.Null(member); member = type.GetMember<PropertySymbol>("P"); Assert.False(member.IsImplicitlyDeclared); member = type.GetMember<MethodSymbol>("M"); Assert.False(member.IsImplicitlyDeclared); } [WorkItem(611177, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/611177")] [Fact] public void Repro611177() { var source = @"[_<_[delegate using'"; var comp = CreateCompilation(source); var tree = comp.SyntaxTrees.Single(); var model = comp.GetSemanticModel(tree); Assert.Empty(tree.GetCompilationUnitRoot().DescendantNodes().OfType<UsingDirectiveSyntax>()); foreach (var identifierSyntax in tree.GetCompilationUnitRoot().DescendantNodes().OfType<IdentifierNameSyntax>()) { model.GetSymbolInfo(identifierSyntax); } } [WorkItem(611177, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/611177")] [Fact] public void UsingStatementInDelegateInArrayRankInType() { var source = @" class C { void Test() { int[delegate { using (Q); }] array; } }"; var comp = CreateCompilation(source); var tree = comp.SyntaxTrees.Single(); var model = comp.GetSemanticModel(tree); var usingSyntax = tree.GetCompilationUnitRoot().DescendantNodes().OfType<UsingStatementSyntax>().Single(); model.GetSymbolInfo(usingSyntax.Expression); } [WorkItem(611177, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/611177")] [Fact] public void TypeOfInUnexpectedDelegate() { var source = @" class C { void Test() { int[delegate { typeof(int) }] array; } }"; var comp = (Compilation)CreateCompilation(source); var tree = comp.SyntaxTrees.Single(); var model = comp.GetSemanticModel(tree); var typeOfSyntax = tree.GetCompilationUnitRoot().DescendantNodes().OfType<TypeOfExpressionSyntax>().Single(); var info = model.GetTypeInfo(typeOfSyntax); //Used to throw Assert.Equal(comp.GetWellKnownType(WellKnownType.System_Type), info.Type); } [WorkItem(611177, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/611177")] [Fact] public void UnexpectedDelegateInTypeOf() { var source = @" class C { void Test() { var x = typeof(int[delegate { 1 }]); } }"; var comp = CreateCompilation(source); var tree = comp.SyntaxTrees.Single(); var model = comp.GetSemanticModel(tree); var literalSyntax = tree.GetCompilationUnitRoot().DescendantNodes().OfType<LiteralExpressionSyntax>().Single(); Assert.Equal(SyntaxKind.NumericLiteralExpression, literalSyntax.Kind()); var info = model.GetTypeInfo(literalSyntax); //Used to throw Assert.Equal(SpecialType.System_Int32, info.Type.SpecialType); } [WorkItem(1014561, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1014561")] [Fact] public void Bug1014561() { var source = @" namespace Microsoft.CodeAnalysis.CSharp.Completion.Providers { public class DeclarationCompletionProvider : AbstractCompletionProvider { public overrasync Task<CompletionItemGroup> GetGroupAsync(Document document, int position, CompletionTriggerInfo triggerInfo, CancellationToken cancellationToken = default(CancellationToken)) { return new CompletionItemGroup( items: names.Select(n => new CompletionItem(this, n, textChangeSpan)).AsImmutable()); } return null; } } } "; var comp = CreateCompilation(source); var tree = comp.SyntaxTrees.Single(); var model = comp.GetSemanticModel(tree); var identifierSyntax = tree.GetCompilationUnitRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Single(n => n.Identifier.ValueText == "CompletionItem"); var info = model.GetSymbolInfo(identifierSyntax); //Used to throw } [WorkItem(754405, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/754405")] [Fact] public void MissingNullableType() { var text = @"class C { object F = typeof(int?); }"; var tree = Parse(text); var comp = CreateEmptyCompilation(new[] { tree }); var model = comp.GetSemanticModel(tree); VisitAllExpressions(model, tree.GetCompilationUnitRoot()); } [WorkItem(754405, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/754405")] [Fact] public void MissingPointerType() { var text = @"class C { object F = typeof(int*); }"; var tree = Parse(text); var comp = CreateEmptyCompilation(new[] { tree }); var model = comp.GetSemanticModel(tree); VisitAllExpressions(model, tree.GetCompilationUnitRoot()); } [WorkItem(754405, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/754405")] [Fact] public void MissingArrayType() { var text = @"class C { object F = typeof(int[]); }"; var tree = Parse(text); var comp = CreateEmptyCompilation(new[] { tree }); var model = comp.GetSemanticModel(tree); VisitAllExpressions(model, tree.GetCompilationUnitRoot()); } [WorkItem(757789, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/757789")] [Fact] public void OmittedTypeArgument() { var text = @"class C<T, U> { static object F = new C<,>(); }"; var tree = Parse(text); var comp = CreateCompilation(tree); var model = comp.GetSemanticModel(tree); foreach (var expr in GetAllExpressions(tree.GetCompilationUnitRoot())) { var symbolInfo = model.GetSymbolInfo(expr); // https://github.com/dotnet/roslyn/issues/38509 // Assert.NotEqual(default, symbolInfo); model.AnalyzeDataFlow(expr); } } private void VisitAllExpressions(SemanticModel model, SyntaxNode node) { foreach (var expr in GetAllExpressions(node)) { var symbolInfo = model.GetSymbolInfo(expr); // https://github.com/dotnet/roslyn/issues/38509 // Assert.NotEqual(default, symbolInfo); } } private static IEnumerable<ExpressionSyntax> GetAllExpressions(SyntaxNode node) { return node.DescendantNodesAndSelf(descendIntoTrivia: true).OfType<ExpressionSyntax>(); } private static IEnumerable<StatementSyntax> GetAllStatements(SyntaxNode node) { return node.DescendantNodesAndSelf().OfType<StatementSyntax>(); } } }