From 869b933df8fc2b2cbfb0a91ebc64f69cdfcf0ebe Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 14 Oct 2025 18:43:59 +0200 Subject: [PATCH 01/12] Add to interface --- src/Compilers/Core/Portable/PEWriter/MetadataWriter.cs | 2 +- src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Compilers/Core/Portable/PEWriter/MetadataWriter.cs b/src/Compilers/Core/Portable/PEWriter/MetadataWriter.cs index f19b24508880e..262b4ab7ffca1 100644 --- a/src/Compilers/Core/Portable/PEWriter/MetadataWriter.cs +++ b/src/Compilers/Core/Portable/PEWriter/MetadataWriter.cs @@ -1453,7 +1453,7 @@ private static Location GetNamedEntityLocation(INamedEntity errorEntity) protected static Location GetSymbolLocation(ISymbolInternal symbolOpt) { - return symbolOpt != null && !symbolOpt.Locations.IsDefaultOrEmpty ? symbolOpt.Locations[0] : Location.None; + return symbolOpt?.GetFirstLocationOrNone() ?? Location.None; } internal TypeAttributes GetTypeAttributes(ITypeDefinition typeDef) diff --git a/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs b/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs index cf182eaac93f9..96aeb754c7110 100644 --- a/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs +++ b/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs @@ -89,6 +89,9 @@ internal interface ISymbolInternal /// bool IsDefinition { get; } + Location GetFirstLocation(); + Location GetFirstLocationOrNone(); + /// /// Gets the locations where the symbol was originally defined, either in source or /// metadata. Some symbols (for example, partial classes) may be defined in more than one From 8becd213fab0a9efc576ecca48f0be16f9719fe9 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 14 Oct 2025 18:44:27 +0200 Subject: [PATCH 02/12] Use helper --- .../Symbols/Source/ExtensionGroupingInfo.cs | 2 +- .../Test/Emit/CodeGen/CodeGenTupleTest.cs | 4 +- .../EditAndContinueTestBase.cs | 4 +- .../Diagnostics/DiagnosticAnalyzerTests.cs | 4 +- .../Compilation/SemanticModelAPITests.cs | 10 ++--- .../SemanticModelGetDeclaredSymbolAPITests.cs | 2 +- .../Symbols/AnonymousTypesSemanticsTests.cs | 4 +- .../Symbols/AnonymousTypesSymbolTests.cs | 10 ++--- .../Symbols/CompilationCreationTests.cs | 4 +- .../Symbol/Symbols/CovariantReturnTests.cs | 2 +- .../Source/DeclaringSyntaxNodeTests.cs | 4 +- .../Symbol/Symbols/Source/DelegateTests.cs | 4 +- .../Symbols/Source/FileModifierTests.cs | 8 ++-- .../Symbol/Symbols/Source/LocationTests.cs | 2 +- .../Symbol/Symbols/Source/PropertyTests.cs | 4 +- .../Diagnostics/CommonDiagnosticAnalyzers.cs | 40 +++++++++---------- .../Rewriters/LocalDeclarationRewriter.cs | 2 +- .../Symbols/EEMethodSymbol.cs | 4 +- .../AbstractReassignedVariableService.cs | 2 +- ...olicRenameLocations.ReferenceProcessing.cs | 2 +- ...utionCompilationState.SymbolToProjectId.cs | 2 +- .../SymbolKey.TypeParameterSymbolKey.cs | 2 +- 22 files changed, 61 insertions(+), 61 deletions(-) diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/ExtensionGroupingInfo.cs b/src/Compilers/CSharp/Portable/Symbols/Source/ExtensionGroupingInfo.cs index cbf3f033207df..f5d0d48a54ce4 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/ExtensionGroupingInfo.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/ExtensionGroupingInfo.cs @@ -474,7 +474,7 @@ static void checkCollisions(IEnumerable extensions, Func< alreadyReportedExtensions ??= PooledHashSet.GetInstance(); if (alreadyReportedExtensions.Add(extension)) { - diagnostics.Add(ErrorCode.ERR_ExtensionBlockCollision, extension.Locations[0]); + diagnostics.Add(ErrorCode.ERR_ExtensionBlockCollision, extension.GetFirstLocation()); } } } diff --git a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs index 9a74195925056..9452154002487 100644 --- a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs +++ b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs @@ -17373,7 +17373,7 @@ static void Main() Assert.Equal(SymbolKind.Field, sym.Symbol.Kind); Assert.Equal("Alice", sym.Symbol.Name); - Assert.Equal(nc.Name.GetLocation(), sym.Symbol.Locations[0]); + Assert.Equal(nc.Name.GetLocation(), sym.Symbol.GetFirstLocation()); } [Fact] @@ -17408,7 +17408,7 @@ static void Main() Assert.Equal(SymbolKind.Field, bobField.Kind); var secondElement = nodes.OfType().First().Arguments[1]; - Assert.Equal(secondElement.GetLocation(), bobField.Locations[0]); + Assert.Equal(secondElement.GetLocation(), bobField.GetFirstLocation()); } [Fact] diff --git a/src/Compilers/CSharp/Test/Emit2/Emit/EditAndContinue/EditAndContinueTestBase.cs b/src/Compilers/CSharp/Test/Emit2/Emit/EditAndContinue/EditAndContinueTestBase.cs index 0c6d34625bc7c..a03ef17d82f94 100644 --- a/src/Compilers/CSharp/Test/Emit2/Emit/EditAndContinue/EditAndContinueTestBase.cs +++ b/src/Compilers/CSharp/Test/Emit2/Emit/EditAndContinue/EditAndContinueTestBase.cs @@ -91,8 +91,8 @@ internal static Func GetSyntaxMapByKind(MethodSymbol met internal static Func GetEquivalentNodesMap(MethodSymbol method1, MethodSymbol method0) { - var tree1 = method1.Locations[0].SourceTree; - var tree0 = method0.Locations[0].SourceTree; + var tree1 = method1.GetFirstLocation().SourceTree; + var tree0 = method0.GetFirstLocation().SourceTree; Assert.NotEqual(tree1, tree0); var locals0 = GetAllLocals(method0); diff --git a/src/Compilers/CSharp/Test/Emit3/Diagnostics/DiagnosticAnalyzerTests.cs b/src/Compilers/CSharp/Test/Emit3/Diagnostics/DiagnosticAnalyzerTests.cs index 2c98eac46a0ce..303f01a4398c3 100644 --- a/src/Compilers/CSharp/Test/Emit3/Diagnostics/DiagnosticAnalyzerTests.cs +++ b/src/Compilers/CSharp/Test/Emit3/Diagnostics/DiagnosticAnalyzerTests.cs @@ -270,7 +270,7 @@ private void AnalyzeNode(SyntaxNodeAnalysisContext context) private void AnalyzeSymbol(SymbolAnalysisContext context) { - var diag1 = CodeAnalysis.Diagnostic.Create(s_descriptor, context.Symbol.Locations[0], "NamedType"); + var diag1 = CodeAnalysis.Diagnostic.Create(s_descriptor, context.Symbol.GetFirstLocation(), "NamedType"); context.ReportDiagnostic(diag1); } } @@ -839,7 +839,7 @@ public override void Initialize(AnalysisContext context) context.RegisterSymbolAction(ctxt => { var method = ((IMethodSymbol)ctxt.Symbol); - ctxt.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(Descriptor1, method.Locations[0], method.ToDisplayString())); + ctxt.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(Descriptor1, method.GetFirstLocation(), method.ToDisplayString())); }, SymbolKind.Method); } } diff --git a/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelAPITests.cs b/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelAPITests.cs index b3c2a0919260f..6a9eba00c90b7 100644 --- a/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelAPITests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelAPITests.cs @@ -972,7 +972,7 @@ static partial void Goo(ulong x) { } Assert.NotNull(sym2); Assert.Equal("System.UInt64 x", sym1.ToTestDisplayString()); Assert.Equal("System.UInt64 x", sym2.ToTestDisplayString()); - Assert.NotEqual(sym1.Locations[0], sym2.Locations[0]); + Assert.NotEqual(sym1.GetFirstLocation(), sym2.GetFirstLocation()); } [Fact, WorkItem(544473, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544473")] @@ -1013,7 +1013,7 @@ static partial void Goo(T x) { } Assert.NotNull(sym2); Assert.Equal("T", sym1.ToTestDisplayString()); Assert.Equal("T", sym2.ToTestDisplayString()); - Assert.NotEqual(sym1.Locations[0], sym2.Locations[0]); + Assert.NotEqual(sym1.GetFirstLocation(), sym2.GetFirstLocation()); } [Fact] @@ -1195,7 +1195,7 @@ public object this[int index] var paras = descendants.OfType(); Assert.Equal(1, paras.Count()); var parasym = model.GetDeclaredSymbol(paras.First()); - var ploc = parasym.Locations[0]; + var ploc = parasym.GetFirstLocation(); var args = descendants.OfType().Where(s => s.ToString() == "index").Select(s => s); Assert.Equal(2, args.Count()); @@ -1204,8 +1204,8 @@ public object this[int index] Assert.NotNull(argsym1); Assert.NotNull(argsym2); - Assert.Equal(ploc, argsym1.Locations[0]); - Assert.Equal(ploc, argsym2.Locations[0]); + Assert.Equal(ploc, argsym1.GetFirstLocation()); + Assert.Equal(ploc, argsym2.GetFirstLocation()); Assert.Equal(parasym.Kind, argsym1.Kind); Assert.Equal(parasym.Kind, argsym2.Kind); diff --git a/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelGetDeclaredSymbolAPITests.cs b/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelGetDeclaredSymbolAPITests.cs index b6b34a021a5a6..cf819cc17a26b 100644 --- a/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelGetDeclaredSymbolAPITests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelGetDeclaredSymbolAPITests.cs @@ -3900,7 +3900,7 @@ partial class program var model = comp.GetSemanticModel(tree); var param = tree.GetCompilationUnitRoot().DescendantNodes().OfType().Where(p => p.Identifier.ValueText == "name").First(); var symbol = model.GetDeclaredSymbol(param); - Assert.Equal(param.Identifier.Span, symbol.Locations[0].SourceSpan); + Assert.Equal(param.Identifier.Span, symbol.GetFirstLocation().SourceSpan); } [WorkItem(542217, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542217")] diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSemanticsTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSemanticsTests.cs index c94ce3159fb76..885141ec5f4af 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSemanticsTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSemanticsTests.cs @@ -1992,7 +1992,7 @@ private CompilationUtils.SemanticInfoSummary GetAnonymousTypeInfoSummary(TestDat Assert.Equal(0, type.Interfaces.Length); Assert.Equal(1, type.Locations.Length); - Assert.Equal(typeSpan, type.Locations[0].SourceSpan); + Assert.Equal(typeSpan, type.GetFirstLocation().SourceSpan); foreach (int field in fields) { @@ -2021,7 +2021,7 @@ private void CheckFieldNameAndLocation(TestData data, ITypeSymbol type, SyntaxNo Assert.NotNull(property); Assert.Equal(fieldName, property.Name); Assert.Equal(1, property.Locations.Length); - Assert.Equal(span, property.Locations[0].SourceSpan); + Assert.Equal(span, property.GetFirstLocation().SourceSpan); IMethodSymbol getter = property.GetMethod; Assert.NotNull(getter); diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSymbolTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSymbolTests.cs index 3f21385a75283..d28a46728bebf 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSymbolTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSymbolTests.cs @@ -1643,7 +1643,7 @@ static void Main() Assert.NotNull(sym.Symbol); Assert.True(sym.Symbol.GetSymbol().IsFromCompilation(comp), "IsFromCompilation"); Assert.False(sym.Symbol.Locations.IsEmpty, "Symbol Location"); - Assert.True(sym.Symbol.Locations[0].IsInSource); + Assert.True(sym.Symbol.GetFirstLocation().IsInSource); var info = model.GetTypeInfo(expr); Assert.NotNull(info.Type); @@ -1652,7 +1652,7 @@ static void Main() { Assert.True(m.GetSymbol().IsFromCompilation(comp), "IsFromCompilation"); Assert.False(m.Locations.IsEmpty, String.Format("No Location: {0}", m)); - Assert.True(m.Locations[0].IsInSource); + Assert.True(m.GetFirstLocation().IsInSource); } } @@ -1695,12 +1695,12 @@ static void Main() // different locations. Assert.Equal(typeA3, typeA4); Assert.NotSame(typeA3, typeA4); - Assert.NotEqual(typeA3.Locations[0], typeA4.Locations[0]); + Assert.NotEqual(typeA3.GetFirstLocation(), typeA4.GetFirstLocation()); // The locations of a3's type should be the type declared in statement 1, the location // of a4's type should be the type declared in statement 2. - Assert.True(statement1.Span.Contains(typeA3.Locations[0].SourceSpan)); - Assert.True(statement2.Span.Contains(typeA4.Locations[0].SourceSpan)); + Assert.True(statement1.Span.Contains(typeA3.GetFirstLocation().SourceSpan)); + Assert.True(statement2.Span.Contains(typeA4.GetFirstLocation().SourceSpan)); } private static readonly SyntaxTree s_equalityComparerSourceTree = Parse(@" diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/CompilationCreationTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/CompilationCreationTests.cs index 57cad756170cb..af9b17a536de5 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/CompilationCreationTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/CompilationCreationTests.cs @@ -57,7 +57,7 @@ private static void CheckCompilationSyntaxTrees(CSharpCompilation compilation, p { for (int j = 0; j < numTrees; j++) { - Assert.Equal(Math.Sign(compilation.CompareSourceLocations(types[i].Locations[0], types[j].Locations[0])), Math.Sign(i.CompareTo(j))); + Assert.Equal(Math.Sign(compilation.CompareSourceLocations(types[i].GetFirstLocation(), types[j].GetFirstLocation())), Math.Sign(i.CompareTo(j))); } } } @@ -2566,7 +2566,7 @@ Class4 M3() PEAssemblySymbol Lib1_V1 = (PEAssemblySymbol)c1AsmSource.Modules[0].GetReferencedAssemblySymbols()[1]; PEModuleSymbol module1 = (PEModuleSymbol)c1AsmSource.Modules[1]; - Assert.Equal(LocationKind.MetadataFile, ((MetadataLocation)Lib1_V1.Locations[0]).Kind); + Assert.Equal(LocationKind.MetadataFile, ((MetadataLocation)Lib1_V1.GetFirstLocation()).Kind); SourceAssemblySymbol c2AsmSource = (SourceAssemblySymbol)c2.Assembly; RetargetingAssemblySymbol c1AsmRef = (RetargetingAssemblySymbol)c2AsmSource.Modules[0].GetReferencedAssemblySymbols()[2]; PEAssemblySymbol Lib1_V2 = (PEAssemblySymbol)c2AsmSource.Modules[0].GetReferencedAssemblySymbols()[1]; diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/CovariantReturnTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/CovariantReturnTests.cs index a073f18206aa4..a3a7bb7421029 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/CovariantReturnTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/CovariantReturnTests.cs @@ -670,7 +670,7 @@ static void verifyAttribute(MethodSymbol method, bool needsAttribute) { var isCovariant = !method.ReturnType.Equals(method.OverriddenMethod.ReturnType); Assert.Equal(needsAttribute, isCovariant); - var attributeExpected = isCovariant && !method.Locations[0].IsInSource; + var attributeExpected = isCovariant && !method.GetFirstLocation().IsInSource; var attrs = method.GetAttributes("System.Runtime.CompilerServices", "PreserveBaseOverridesAttribute"); Assert.Equal(attributeExpected, !attrs.IsEmpty()); } diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DeclaringSyntaxNodeTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DeclaringSyntaxNodeTests.cs index 01b6dffd437d5..004b8b523e036 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DeclaringSyntaxNodeTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DeclaringSyntaxNodeTests.cs @@ -347,7 +347,7 @@ private void CheckAnonymousType(SemanticModel model, ILocalSymbol local, Anonymo // Locations: Return the Span of that particular // AnonymousObjectCreationExpression's NewKeyword. Assert.Equal(1, localType.Locations.Length); - Assert.Equal(localType.Locations[0], anonObjectCreation.NewKeyword.GetLocation()); + Assert.Equal(localType.GetFirstLocation(), anonObjectCreation.NewKeyword.GetLocation()); // Members check int propIndex = 0; @@ -380,7 +380,7 @@ private void CheckAnonymousType(SemanticModel model, ILocalSymbol local, Anonymo // Locations: Return the Span of that particular // AnonymousObjectMemberDeclarator's IdentifierToken. Assert.Equal(1, member.Locations.Length); - Assert.Equal(member.Locations[0], propertyInitializer.NameEquals.Name.GetLocation()); + Assert.Equal(member.GetFirstLocation(), propertyInitializer.NameEquals.Name.GetLocation()); propIndex++; } diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DelegateTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DelegateTests.cs index aea7c81f322db..cb80e8383c1f2 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DelegateTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DelegateTests.cs @@ -72,8 +72,8 @@ class A { var a = global.GetTypeMembers("A", 0).Single(); var d = a.GetMembers("D")[0] as NamedTypeSymbol; var tmp = d.GetMembers(); - Assert.Equal(d.Locations[0], d.DelegateInvokeMethod.Locations[0], EqualityComparer.Default); - Assert.Equal(d.Locations[0], d.InstanceConstructors[0].Locations[0], EqualityComparer.Default); + Assert.Equal(d.GetFirstLocation(), d.DelegateInvokeMethod.GetFirstLocation(), EqualityComparer.Default); + Assert.Equal(d.GetFirstLocation(), d.InstanceConstructors[0].GetFirstLocation(), EqualityComparer.Default); } [Fact] diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/FileModifierTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/FileModifierTests.cs index 08223c5997bbb..63de4f768d002 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/FileModifierTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/FileModifierTests.cs @@ -888,7 +888,7 @@ void verify() // file class C Diagnostic(ErrorCode.ERR_FileTypeNonUniquePath, "C").WithArguments("C", "path/to/file.cs").WithLocation(5, 12)); var classC = comp.GetMember("C"); - Assert.Equal(source1, classC.Locations[0].SourceTree); + Assert.Equal(source1, classC.GetFirstLocation().SourceTree); AssertEx.Equal("F620949CDCC480533E3607E5DD92F88E866EC1D65C225D70509A32F831433D9A4__C", classC.MetadataName); } } @@ -935,7 +935,7 @@ void verify() // file class C Diagnostic(ErrorCode.ERR_FileTypeNonUniquePath, "C").WithArguments("C", "path/to/file.cs").WithLocation(5, 12)); var member = comp.GetMember("C"); - Assert.Equal(source1, member.Locations[0].SourceTree); + Assert.Equal(source1, member.GetFirstLocation().SourceTree); AssertEx.Equal("F620949CDCC480533E3607E5DD92F88E866EC1D65C225D70509A32F831433D9A4__C", member.MetadataName); } } @@ -970,7 +970,7 @@ void verify() // file class C Diagnostic(ErrorCode.ERR_FileTypeNonUniquePath, "C").WithArguments("NS1.NS2.C", "path/to/file.cs").WithLocation(5, 12)); var classC = comp.GetMember("NS1.NS2.C"); - Assert.Equal(source1, classC.Locations[0].SourceTree); + Assert.Equal(source1, classC.GetFirstLocation().SourceTree); AssertEx.Equal("F620949CDCC480533E3607E5DD92F88E866EC1D65C225D70509A32F831433D9A4__C`1", classC.MetadataName); } } @@ -1000,7 +1000,7 @@ void verify() { comp.VerifyEmitDiagnostics(); var classC = comp.GetMember("C"); - Assert.Equal(source1, classC.Locations[0].SourceTree); + Assert.Equal(source1, classC.GetFirstLocation().SourceTree); AssertEx.Equal("F620949CDCC480533E3607E5DD92F88E866EC1D65C225D70509A32F831433D9A4__C", classC.MetadataName); } } diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/LocationTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/LocationTests.cs index 2871329d52531..7d54dfd806def 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/LocationTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/LocationTests.cs @@ -32,7 +32,7 @@ public void Simple1() var c = s.GetTypeMembers("C", 0).Single() as NamedTypeSymbol; AssertPos(c, 20, 1); var obj = c.BaseType(); - Assert.Equal("MetadataFile(CommonLanguageRuntimeLibrary)", obj.Locations[0].ToString()); + Assert.Equal("MetadataFile(CommonLanguageRuntimeLibrary)", obj.GetFirstLocation().ToString()); var f = c.GetMembers("F").Single() as FieldSymbol; AssertPos(f, 26, 1); var m = c.GetMembers("M").Single() as MethodSymbol; diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/PropertyTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/PropertyTests.cs index d47c46b4a4bb3..b58466a16ce85 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/PropertyTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/PropertyTests.cs @@ -410,7 +410,7 @@ struct S Assert.False(backField.Locations.IsEmpty); var prop = type01.GetMembers("Prop").Single() as PropertySymbol; Assert.Equal(prop.Locations.Length, backField.Locations.Length); - Assert.Equal(prop.Locations[0].ToString(), backField.Locations[0].ToString()); + Assert.Equal(prop.GetFirstLocation().ToString(), backField.GetFirstLocation().ToString()); // ------------------------------------- mems = type02.GetMembers(); backField = null; @@ -429,7 +429,7 @@ struct S Assert.False(backField.Locations.IsEmpty); prop = type02.GetMembers("Prop").Single() as PropertySymbol; Assert.Equal(prop.Locations.Length, backField.Locations.Length); - Assert.Equal(prop.Locations[0].ToString(), backField.Locations[0].ToString()); + Assert.Equal(prop.GetFirstLocation().ToString(), backField.GetFirstLocation().ToString()); } [WorkItem(537401, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537401")] diff --git a/src/Compilers/Test/Core/Diagnostics/CommonDiagnosticAnalyzers.cs b/src/Compilers/Test/Core/Diagnostics/CommonDiagnosticAnalyzers.cs index 7c847bc77bde1..6d69a92891fb0 100644 --- a/src/Compilers/Test/Core/Diagnostics/CommonDiagnosticAnalyzers.cs +++ b/src/Compilers/Test/Core/Diagnostics/CommonDiagnosticAnalyzers.cs @@ -607,7 +607,7 @@ public override void Initialize(AnalysisContext context) { context.RegisterCodeBlockAction(codeBlockContext => { - codeBlockContext.ReportDiagnostic(Diagnostic.Create(CodeBlockTopLevelRule, codeBlockContext.OwningSymbol.Locations[0], codeBlockContext.OwningSymbol.Name)); + codeBlockContext.ReportDiagnostic(Diagnostic.Create(CodeBlockTopLevelRule, codeBlockContext.OwningSymbol.GetFirstLocation(), codeBlockContext.OwningSymbol.Name)); }); if (!_onlyStatelessAction) @@ -616,7 +616,7 @@ public override void Initialize(AnalysisContext context) { compilationStartContext.RegisterCodeBlockAction(codeBlockContext => { - codeBlockContext.ReportDiagnostic(Diagnostic.Create(CodeBlockPerCompilationRule, codeBlockContext.OwningSymbol.Locations[0], codeBlockContext.OwningSymbol.Name)); + codeBlockContext.ReportDiagnostic(Diagnostic.Create(CodeBlockPerCompilationRule, codeBlockContext.OwningSymbol.GetFirstLocation(), codeBlockContext.OwningSymbol.Name)); }); }); } @@ -763,7 +763,7 @@ public override void Initialize(AnalysisContext context) context.RegisterSymbolAction(context => { CallbackSymbols.Add(context.Symbol); - context.ReportDiagnostic(Diagnostic.Create(Rule, context.Symbol.Locations[0])); + context.ReportDiagnostic(Diagnostic.Create(Rule, context.Symbol.GetFirstLocation())); }, SymbolKind.NamedType); } } @@ -795,7 +795,7 @@ private void AnalyzeSymbol(SymbolAnalysisContext context) var ns = (INamespaceSymbol)context.Symbol; if (ns.ContainingAssembly != context.Compilation.Assembly || ns.ConstituentNamespaces.Length > 1) { - context.ReportDiagnostic(Diagnostic.Create(Rule, ns.Locations[0])); + context.ReportDiagnostic(Diagnostic.Create(Rule, ns.GetFirstLocation())); } } } @@ -1000,7 +1000,7 @@ public override void Initialize(AnalysisContext context) { context.RegisterSymbolAction(symbolContext => { - symbolContext.ReportDiagnostic(Diagnostic.Create(Rule, symbolContext.Symbol.Locations[0])); + symbolContext.ReportDiagnostic(Diagnostic.Create(Rule, symbolContext.Symbol.GetFirstLocation())); }, SymbolKind.NamedType); } @@ -1040,7 +1040,7 @@ public override void Initialize(AnalysisContext context) context.RegisterSymbolAction(symbolContext => { // Report diagnostic with incorrect number of message format arguments. - symbolContext.ReportDiagnostic(Diagnostic.Create(Rule, symbolContext.Symbol.Locations[0], symbolContext.Symbol.Name)); + symbolContext.ReportDiagnostic(Diagnostic.Create(Rule, symbolContext.Symbol.GetFirstLocation(), symbolContext.Symbol.Name)); }, SymbolKind.NamedType); } } @@ -1174,7 +1174,7 @@ private void OnCompilationStart(CompilationStartAnalysisContext context) } // ok, now report diagnostic on the symbol. - var diagnostic = Diagnostic.Create(Descriptor, symbolContext.Symbol.Locations[0], symbolContext.Symbol.Name); + var diagnostic = Diagnostic.Create(Descriptor, symbolContext.Symbol.GetFirstLocation(), symbolContext.Symbol.Name); symbolContext.ReportDiagnostic(diagnostic); }, SymbolKind.NamedType); } @@ -1216,7 +1216,7 @@ private void ReportDiagnosticIfActionInvokedConcurrently(SemaphoreSlim gate, Sym { if (gate.CurrentCount != registeredActionCounts - 1) { - var diagnostic = Diagnostic.Create(Descriptor, symbolContext.Symbol.Locations[0]); + var diagnostic = Diagnostic.Create(Descriptor, symbolContext.Symbol.GetFirstLocation()); symbolContext.ReportDiagnostic(diagnostic); } } @@ -1332,7 +1332,7 @@ public override void Initialize(AnalysisContext context) case ActionKind.OperationBlockEnd: context.RegisterOperationBlockStartAction(blockStartContext => { - blockStartContext.RegisterOperationBlockEndAction(c => ReportDiagnostic(c.ReportDiagnostic, c.OwningSymbol.Locations[0])); + blockStartContext.RegisterOperationBlockEndAction(c => ReportDiagnostic(c.ReportDiagnostic, c.OwningSymbol.GetFirstLocation())); CacheAndVerifyControlFlowGraph(blockStartContext.OperationBlocks, op => (blockStartContext.GetControlFlowGraph(op), blockStartContext.OwningSymbol)); }); @@ -1341,7 +1341,7 @@ public override void Initialize(AnalysisContext context) case ActionKind.OperationBlock: context.RegisterOperationBlockAction(blockContext => { - ReportDiagnostic(blockContext.ReportDiagnostic, blockContext.OwningSymbol.Locations[0]); + ReportDiagnostic(blockContext.ReportDiagnostic, blockContext.OwningSymbol.GetFirstLocation()); CacheAndVerifyControlFlowGraph(blockContext.OperationBlocks, op => (blockContext.GetControlFlowGraph(op), blockContext.OwningSymbol)); }); @@ -1389,7 +1389,7 @@ public override void Initialize(AnalysisContext context) { foreach (var operationRoot in c.OperationBlocks) { - var diagnostic = Diagnostic.Create(Descriptor, c.OwningSymbol.Locations[0], c.OwningSymbol.Name, operationRoot.Kind); + var diagnostic = Diagnostic.Create(Descriptor, c.OwningSymbol.GetFirstLocation(), c.OwningSymbol.Name, operationRoot.Kind); c.ReportDiagnostic(diagnostic); } }); @@ -1657,7 +1657,7 @@ private void OnCompilationStart(CompilationStartAnalysisContext context) private void ReportSymbolDiagnostics(ISymbol symbol, Action addDiagnostic) { - ReportDiagnosticsCore(addDiagnostic, symbol.Locations[0], symbol.Name); + ReportDiagnosticsCore(addDiagnostic, symbol.GetFirstLocation(), symbol.Name); } private void ReportTreeDiagnostics(SyntaxTree tree, Action addDiagnostic) @@ -1703,7 +1703,7 @@ public override void Initialize(AnalysisContext context) { foreach (var namedType in namedTypes) { - var diagnostic = Diagnostic.Create(Rule, namedType.Locations[0], namedType.Name, namedTypes.Count); + var diagnostic = Diagnostic.Create(Rule, namedType.GetFirstLocation(), namedType.Name, namedTypes.Count); compilationEndContext.ReportDiagnostic(diagnostic); } }); @@ -1811,7 +1811,7 @@ private void OnCompilationStart(CompilationStartAnalysisContext context) } } - var diagnostic = Diagnostic.Create(descriptor, symbolContext.Symbol.Locations[0], symbolContext.Symbol.Name); + var diagnostic = Diagnostic.Create(descriptor, symbolContext.Symbol.GetFirstLocation(), symbolContext.Symbol.Name); symbolContext.ReportDiagnostic(diagnostic); }, SymbolKind.NamedType); @@ -1861,7 +1861,7 @@ public override void Initialize(AnalysisContext context) private void SymbolAction(SymbolAnalysisContext context) { - context.ReportDiagnostic(Diagnostic.Create(ParameterDescriptor, context.Symbol.Locations[0])); + context.ReportDiagnostic(Diagnostic.Create(ParameterDescriptor, context.Symbol.GetFirstLocation())); } } @@ -2460,7 +2460,7 @@ public override void Initialize(AnalysisContext context) } private void ReportDiagnostic(ISymbol symbol, Action reportDiagnostic) - => reportDiagnostic(Diagnostic.Create(_rule, symbol.Locations[0], symbol.Name)); + => reportDiagnostic(Diagnostic.Create(_rule, symbol.GetFirstLocation(), symbol.Name)); } [DiagnosticAnalyzer(LanguageNames.CSharp, LanguageNames.VisualBasic)] @@ -2542,7 +2542,7 @@ public override void Initialize(AnalysisContext context) throw new NotImplementedException(); } - var diagnostic = Diagnostic.Create(Descriptor, context.Symbol.Locations[0], _reportedSeverity, additionalLocations: null, properties: null, messageArgs: null); + var diagnostic = Diagnostic.Create(Descriptor, context.Symbol.GetFirstLocation(), _reportedSeverity, additionalLocations: null, properties: null, messageArgs: null); context.ReportDiagnostic(diagnostic); }, SymbolKind.NamedType); @@ -2570,7 +2570,7 @@ public override void Initialize(AnalysisContext analysisContext) private void OnOperationBlockStart(OperationBlockStartAnalysisContext context) { context.RegisterOperationBlockEndAction( - endContext => endContext.ReportDiagnostic(Diagnostic.Create(s_descriptor, context.OwningSymbol.Locations[0]))); + endContext => endContext.ReportDiagnostic(Diagnostic.Create(s_descriptor, context.OwningSymbol.GetFirstLocation()))); } } @@ -2610,7 +2610,7 @@ public override void Initialize(AnalysisContext context) else { context.RegisterSymbolAction( - context => context.ReportDiagnostic(Diagnostic.Create(Descriptor, context.Symbol.Locations[0])), + context => context.ReportDiagnostic(Diagnostic.Create(Descriptor, context.Symbol.GetFirstLocation())), SymbolKind.Field); } } @@ -2940,7 +2940,7 @@ private void OnCompilationStart(CompilationStartAnalysisContext context) context.RegisterSyntaxNodeAction(context => HandleCallback(context.Node.GetLocation(), context.Compilation, context.ReportDiagnostic, context.CancellationToken), CodeAnalysis.CSharp.SyntaxKind.ClassDeclaration); break; case AnalyzerRegisterActionKind.Symbol: - context.RegisterSymbolAction(context => HandleCallback(context.Symbol.Locations[0], context.Compilation, context.ReportDiagnostic, context.CancellationToken), SymbolKind.NamedType); + context.RegisterSymbolAction(context => HandleCallback(context.Symbol.GetFirstLocation(), context.Compilation, context.ReportDiagnostic, context.CancellationToken), SymbolKind.NamedType); break; case AnalyzerRegisterActionKind.Operation: context.RegisterOperationAction(context => HandleCallback(context.Operation.Syntax.GetLocation(), context.Compilation, context.ReportDiagnostic, context.CancellationToken), OperationKind.VariableDeclaration); diff --git a/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Rewriters/LocalDeclarationRewriter.cs b/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Rewriters/LocalDeclarationRewriter.cs index 83cf9a18f6d6c..7a062b36d97e7 100644 --- a/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Rewriters/LocalDeclarationRewriter.cs +++ b/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Rewriters/LocalDeclarationRewriter.cs @@ -97,7 +97,7 @@ private static void CreateLocal( var method = PlaceholderLocalSymbol.GetIntrinsicMethod(compilation, ExpressionCompilerConstants.CreateVariableMethodName); if ((object)method == null) { - diagnostics.Add(ErrorCode.ERR_DeclarationExpressionNotPermitted, local.Locations[0]); + diagnostics.Add(ErrorCode.ERR_DeclarationExpressionNotPermitted, local.GetFirstLocation()); return; } diff --git a/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Symbols/EEMethodSymbol.cs b/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Symbols/EEMethodSymbol.cs index 64de64dcd3779..e9ed78e02f952 100644 --- a/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Symbols/EEMethodSymbol.cs +++ b/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Symbols/EEMethodSymbol.cs @@ -500,7 +500,7 @@ internal override void GenerateMethodBody(TypeCompilationState compilationState, this.CalculateUseSiteDiagnostic(ref useSiteInfo); if (useSiteInfo.DiagnosticInfo != null && useSiteInfo.DiagnosticInfo.Severity == DiagnosticSeverity.Error) { - diagnostics.Add(useSiteInfo.DiagnosticInfo, this.Locations[0]); + diagnostics.Add(useSiteInfo.DiagnosticInfo, this.GetFirstLocation()); return; } @@ -524,7 +524,7 @@ internal override void GenerateMethodBody(TypeCompilationState compilationState, var name = local.Name; if (name.StartsWith("$", StringComparison.Ordinal)) { - diagnostics.Add(ErrorCode.ERR_UnexpectedCharacter, local.Locations[0], name[0]); + diagnostics.Add(ErrorCode.ERR_UnexpectedCharacter, local.GetFirstLocation(), name[0]); return; } } diff --git a/src/Workspaces/Core/Portable/ReassignedVariable/AbstractReassignedVariableService.cs b/src/Workspaces/Core/Portable/ReassignedVariable/AbstractReassignedVariableService.cs index 4bf8380866395..05dc3aa0fa8fe 100644 --- a/src/Workspaces/Core/Portable/ReassignedVariable/AbstractReassignedVariableService.cs +++ b/src/Workspaces/Core/Portable/ReassignedVariable/AbstractReassignedVariableService.cs @@ -244,7 +244,7 @@ bool TryGetParameterLocation(SemanticModel semanticModel, IParameterSymbol param // error scenarios. if (parameter.Locations.Length > 0) { - var parameterLocation = parameter.Locations[0]; + var parameterLocation = parameter.GetFirstLocation(); if (parameterLocation.SourceTree == semanticModel.SyntaxTree) { location = parameterLocation.SourceSpan; diff --git a/src/Workspaces/Core/Portable/Rename/SymbolicRenameLocations.ReferenceProcessing.cs b/src/Workspaces/Core/Portable/Rename/SymbolicRenameLocations.ReferenceProcessing.cs index 0b3bba6d026d1..856ea91d3aab7 100644 --- a/src/Workspaces/Core/Portable/Rename/SymbolicRenameLocations.ReferenceProcessing.cs +++ b/src/Workspaces/Core/Portable/Rename/SymbolicRenameLocations.ReferenceProcessing.cs @@ -198,7 +198,7 @@ public static async Task> GetRenamableDefinitionL // destructors declarations that match the name if (referencedSymbol.Kind == SymbolKind.NamedType && referencedSymbol.Locations.All(l => l.IsInSource)) { - var firstLocation = referencedSymbol.Locations[0]; + var firstLocation = referencedSymbol.GetFirstLocation(); var syntaxFacts = solution.GetRequiredDocument(firstLocation.SourceTree!) .GetRequiredLanguageService(); diff --git a/src/Workspaces/Core/Portable/Workspace/Solution/SolutionCompilationState.SymbolToProjectId.cs b/src/Workspaces/Core/Portable/Workspace/Solution/SolutionCompilationState.SymbolToProjectId.cs index 2e08d2deb7f03..f658efe64b6f4 100644 --- a/src/Workspaces/Core/Portable/Workspace/Solution/SolutionCompilationState.SymbolToProjectId.cs +++ b/src/Workspaces/Core/Portable/Workspace/Solution/SolutionCompilationState.SymbolToProjectId.cs @@ -79,7 +79,7 @@ internal sealed partial class SolutionCompilationState // projects, but which have the same syntax-tree (which is only in one project). We need to actually // check it's assembly symbol so that we get the actual project it is from (the original project, or the // retargetted project). - var syntaxTree = symbol.Locations[0].SourceTree; + var syntaxTree = symbol.GetFirstLocation().SourceTree; Contract.ThrowIfNull(syntaxTree); var documentId = this.GetDocumentState(syntaxTree, projectId: null)?.Id; diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.TypeParameterSymbolKey.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.TypeParameterSymbolKey.cs index d81c83767656e..d4f2619c5e610 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.TypeParameterSymbolKey.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.TypeParameterSymbolKey.cs @@ -17,7 +17,7 @@ public sealed override void Create(ITypeParameterSymbol symbol, SymbolKeyWriter if (symbol.TypeParameterKind == TypeParameterKind.Cref) { visitor.WriteBoolean(true); - visitor.WriteLocation(symbol.Locations[0]); + visitor.WriteLocation(symbol.GetFirstLocation()); } else { From d6437e362c4c6e6043b76c8f5aa51e62cd64f011 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 14 Oct 2025 18:48:22 +0200 Subject: [PATCH 03/12] In progress --- .../SymbolDisplayVisitor_Minimal.cs | 36 +++++++++---------- .../Test/CommandLine/CommandLineTests.cs | 4 +-- .../Emit/EditAndContinue/DefinitionMap.cs | 6 ++-- ...ssageAttributeTests.DiagnosticAnalyzers.cs | 8 ++--- .../Compilation/VisualBasicCompilation.vb | 2 +- .../VisualBasic/Portable/Symbols/Symbol.vb | 8 +++++ .../Test/CommandLine/CommandLineTests.vb | 6 ++-- .../IFindReferencesResultExtensions.cs | 2 +- ...ey.AnonymousFunctionOrDelegateSymbolKey.cs | 2 +- ...lEquivalenceComparer.EquivalenceVisitor.cs | 2 +- 10 files changed, 41 insertions(+), 35 deletions(-) diff --git a/src/Compilers/CSharp/Portable/SymbolDisplay/SymbolDisplayVisitor_Minimal.cs b/src/Compilers/CSharp/Portable/SymbolDisplay/SymbolDisplayVisitor_Minimal.cs index 4df1ce062cffd..1864bc2fe06ae 100644 --- a/src/Compilers/CSharp/Portable/SymbolDisplay/SymbolDisplayVisitor_Minimal.cs +++ b/src/Compilers/CSharp/Portable/SymbolDisplay/SymbolDisplayVisitor_Minimal.cs @@ -240,28 +240,26 @@ private IDictionary CreateAliasMap() { ITypeSymbol? type = null; - if (this.IsMinimizing && !symbol.Locations.IsEmpty) + if (this.IsMinimizing && + symbol.Locations is [{ IsInSource: true } location, ..] && + location.SourceTree == SemanticModelOpt.SyntaxTree) { - var location = symbol.Locations.First(); - if (location.IsInSource && location.SourceTree == SemanticModelOpt.SyntaxTree) + var token = location.SourceTree.GetRoot().FindToken(PositionOpt); + var queryBody = GetQueryBody(token); + if (queryBody != null) { - var token = location.SourceTree.GetRoot().FindToken(PositionOpt); - var queryBody = GetQueryBody(token); - if (queryBody != null) - { - // To heuristically determine the type of the range variable in a query - // clause, we speculatively bind the name of the variable in the select - // or group clause of the query body. - var identifierName = SyntaxFactory.IdentifierName(symbol.Name); - type = SemanticModelOpt.GetSpeculativeTypeInfo( - queryBody.SelectOrGroup.Span.End - 1, identifierName, SpeculativeBindingOption.BindAsExpression).Type; - } + // To heuristically determine the type of the range variable in a query + // clause, we speculatively bind the name of the variable in the select + // or group clause of the query body. + var identifierName = SyntaxFactory.IdentifierName(symbol.Name); + type = SemanticModelOpt.GetSpeculativeTypeInfo( + queryBody.SelectOrGroup.Span.End - 1, identifierName, SpeculativeBindingOption.BindAsExpression).Type; + } - var identifier = token.Parent as IdentifierNameSyntax; - if (identifier != null) - { - type = SemanticModelOpt.GetTypeInfo(identifier).Type; - } + var identifier = token.Parent as IdentifierNameSyntax; + if (identifier != null) + { + type = SemanticModelOpt.GetTypeInfo(identifier).Type; } } diff --git a/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs b/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs index 92201963a4ebd..ecbd030eac4fd 100644 --- a/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs +++ b/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs @@ -15999,7 +15999,7 @@ public override void CreateAnalyzerWithinCompilation(CompilationStartAnalysisCon context.RegisterSymbolAction( (symbolContext) => { - symbolContext.ReportDiagnostic(Diagnostic.Create(Warning01, symbolContext.Symbol.Locations.First())); + symbolContext.ReportDiagnostic(Diagnostic.Create(Warning01, symbolContext.Symbol.GetFirstLocation())); }, SymbolKind.NamedType); } @@ -16016,7 +16016,7 @@ public override void CreateAnalyzerWithinCompilation(CompilationStartAnalysisCon context.RegisterSymbolAction( static (symbolContext) => { - symbolContext.ReportDiagnostic(Diagnostic.Create(Warning02, symbolContext.Symbol.Locations.First())); + symbolContext.ReportDiagnostic(Diagnostic.Create(Warning02, symbolContext.Symbol.GetFirstLocation())); }, SymbolKind.NamedType); } diff --git a/src/Compilers/Core/Portable/Emit/EditAndContinue/DefinitionMap.cs b/src/Compilers/Core/Portable/Emit/EditAndContinue/DefinitionMap.cs index c9ca092ce929b..f73d3d1d18a01 100644 --- a/src/Compilers/Core/Portable/Emit/EditAndContinue/DefinitionMap.cs +++ b/src/Compilers/Core/Portable/Emit/EditAndContinue/DefinitionMap.cs @@ -353,7 +353,7 @@ protected abstract void GetStateMachineFieldMapFromMetadata( { diagnostics.Add(MessageProvider.CreateDiagnostic( MessageProvider.ERR_InvalidDebugInfo, - method.Locations.First(), + method.GetFirstLocation(), method, MetadataTokens.GetToken(methodHandle), method.ContainingAssembly, @@ -438,7 +438,7 @@ protected abstract void GetStateMachineFieldMapFromMetadata( { diagnostics.Add(MessageProvider.CreateDiagnostic( MessageProvider.ERR_InvalidDebugInfo, - method.Locations.First(), + method.GetFirstLocation(), method, MetadataTokens.GetToken(localSignature), method.ContainingAssembly, @@ -479,7 +479,7 @@ private void ReportMissingStateMachineAttribute(DiagnosticBag diagnostics, IMeth { diagnostics.Add(MessageProvider.CreateDiagnostic( MessageProvider.ERR_EncUpdateFailedMissingSymbol, - method.Locations.First(), + method.GetFirstLocation(), CodeAnalysisResources.Attribute, stateMachineAttributeFullName)); } diff --git a/src/Compilers/Test/Core/Diagnostics/SuppressMessageAttributeTests.DiagnosticAnalyzers.cs b/src/Compilers/Test/Core/Diagnostics/SuppressMessageAttributeTests.DiagnosticAnalyzers.cs index 846efdc985c18..a6aeac8d1af74 100644 --- a/src/Compilers/Test/Core/Diagnostics/SuppressMessageAttributeTests.DiagnosticAnalyzers.cs +++ b/src/Compilers/Test/Core/Diagnostics/SuppressMessageAttributeTests.DiagnosticAnalyzers.cs @@ -66,7 +66,7 @@ public override void Initialize(AnalysisContext analysisContext) { if (context.Symbol.Name.StartsWith(_errorSymbolPrefix, StringComparison.Ordinal)) { - context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.Symbol.Locations.First(), messageArgs: context.Symbol.Name)); + context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.Symbol.GetFirstLocation(), messageArgs: context.Symbol.Name)); } }, SymbolKind.Event, @@ -97,7 +97,7 @@ public override void Initialize(AnalysisContext analysisContext) analysisContext.RegisterSymbolAction( (context) => { - context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.Symbol.Locations.First(), messageArgs: context.Symbol.Name)); + context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.Symbol.GetFirstLocation(), messageArgs: context.Symbol.Name)); }, SymbolKind.NamedType); } @@ -151,7 +151,7 @@ public void Initialize(CodeBlockStartAnalysisContext analysis analysisContext.RegisterCodeBlockEndAction( (context) => { - context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.OwningSymbol.Locations.First(), messageArgs: context.OwningSymbol.Name + ":end")); + context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.OwningSymbol.GetFirstLocation(), messageArgs: context.OwningSymbol.Name + ":end")); }); analysisContext.RegisterSyntaxNodeAction( @@ -170,7 +170,7 @@ public void Initialize(CodeBlockStartAnalysisContext ana analysisContext.RegisterCodeBlockEndAction( (context) => { - context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.OwningSymbol.Locations.First(), messageArgs: context.OwningSymbol.Name + ":end")); + context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.OwningSymbol.GetFirstLocation(), messageArgs: context.OwningSymbol.Name + ":end")); }); analysisContext.RegisterSyntaxNodeAction( diff --git a/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicCompilation.vb b/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicCompilation.vb index 47ff89d6a4b26..1d4d124059615 100644 --- a/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicCompilation.vb +++ b/src/Compilers/VisualBasic/Portable/Compilation/VisualBasicCompilation.vb @@ -1596,7 +1596,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ' Global code is the entry point, ignore all other Mains. If ScriptClass IsNot Nothing Then For Each main In entryPointCandidates - diagnostics.Add(ERRID.WRN_MainIgnored, main.Locations.First(), main) + diagnostics.Add(ERRID.WRN_MainIgnored, main.GetFirstLocation(), main) Next Return ScriptClass.GetScriptEntryPoint() End If diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb index 17e8d23450c6b..304a3e2b45982 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb @@ -340,6 +340,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ''' Public MustOverride ReadOnly Property Locations As ImmutableArray(Of Location) + Public Function GetFirstLocation() As Location Implements ISymbolInternal.GetFirstLocation + Return Me.Locations(0) + End Function + + Public Function GetFirstLocationOrNone() As Location Implements ISymbolInternal.GetFirstLocationOrNone + Return If(Me.Locations.IsEmpty, Location.None, GetFirstLocation()) + End Function + ''' ''' Get the syntax node(s) where this symbol was declared in source. Some symbols (for example, ''' partial classes) may be defined in more than one location. This property should return diff --git a/src/Compilers/VisualBasic/Test/CommandLine/CommandLineTests.vb b/src/Compilers/VisualBasic/Test/CommandLine/CommandLineTests.vb index 0163745a8053b..9f094cd0a04f6 100644 --- a/src/Compilers/VisualBasic/Test/CommandLine/CommandLineTests.vb +++ b/src/Compilers/VisualBasic/Test/CommandLine/CommandLineTests.vb @@ -11025,8 +11025,8 @@ End Class End Property Public Sub AnalyzeSymbol(context As SymbolAnalysisContext) - context.ReportDiagnostic(Diagnostic.Create(Warning01, context.Symbol.Locations.First())) - context.ReportDiagnostic(Diagnostic.Create(Warning03, context.Symbol.Locations.First())) + context.ReportDiagnostic(Diagnostic.Create(Warning01, context.Symbol.GetFirstLocation())) + context.ReportDiagnostic(Diagnostic.Create(Warning03, context.Symbol.GetFirstLocation())) End Sub End Class @@ -11049,7 +11049,7 @@ End Class End Property Public Sub AnalyzeSymbol(context As SymbolAnalysisContext) - context.ReportDiagnostic(Diagnostic.Create(Warning04, context.Symbol.Locations.First())) + context.ReportDiagnostic(Diagnostic.Create(Warning04, context.Symbol.GetFirstLocation())) End Sub End Class diff --git a/src/Workspaces/Core/Portable/Shared/Extensions/IFindReferencesResultExtensions.cs b/src/Workspaces/Core/Portable/Shared/Extensions/IFindReferencesResultExtensions.cs index bab850e635e40..7be5108f6b65e 100644 --- a/src/Workspaces/Core/Portable/Shared/Extensions/IFindReferencesResultExtensions.cs +++ b/src/Workspaces/Core/Portable/Shared/Extensions/IFindReferencesResultExtensions.cs @@ -20,7 +20,7 @@ public static IEnumerable GetDefinitionLocationsToShow( this ISymbol definition) { return definition.IsKind(SymbolKind.Namespace) - ? [definition.Locations.First()] + ? [definition.GetFirstLocation()] : definition.Locations; } diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.AnonymousFunctionOrDelegateSymbolKey.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.AnonymousFunctionOrDelegateSymbolKey.cs index 0e4bba7f5a8b5..66c358f12d1a1 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.AnonymousFunctionOrDelegateSymbolKey.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.AnonymousFunctionOrDelegateSymbolKey.cs @@ -29,7 +29,7 @@ public static void Create(ISymbol symbol, SymbolKeyWriter visitor) // the anonymous-function, then use that anonymous-functoin to get at // the synthesized anonymous delegate. visitor.WriteBoolean(symbol.IsAnonymousDelegateType()); - visitor.WriteLocation(symbol.Locations.First()); + visitor.WriteLocation(symbol.GetFirstLocation()); } public static SymbolKeyResolution Resolve(SymbolKeyReader reader, out string? failureReason) diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Extensions/Symbols/SymbolEquivalenceComparer.EquivalenceVisitor.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Extensions/Symbols/SymbolEquivalenceComparer.EquivalenceVisitor.cs index 02576265a5e7d..ae8f082821866 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Extensions/Symbols/SymbolEquivalenceComparer.EquivalenceVisitor.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Extensions/Symbols/SymbolEquivalenceComparer.EquivalenceVisitor.cs @@ -272,7 +272,7 @@ private static bool AreCompatibleMethodKinds(MethodKind kind1, MethodKind kind2) private static bool HaveSameLocation(ISymbol x, ISymbol y) { return x.Locations.Length == 1 && y.Locations.Length == 1 && - x.Locations.First().Equals(y.Locations.First()); + x.GetFirstLocation().Equals(y.GetFirstLocation()); } private bool ModulesAreEquivalent(IModuleSymbol x, IModuleSymbol y) From fd9258cf1b967c80600b00f8346b54ab262d317a Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 14 Oct 2025 18:49:05 +0200 Subject: [PATCH 04/12] REvert --- .../ReassignedVariable/AbstractReassignedVariableService.cs | 2 +- .../Rename/SymbolicRenameLocations.ReferenceProcessing.cs | 2 +- .../Shared/Extensions/IFindReferencesResultExtensions.cs | 2 +- .../Solution/SolutionCompilationState.SymbolToProjectId.cs | 2 +- .../SymbolKey/SymbolKey.AnonymousFunctionOrDelegateSymbolKey.cs | 2 +- .../Compiler/Core/SymbolKey/SymbolKey.TypeParameterSymbolKey.cs | 2 +- .../Symbols/SymbolEquivalenceComparer.EquivalenceVisitor.cs | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Workspaces/Core/Portable/ReassignedVariable/AbstractReassignedVariableService.cs b/src/Workspaces/Core/Portable/ReassignedVariable/AbstractReassignedVariableService.cs index 05dc3aa0fa8fe..4bf8380866395 100644 --- a/src/Workspaces/Core/Portable/ReassignedVariable/AbstractReassignedVariableService.cs +++ b/src/Workspaces/Core/Portable/ReassignedVariable/AbstractReassignedVariableService.cs @@ -244,7 +244,7 @@ bool TryGetParameterLocation(SemanticModel semanticModel, IParameterSymbol param // error scenarios. if (parameter.Locations.Length > 0) { - var parameterLocation = parameter.GetFirstLocation(); + var parameterLocation = parameter.Locations[0]; if (parameterLocation.SourceTree == semanticModel.SyntaxTree) { location = parameterLocation.SourceSpan; diff --git a/src/Workspaces/Core/Portable/Rename/SymbolicRenameLocations.ReferenceProcessing.cs b/src/Workspaces/Core/Portable/Rename/SymbolicRenameLocations.ReferenceProcessing.cs index 856ea91d3aab7..0b3bba6d026d1 100644 --- a/src/Workspaces/Core/Portable/Rename/SymbolicRenameLocations.ReferenceProcessing.cs +++ b/src/Workspaces/Core/Portable/Rename/SymbolicRenameLocations.ReferenceProcessing.cs @@ -198,7 +198,7 @@ public static async Task> GetRenamableDefinitionL // destructors declarations that match the name if (referencedSymbol.Kind == SymbolKind.NamedType && referencedSymbol.Locations.All(l => l.IsInSource)) { - var firstLocation = referencedSymbol.GetFirstLocation(); + var firstLocation = referencedSymbol.Locations[0]; var syntaxFacts = solution.GetRequiredDocument(firstLocation.SourceTree!) .GetRequiredLanguageService(); diff --git a/src/Workspaces/Core/Portable/Shared/Extensions/IFindReferencesResultExtensions.cs b/src/Workspaces/Core/Portable/Shared/Extensions/IFindReferencesResultExtensions.cs index 7be5108f6b65e..bab850e635e40 100644 --- a/src/Workspaces/Core/Portable/Shared/Extensions/IFindReferencesResultExtensions.cs +++ b/src/Workspaces/Core/Portable/Shared/Extensions/IFindReferencesResultExtensions.cs @@ -20,7 +20,7 @@ public static IEnumerable GetDefinitionLocationsToShow( this ISymbol definition) { return definition.IsKind(SymbolKind.Namespace) - ? [definition.GetFirstLocation()] + ? [definition.Locations.First()] : definition.Locations; } diff --git a/src/Workspaces/Core/Portable/Workspace/Solution/SolutionCompilationState.SymbolToProjectId.cs b/src/Workspaces/Core/Portable/Workspace/Solution/SolutionCompilationState.SymbolToProjectId.cs index f658efe64b6f4..2e08d2deb7f03 100644 --- a/src/Workspaces/Core/Portable/Workspace/Solution/SolutionCompilationState.SymbolToProjectId.cs +++ b/src/Workspaces/Core/Portable/Workspace/Solution/SolutionCompilationState.SymbolToProjectId.cs @@ -79,7 +79,7 @@ internal sealed partial class SolutionCompilationState // projects, but which have the same syntax-tree (which is only in one project). We need to actually // check it's assembly symbol so that we get the actual project it is from (the original project, or the // retargetted project). - var syntaxTree = symbol.GetFirstLocation().SourceTree; + var syntaxTree = symbol.Locations[0].SourceTree; Contract.ThrowIfNull(syntaxTree); var documentId = this.GetDocumentState(syntaxTree, projectId: null)?.Id; diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.AnonymousFunctionOrDelegateSymbolKey.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.AnonymousFunctionOrDelegateSymbolKey.cs index 66c358f12d1a1..0e4bba7f5a8b5 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.AnonymousFunctionOrDelegateSymbolKey.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.AnonymousFunctionOrDelegateSymbolKey.cs @@ -29,7 +29,7 @@ public static void Create(ISymbol symbol, SymbolKeyWriter visitor) // the anonymous-function, then use that anonymous-functoin to get at // the synthesized anonymous delegate. visitor.WriteBoolean(symbol.IsAnonymousDelegateType()); - visitor.WriteLocation(symbol.GetFirstLocation()); + visitor.WriteLocation(symbol.Locations.First()); } public static SymbolKeyResolution Resolve(SymbolKeyReader reader, out string? failureReason) diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.TypeParameterSymbolKey.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.TypeParameterSymbolKey.cs index d4f2619c5e610..d81c83767656e 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.TypeParameterSymbolKey.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/SymbolKey/SymbolKey.TypeParameterSymbolKey.cs @@ -17,7 +17,7 @@ public sealed override void Create(ITypeParameterSymbol symbol, SymbolKeyWriter if (symbol.TypeParameterKind == TypeParameterKind.Cref) { visitor.WriteBoolean(true); - visitor.WriteLocation(symbol.GetFirstLocation()); + visitor.WriteLocation(symbol.Locations[0]); } else { diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Extensions/Symbols/SymbolEquivalenceComparer.EquivalenceVisitor.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Extensions/Symbols/SymbolEquivalenceComparer.EquivalenceVisitor.cs index ae8f082821866..02576265a5e7d 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Extensions/Symbols/SymbolEquivalenceComparer.EquivalenceVisitor.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Extensions/Symbols/SymbolEquivalenceComparer.EquivalenceVisitor.cs @@ -272,7 +272,7 @@ private static bool AreCompatibleMethodKinds(MethodKind kind1, MethodKind kind2) private static bool HaveSameLocation(ISymbol x, ISymbol y) { return x.Locations.Length == 1 && y.Locations.Length == 1 && - x.GetFirstLocation().Equals(y.GetFirstLocation()); + x.Locations.First().Equals(y.Locations.First()); } private bool ModulesAreEquivalent(IModuleSymbol x, IModuleSymbol y) From af0fc0aea75f79721dbaad7a0b8a71265f965897 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 14 Oct 2025 18:49:36 +0200 Subject: [PATCH 05/12] Revert --- .../SymbolDisplayVisitor_Minimal.cs | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/Compilers/CSharp/Portable/SymbolDisplay/SymbolDisplayVisitor_Minimal.cs b/src/Compilers/CSharp/Portable/SymbolDisplay/SymbolDisplayVisitor_Minimal.cs index 1864bc2fe06ae..4df1ce062cffd 100644 --- a/src/Compilers/CSharp/Portable/SymbolDisplay/SymbolDisplayVisitor_Minimal.cs +++ b/src/Compilers/CSharp/Portable/SymbolDisplay/SymbolDisplayVisitor_Minimal.cs @@ -240,26 +240,28 @@ private IDictionary CreateAliasMap() { ITypeSymbol? type = null; - if (this.IsMinimizing && - symbol.Locations is [{ IsInSource: true } location, ..] && - location.SourceTree == SemanticModelOpt.SyntaxTree) + if (this.IsMinimizing && !symbol.Locations.IsEmpty) { - var token = location.SourceTree.GetRoot().FindToken(PositionOpt); - var queryBody = GetQueryBody(token); - if (queryBody != null) + var location = symbol.Locations.First(); + if (location.IsInSource && location.SourceTree == SemanticModelOpt.SyntaxTree) { - // To heuristically determine the type of the range variable in a query - // clause, we speculatively bind the name of the variable in the select - // or group clause of the query body. - var identifierName = SyntaxFactory.IdentifierName(symbol.Name); - type = SemanticModelOpt.GetSpeculativeTypeInfo( - queryBody.SelectOrGroup.Span.End - 1, identifierName, SpeculativeBindingOption.BindAsExpression).Type; - } + var token = location.SourceTree.GetRoot().FindToken(PositionOpt); + var queryBody = GetQueryBody(token); + if (queryBody != null) + { + // To heuristically determine the type of the range variable in a query + // clause, we speculatively bind the name of the variable in the select + // or group clause of the query body. + var identifierName = SyntaxFactory.IdentifierName(symbol.Name); + type = SemanticModelOpt.GetSpeculativeTypeInfo( + queryBody.SelectOrGroup.Span.End - 1, identifierName, SpeculativeBindingOption.BindAsExpression).Type; + } - var identifier = token.Parent as IdentifierNameSyntax; - if (identifier != null) - { - type = SemanticModelOpt.GetTypeInfo(identifier).Type; + var identifier = token.Parent as IdentifierNameSyntax; + if (identifier != null) + { + type = SemanticModelOpt.GetTypeInfo(identifier).Type; + } } } From 408c51eff1860e425451a493dc1e2df933d5bfcc Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 14 Oct 2025 18:50:47 +0200 Subject: [PATCH 06/12] Revert --- .../CSharp/Test/CommandLine/CommandLineTests.cs | 4 ++-- .../CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs | 4 ++-- .../Emit/EditAndContinue/EditAndContinueTestBase.cs | 4 ++-- .../Test/Emit3/Diagnostics/DiagnosticAnalyzerTests.cs | 4 ++-- .../Test/Symbol/Compilation/SemanticModelAPITests.cs | 10 +++++----- .../SemanticModelGetDeclaredSymbolAPITests.cs | 2 +- .../Symbol/Symbols/AnonymousTypesSemanticsTests.cs | 4 ++-- .../Test/Symbol/Symbols/AnonymousTypesSymbolTests.cs | 10 +++++----- .../Test/Symbol/Symbols/CompilationCreationTests.cs | 4 ++-- .../CSharp/Test/Symbol/Symbols/CovariantReturnTests.cs | 2 +- .../Symbol/Symbols/Source/DeclaringSyntaxNodeTests.cs | 4 ++-- .../CSharp/Test/Symbol/Symbols/Source/DelegateTests.cs | 4 ++-- .../Test/Symbol/Symbols/Source/FileModifierTests.cs | 8 ++++---- .../CSharp/Test/Symbol/Symbols/Source/LocationTests.cs | 2 +- .../CSharp/Test/Symbol/Symbols/Source/PropertyTests.cs | 4 ++-- 15 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs b/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs index ecbd030eac4fd..92201963a4ebd 100644 --- a/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs +++ b/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs @@ -15999,7 +15999,7 @@ public override void CreateAnalyzerWithinCompilation(CompilationStartAnalysisCon context.RegisterSymbolAction( (symbolContext) => { - symbolContext.ReportDiagnostic(Diagnostic.Create(Warning01, symbolContext.Symbol.GetFirstLocation())); + symbolContext.ReportDiagnostic(Diagnostic.Create(Warning01, symbolContext.Symbol.Locations.First())); }, SymbolKind.NamedType); } @@ -16016,7 +16016,7 @@ public override void CreateAnalyzerWithinCompilation(CompilationStartAnalysisCon context.RegisterSymbolAction( static (symbolContext) => { - symbolContext.ReportDiagnostic(Diagnostic.Create(Warning02, symbolContext.Symbol.GetFirstLocation())); + symbolContext.ReportDiagnostic(Diagnostic.Create(Warning02, symbolContext.Symbol.Locations.First())); }, SymbolKind.NamedType); } diff --git a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs index 9452154002487..9a74195925056 100644 --- a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs +++ b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs @@ -17373,7 +17373,7 @@ static void Main() Assert.Equal(SymbolKind.Field, sym.Symbol.Kind); Assert.Equal("Alice", sym.Symbol.Name); - Assert.Equal(nc.Name.GetLocation(), sym.Symbol.GetFirstLocation()); + Assert.Equal(nc.Name.GetLocation(), sym.Symbol.Locations[0]); } [Fact] @@ -17408,7 +17408,7 @@ static void Main() Assert.Equal(SymbolKind.Field, bobField.Kind); var secondElement = nodes.OfType().First().Arguments[1]; - Assert.Equal(secondElement.GetLocation(), bobField.GetFirstLocation()); + Assert.Equal(secondElement.GetLocation(), bobField.Locations[0]); } [Fact] diff --git a/src/Compilers/CSharp/Test/Emit2/Emit/EditAndContinue/EditAndContinueTestBase.cs b/src/Compilers/CSharp/Test/Emit2/Emit/EditAndContinue/EditAndContinueTestBase.cs index a03ef17d82f94..0c6d34625bc7c 100644 --- a/src/Compilers/CSharp/Test/Emit2/Emit/EditAndContinue/EditAndContinueTestBase.cs +++ b/src/Compilers/CSharp/Test/Emit2/Emit/EditAndContinue/EditAndContinueTestBase.cs @@ -91,8 +91,8 @@ internal static Func GetSyntaxMapByKind(MethodSymbol met internal static Func GetEquivalentNodesMap(MethodSymbol method1, MethodSymbol method0) { - var tree1 = method1.GetFirstLocation().SourceTree; - var tree0 = method0.GetFirstLocation().SourceTree; + var tree1 = method1.Locations[0].SourceTree; + var tree0 = method0.Locations[0].SourceTree; Assert.NotEqual(tree1, tree0); var locals0 = GetAllLocals(method0); diff --git a/src/Compilers/CSharp/Test/Emit3/Diagnostics/DiagnosticAnalyzerTests.cs b/src/Compilers/CSharp/Test/Emit3/Diagnostics/DiagnosticAnalyzerTests.cs index 303f01a4398c3..2c98eac46a0ce 100644 --- a/src/Compilers/CSharp/Test/Emit3/Diagnostics/DiagnosticAnalyzerTests.cs +++ b/src/Compilers/CSharp/Test/Emit3/Diagnostics/DiagnosticAnalyzerTests.cs @@ -270,7 +270,7 @@ private void AnalyzeNode(SyntaxNodeAnalysisContext context) private void AnalyzeSymbol(SymbolAnalysisContext context) { - var diag1 = CodeAnalysis.Diagnostic.Create(s_descriptor, context.Symbol.GetFirstLocation(), "NamedType"); + var diag1 = CodeAnalysis.Diagnostic.Create(s_descriptor, context.Symbol.Locations[0], "NamedType"); context.ReportDiagnostic(diag1); } } @@ -839,7 +839,7 @@ public override void Initialize(AnalysisContext context) context.RegisterSymbolAction(ctxt => { var method = ((IMethodSymbol)ctxt.Symbol); - ctxt.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(Descriptor1, method.GetFirstLocation(), method.ToDisplayString())); + ctxt.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(Descriptor1, method.Locations[0], method.ToDisplayString())); }, SymbolKind.Method); } } diff --git a/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelAPITests.cs b/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelAPITests.cs index 6a9eba00c90b7..b3c2a0919260f 100644 --- a/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelAPITests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelAPITests.cs @@ -972,7 +972,7 @@ static partial void Goo(ulong x) { } Assert.NotNull(sym2); Assert.Equal("System.UInt64 x", sym1.ToTestDisplayString()); Assert.Equal("System.UInt64 x", sym2.ToTestDisplayString()); - Assert.NotEqual(sym1.GetFirstLocation(), sym2.GetFirstLocation()); + Assert.NotEqual(sym1.Locations[0], sym2.Locations[0]); } [Fact, WorkItem(544473, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544473")] @@ -1013,7 +1013,7 @@ static partial void Goo(T x) { } Assert.NotNull(sym2); Assert.Equal("T", sym1.ToTestDisplayString()); Assert.Equal("T", sym2.ToTestDisplayString()); - Assert.NotEqual(sym1.GetFirstLocation(), sym2.GetFirstLocation()); + Assert.NotEqual(sym1.Locations[0], sym2.Locations[0]); } [Fact] @@ -1195,7 +1195,7 @@ public object this[int index] var paras = descendants.OfType(); Assert.Equal(1, paras.Count()); var parasym = model.GetDeclaredSymbol(paras.First()); - var ploc = parasym.GetFirstLocation(); + var ploc = parasym.Locations[0]; var args = descendants.OfType().Where(s => s.ToString() == "index").Select(s => s); Assert.Equal(2, args.Count()); @@ -1204,8 +1204,8 @@ public object this[int index] Assert.NotNull(argsym1); Assert.NotNull(argsym2); - Assert.Equal(ploc, argsym1.GetFirstLocation()); - Assert.Equal(ploc, argsym2.GetFirstLocation()); + Assert.Equal(ploc, argsym1.Locations[0]); + Assert.Equal(ploc, argsym2.Locations[0]); Assert.Equal(parasym.Kind, argsym1.Kind); Assert.Equal(parasym.Kind, argsym2.Kind); diff --git a/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelGetDeclaredSymbolAPITests.cs b/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelGetDeclaredSymbolAPITests.cs index cf819cc17a26b..b6b34a021a5a6 100644 --- a/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelGetDeclaredSymbolAPITests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelGetDeclaredSymbolAPITests.cs @@ -3900,7 +3900,7 @@ partial class program var model = comp.GetSemanticModel(tree); var param = tree.GetCompilationUnitRoot().DescendantNodes().OfType().Where(p => p.Identifier.ValueText == "name").First(); var symbol = model.GetDeclaredSymbol(param); - Assert.Equal(param.Identifier.Span, symbol.GetFirstLocation().SourceSpan); + Assert.Equal(param.Identifier.Span, symbol.Locations[0].SourceSpan); } [WorkItem(542217, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/542217")] diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSemanticsTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSemanticsTests.cs index 885141ec5f4af..c94ce3159fb76 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSemanticsTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSemanticsTests.cs @@ -1992,7 +1992,7 @@ private CompilationUtils.SemanticInfoSummary GetAnonymousTypeInfoSummary(TestDat Assert.Equal(0, type.Interfaces.Length); Assert.Equal(1, type.Locations.Length); - Assert.Equal(typeSpan, type.GetFirstLocation().SourceSpan); + Assert.Equal(typeSpan, type.Locations[0].SourceSpan); foreach (int field in fields) { @@ -2021,7 +2021,7 @@ private void CheckFieldNameAndLocation(TestData data, ITypeSymbol type, SyntaxNo Assert.NotNull(property); Assert.Equal(fieldName, property.Name); Assert.Equal(1, property.Locations.Length); - Assert.Equal(span, property.GetFirstLocation().SourceSpan); + Assert.Equal(span, property.Locations[0].SourceSpan); IMethodSymbol getter = property.GetMethod; Assert.NotNull(getter); diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSymbolTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSymbolTests.cs index d28a46728bebf..3f21385a75283 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSymbolTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSymbolTests.cs @@ -1643,7 +1643,7 @@ static void Main() Assert.NotNull(sym.Symbol); Assert.True(sym.Symbol.GetSymbol().IsFromCompilation(comp), "IsFromCompilation"); Assert.False(sym.Symbol.Locations.IsEmpty, "Symbol Location"); - Assert.True(sym.Symbol.GetFirstLocation().IsInSource); + Assert.True(sym.Symbol.Locations[0].IsInSource); var info = model.GetTypeInfo(expr); Assert.NotNull(info.Type); @@ -1652,7 +1652,7 @@ static void Main() { Assert.True(m.GetSymbol().IsFromCompilation(comp), "IsFromCompilation"); Assert.False(m.Locations.IsEmpty, String.Format("No Location: {0}", m)); - Assert.True(m.GetFirstLocation().IsInSource); + Assert.True(m.Locations[0].IsInSource); } } @@ -1695,12 +1695,12 @@ static void Main() // different locations. Assert.Equal(typeA3, typeA4); Assert.NotSame(typeA3, typeA4); - Assert.NotEqual(typeA3.GetFirstLocation(), typeA4.GetFirstLocation()); + Assert.NotEqual(typeA3.Locations[0], typeA4.Locations[0]); // The locations of a3's type should be the type declared in statement 1, the location // of a4's type should be the type declared in statement 2. - Assert.True(statement1.Span.Contains(typeA3.GetFirstLocation().SourceSpan)); - Assert.True(statement2.Span.Contains(typeA4.GetFirstLocation().SourceSpan)); + Assert.True(statement1.Span.Contains(typeA3.Locations[0].SourceSpan)); + Assert.True(statement2.Span.Contains(typeA4.Locations[0].SourceSpan)); } private static readonly SyntaxTree s_equalityComparerSourceTree = Parse(@" diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/CompilationCreationTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/CompilationCreationTests.cs index af9b17a536de5..57cad756170cb 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/CompilationCreationTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/CompilationCreationTests.cs @@ -57,7 +57,7 @@ private static void CheckCompilationSyntaxTrees(CSharpCompilation compilation, p { for (int j = 0; j < numTrees; j++) { - Assert.Equal(Math.Sign(compilation.CompareSourceLocations(types[i].GetFirstLocation(), types[j].GetFirstLocation())), Math.Sign(i.CompareTo(j))); + Assert.Equal(Math.Sign(compilation.CompareSourceLocations(types[i].Locations[0], types[j].Locations[0])), Math.Sign(i.CompareTo(j))); } } } @@ -2566,7 +2566,7 @@ Class4 M3() PEAssemblySymbol Lib1_V1 = (PEAssemblySymbol)c1AsmSource.Modules[0].GetReferencedAssemblySymbols()[1]; PEModuleSymbol module1 = (PEModuleSymbol)c1AsmSource.Modules[1]; - Assert.Equal(LocationKind.MetadataFile, ((MetadataLocation)Lib1_V1.GetFirstLocation()).Kind); + Assert.Equal(LocationKind.MetadataFile, ((MetadataLocation)Lib1_V1.Locations[0]).Kind); SourceAssemblySymbol c2AsmSource = (SourceAssemblySymbol)c2.Assembly; RetargetingAssemblySymbol c1AsmRef = (RetargetingAssemblySymbol)c2AsmSource.Modules[0].GetReferencedAssemblySymbols()[2]; PEAssemblySymbol Lib1_V2 = (PEAssemblySymbol)c2AsmSource.Modules[0].GetReferencedAssemblySymbols()[1]; diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/CovariantReturnTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/CovariantReturnTests.cs index a3a7bb7421029..a073f18206aa4 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/CovariantReturnTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/CovariantReturnTests.cs @@ -670,7 +670,7 @@ static void verifyAttribute(MethodSymbol method, bool needsAttribute) { var isCovariant = !method.ReturnType.Equals(method.OverriddenMethod.ReturnType); Assert.Equal(needsAttribute, isCovariant); - var attributeExpected = isCovariant && !method.GetFirstLocation().IsInSource; + var attributeExpected = isCovariant && !method.Locations[0].IsInSource; var attrs = method.GetAttributes("System.Runtime.CompilerServices", "PreserveBaseOverridesAttribute"); Assert.Equal(attributeExpected, !attrs.IsEmpty()); } diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DeclaringSyntaxNodeTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DeclaringSyntaxNodeTests.cs index 004b8b523e036..01b6dffd437d5 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DeclaringSyntaxNodeTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DeclaringSyntaxNodeTests.cs @@ -347,7 +347,7 @@ private void CheckAnonymousType(SemanticModel model, ILocalSymbol local, Anonymo // Locations: Return the Span of that particular // AnonymousObjectCreationExpression's NewKeyword. Assert.Equal(1, localType.Locations.Length); - Assert.Equal(localType.GetFirstLocation(), anonObjectCreation.NewKeyword.GetLocation()); + Assert.Equal(localType.Locations[0], anonObjectCreation.NewKeyword.GetLocation()); // Members check int propIndex = 0; @@ -380,7 +380,7 @@ private void CheckAnonymousType(SemanticModel model, ILocalSymbol local, Anonymo // Locations: Return the Span of that particular // AnonymousObjectMemberDeclarator's IdentifierToken. Assert.Equal(1, member.Locations.Length); - Assert.Equal(member.GetFirstLocation(), propertyInitializer.NameEquals.Name.GetLocation()); + Assert.Equal(member.Locations[0], propertyInitializer.NameEquals.Name.GetLocation()); propIndex++; } diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DelegateTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DelegateTests.cs index cb80e8383c1f2..aea7c81f322db 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DelegateTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/DelegateTests.cs @@ -72,8 +72,8 @@ class A { var a = global.GetTypeMembers("A", 0).Single(); var d = a.GetMembers("D")[0] as NamedTypeSymbol; var tmp = d.GetMembers(); - Assert.Equal(d.GetFirstLocation(), d.DelegateInvokeMethod.GetFirstLocation(), EqualityComparer.Default); - Assert.Equal(d.GetFirstLocation(), d.InstanceConstructors[0].GetFirstLocation(), EqualityComparer.Default); + Assert.Equal(d.Locations[0], d.DelegateInvokeMethod.Locations[0], EqualityComparer.Default); + Assert.Equal(d.Locations[0], d.InstanceConstructors[0].Locations[0], EqualityComparer.Default); } [Fact] diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/FileModifierTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/FileModifierTests.cs index 63de4f768d002..08223c5997bbb 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/FileModifierTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/FileModifierTests.cs @@ -888,7 +888,7 @@ void verify() // file class C Diagnostic(ErrorCode.ERR_FileTypeNonUniquePath, "C").WithArguments("C", "path/to/file.cs").WithLocation(5, 12)); var classC = comp.GetMember("C"); - Assert.Equal(source1, classC.GetFirstLocation().SourceTree); + Assert.Equal(source1, classC.Locations[0].SourceTree); AssertEx.Equal("F620949CDCC480533E3607E5DD92F88E866EC1D65C225D70509A32F831433D9A4__C", classC.MetadataName); } } @@ -935,7 +935,7 @@ void verify() // file class C Diagnostic(ErrorCode.ERR_FileTypeNonUniquePath, "C").WithArguments("C", "path/to/file.cs").WithLocation(5, 12)); var member = comp.GetMember("C"); - Assert.Equal(source1, member.GetFirstLocation().SourceTree); + Assert.Equal(source1, member.Locations[0].SourceTree); AssertEx.Equal("F620949CDCC480533E3607E5DD92F88E866EC1D65C225D70509A32F831433D9A4__C", member.MetadataName); } } @@ -970,7 +970,7 @@ void verify() // file class C Diagnostic(ErrorCode.ERR_FileTypeNonUniquePath, "C").WithArguments("NS1.NS2.C", "path/to/file.cs").WithLocation(5, 12)); var classC = comp.GetMember("NS1.NS2.C"); - Assert.Equal(source1, classC.GetFirstLocation().SourceTree); + Assert.Equal(source1, classC.Locations[0].SourceTree); AssertEx.Equal("F620949CDCC480533E3607E5DD92F88E866EC1D65C225D70509A32F831433D9A4__C`1", classC.MetadataName); } } @@ -1000,7 +1000,7 @@ void verify() { comp.VerifyEmitDiagnostics(); var classC = comp.GetMember("C"); - Assert.Equal(source1, classC.GetFirstLocation().SourceTree); + Assert.Equal(source1, classC.Locations[0].SourceTree); AssertEx.Equal("F620949CDCC480533E3607E5DD92F88E866EC1D65C225D70509A32F831433D9A4__C", classC.MetadataName); } } diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/LocationTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/LocationTests.cs index 7d54dfd806def..2871329d52531 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/LocationTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/LocationTests.cs @@ -32,7 +32,7 @@ public void Simple1() var c = s.GetTypeMembers("C", 0).Single() as NamedTypeSymbol; AssertPos(c, 20, 1); var obj = c.BaseType(); - Assert.Equal("MetadataFile(CommonLanguageRuntimeLibrary)", obj.GetFirstLocation().ToString()); + Assert.Equal("MetadataFile(CommonLanguageRuntimeLibrary)", obj.Locations[0].ToString()); var f = c.GetMembers("F").Single() as FieldSymbol; AssertPos(f, 26, 1); var m = c.GetMembers("M").Single() as MethodSymbol; diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/PropertyTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/PropertyTests.cs index b58466a16ce85..d47c46b4a4bb3 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/PropertyTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/PropertyTests.cs @@ -410,7 +410,7 @@ struct S Assert.False(backField.Locations.IsEmpty); var prop = type01.GetMembers("Prop").Single() as PropertySymbol; Assert.Equal(prop.Locations.Length, backField.Locations.Length); - Assert.Equal(prop.GetFirstLocation().ToString(), backField.GetFirstLocation().ToString()); + Assert.Equal(prop.Locations[0].ToString(), backField.Locations[0].ToString()); // ------------------------------------- mems = type02.GetMembers(); backField = null; @@ -429,7 +429,7 @@ struct S Assert.False(backField.Locations.IsEmpty); prop = type02.GetMembers("Prop").Single() as PropertySymbol; Assert.Equal(prop.Locations.Length, backField.Locations.Length); - Assert.Equal(prop.GetFirstLocation().ToString(), backField.GetFirstLocation().ToString()); + Assert.Equal(prop.Locations[0].ToString(), backField.Locations[0].ToString()); } [WorkItem(537401, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537401")] From 0c9776c81c24ef7d00820f63420bb64dabd1aa56 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 14 Oct 2025 18:52:03 +0200 Subject: [PATCH 07/12] REvert --- .../Diagnostics/CommonDiagnosticAnalyzers.cs | 40 +++++++++---------- ...ssageAttributeTests.DiagnosticAnalyzers.cs | 8 ++-- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/Compilers/Test/Core/Diagnostics/CommonDiagnosticAnalyzers.cs b/src/Compilers/Test/Core/Diagnostics/CommonDiagnosticAnalyzers.cs index 6d69a92891fb0..7c847bc77bde1 100644 --- a/src/Compilers/Test/Core/Diagnostics/CommonDiagnosticAnalyzers.cs +++ b/src/Compilers/Test/Core/Diagnostics/CommonDiagnosticAnalyzers.cs @@ -607,7 +607,7 @@ public override void Initialize(AnalysisContext context) { context.RegisterCodeBlockAction(codeBlockContext => { - codeBlockContext.ReportDiagnostic(Diagnostic.Create(CodeBlockTopLevelRule, codeBlockContext.OwningSymbol.GetFirstLocation(), codeBlockContext.OwningSymbol.Name)); + codeBlockContext.ReportDiagnostic(Diagnostic.Create(CodeBlockTopLevelRule, codeBlockContext.OwningSymbol.Locations[0], codeBlockContext.OwningSymbol.Name)); }); if (!_onlyStatelessAction) @@ -616,7 +616,7 @@ public override void Initialize(AnalysisContext context) { compilationStartContext.RegisterCodeBlockAction(codeBlockContext => { - codeBlockContext.ReportDiagnostic(Diagnostic.Create(CodeBlockPerCompilationRule, codeBlockContext.OwningSymbol.GetFirstLocation(), codeBlockContext.OwningSymbol.Name)); + codeBlockContext.ReportDiagnostic(Diagnostic.Create(CodeBlockPerCompilationRule, codeBlockContext.OwningSymbol.Locations[0], codeBlockContext.OwningSymbol.Name)); }); }); } @@ -763,7 +763,7 @@ public override void Initialize(AnalysisContext context) context.RegisterSymbolAction(context => { CallbackSymbols.Add(context.Symbol); - context.ReportDiagnostic(Diagnostic.Create(Rule, context.Symbol.GetFirstLocation())); + context.ReportDiagnostic(Diagnostic.Create(Rule, context.Symbol.Locations[0])); }, SymbolKind.NamedType); } } @@ -795,7 +795,7 @@ private void AnalyzeSymbol(SymbolAnalysisContext context) var ns = (INamespaceSymbol)context.Symbol; if (ns.ContainingAssembly != context.Compilation.Assembly || ns.ConstituentNamespaces.Length > 1) { - context.ReportDiagnostic(Diagnostic.Create(Rule, ns.GetFirstLocation())); + context.ReportDiagnostic(Diagnostic.Create(Rule, ns.Locations[0])); } } } @@ -1000,7 +1000,7 @@ public override void Initialize(AnalysisContext context) { context.RegisterSymbolAction(symbolContext => { - symbolContext.ReportDiagnostic(Diagnostic.Create(Rule, symbolContext.Symbol.GetFirstLocation())); + symbolContext.ReportDiagnostic(Diagnostic.Create(Rule, symbolContext.Symbol.Locations[0])); }, SymbolKind.NamedType); } @@ -1040,7 +1040,7 @@ public override void Initialize(AnalysisContext context) context.RegisterSymbolAction(symbolContext => { // Report diagnostic with incorrect number of message format arguments. - symbolContext.ReportDiagnostic(Diagnostic.Create(Rule, symbolContext.Symbol.GetFirstLocation(), symbolContext.Symbol.Name)); + symbolContext.ReportDiagnostic(Diagnostic.Create(Rule, symbolContext.Symbol.Locations[0], symbolContext.Symbol.Name)); }, SymbolKind.NamedType); } } @@ -1174,7 +1174,7 @@ private void OnCompilationStart(CompilationStartAnalysisContext context) } // ok, now report diagnostic on the symbol. - var diagnostic = Diagnostic.Create(Descriptor, symbolContext.Symbol.GetFirstLocation(), symbolContext.Symbol.Name); + var diagnostic = Diagnostic.Create(Descriptor, symbolContext.Symbol.Locations[0], symbolContext.Symbol.Name); symbolContext.ReportDiagnostic(diagnostic); }, SymbolKind.NamedType); } @@ -1216,7 +1216,7 @@ private void ReportDiagnosticIfActionInvokedConcurrently(SemaphoreSlim gate, Sym { if (gate.CurrentCount != registeredActionCounts - 1) { - var diagnostic = Diagnostic.Create(Descriptor, symbolContext.Symbol.GetFirstLocation()); + var diagnostic = Diagnostic.Create(Descriptor, symbolContext.Symbol.Locations[0]); symbolContext.ReportDiagnostic(diagnostic); } } @@ -1332,7 +1332,7 @@ public override void Initialize(AnalysisContext context) case ActionKind.OperationBlockEnd: context.RegisterOperationBlockStartAction(blockStartContext => { - blockStartContext.RegisterOperationBlockEndAction(c => ReportDiagnostic(c.ReportDiagnostic, c.OwningSymbol.GetFirstLocation())); + blockStartContext.RegisterOperationBlockEndAction(c => ReportDiagnostic(c.ReportDiagnostic, c.OwningSymbol.Locations[0])); CacheAndVerifyControlFlowGraph(blockStartContext.OperationBlocks, op => (blockStartContext.GetControlFlowGraph(op), blockStartContext.OwningSymbol)); }); @@ -1341,7 +1341,7 @@ public override void Initialize(AnalysisContext context) case ActionKind.OperationBlock: context.RegisterOperationBlockAction(blockContext => { - ReportDiagnostic(blockContext.ReportDiagnostic, blockContext.OwningSymbol.GetFirstLocation()); + ReportDiagnostic(blockContext.ReportDiagnostic, blockContext.OwningSymbol.Locations[0]); CacheAndVerifyControlFlowGraph(blockContext.OperationBlocks, op => (blockContext.GetControlFlowGraph(op), blockContext.OwningSymbol)); }); @@ -1389,7 +1389,7 @@ public override void Initialize(AnalysisContext context) { foreach (var operationRoot in c.OperationBlocks) { - var diagnostic = Diagnostic.Create(Descriptor, c.OwningSymbol.GetFirstLocation(), c.OwningSymbol.Name, operationRoot.Kind); + var diagnostic = Diagnostic.Create(Descriptor, c.OwningSymbol.Locations[0], c.OwningSymbol.Name, operationRoot.Kind); c.ReportDiagnostic(diagnostic); } }); @@ -1657,7 +1657,7 @@ private void OnCompilationStart(CompilationStartAnalysisContext context) private void ReportSymbolDiagnostics(ISymbol symbol, Action addDiagnostic) { - ReportDiagnosticsCore(addDiagnostic, symbol.GetFirstLocation(), symbol.Name); + ReportDiagnosticsCore(addDiagnostic, symbol.Locations[0], symbol.Name); } private void ReportTreeDiagnostics(SyntaxTree tree, Action addDiagnostic) @@ -1703,7 +1703,7 @@ public override void Initialize(AnalysisContext context) { foreach (var namedType in namedTypes) { - var diagnostic = Diagnostic.Create(Rule, namedType.GetFirstLocation(), namedType.Name, namedTypes.Count); + var diagnostic = Diagnostic.Create(Rule, namedType.Locations[0], namedType.Name, namedTypes.Count); compilationEndContext.ReportDiagnostic(diagnostic); } }); @@ -1811,7 +1811,7 @@ private void OnCompilationStart(CompilationStartAnalysisContext context) } } - var diagnostic = Diagnostic.Create(descriptor, symbolContext.Symbol.GetFirstLocation(), symbolContext.Symbol.Name); + var diagnostic = Diagnostic.Create(descriptor, symbolContext.Symbol.Locations[0], symbolContext.Symbol.Name); symbolContext.ReportDiagnostic(diagnostic); }, SymbolKind.NamedType); @@ -1861,7 +1861,7 @@ public override void Initialize(AnalysisContext context) private void SymbolAction(SymbolAnalysisContext context) { - context.ReportDiagnostic(Diagnostic.Create(ParameterDescriptor, context.Symbol.GetFirstLocation())); + context.ReportDiagnostic(Diagnostic.Create(ParameterDescriptor, context.Symbol.Locations[0])); } } @@ -2460,7 +2460,7 @@ public override void Initialize(AnalysisContext context) } private void ReportDiagnostic(ISymbol symbol, Action reportDiagnostic) - => reportDiagnostic(Diagnostic.Create(_rule, symbol.GetFirstLocation(), symbol.Name)); + => reportDiagnostic(Diagnostic.Create(_rule, symbol.Locations[0], symbol.Name)); } [DiagnosticAnalyzer(LanguageNames.CSharp, LanguageNames.VisualBasic)] @@ -2542,7 +2542,7 @@ public override void Initialize(AnalysisContext context) throw new NotImplementedException(); } - var diagnostic = Diagnostic.Create(Descriptor, context.Symbol.GetFirstLocation(), _reportedSeverity, additionalLocations: null, properties: null, messageArgs: null); + var diagnostic = Diagnostic.Create(Descriptor, context.Symbol.Locations[0], _reportedSeverity, additionalLocations: null, properties: null, messageArgs: null); context.ReportDiagnostic(diagnostic); }, SymbolKind.NamedType); @@ -2570,7 +2570,7 @@ public override void Initialize(AnalysisContext analysisContext) private void OnOperationBlockStart(OperationBlockStartAnalysisContext context) { context.RegisterOperationBlockEndAction( - endContext => endContext.ReportDiagnostic(Diagnostic.Create(s_descriptor, context.OwningSymbol.GetFirstLocation()))); + endContext => endContext.ReportDiagnostic(Diagnostic.Create(s_descriptor, context.OwningSymbol.Locations[0]))); } } @@ -2610,7 +2610,7 @@ public override void Initialize(AnalysisContext context) else { context.RegisterSymbolAction( - context => context.ReportDiagnostic(Diagnostic.Create(Descriptor, context.Symbol.GetFirstLocation())), + context => context.ReportDiagnostic(Diagnostic.Create(Descriptor, context.Symbol.Locations[0])), SymbolKind.Field); } } @@ -2940,7 +2940,7 @@ private void OnCompilationStart(CompilationStartAnalysisContext context) context.RegisterSyntaxNodeAction(context => HandleCallback(context.Node.GetLocation(), context.Compilation, context.ReportDiagnostic, context.CancellationToken), CodeAnalysis.CSharp.SyntaxKind.ClassDeclaration); break; case AnalyzerRegisterActionKind.Symbol: - context.RegisterSymbolAction(context => HandleCallback(context.Symbol.GetFirstLocation(), context.Compilation, context.ReportDiagnostic, context.CancellationToken), SymbolKind.NamedType); + context.RegisterSymbolAction(context => HandleCallback(context.Symbol.Locations[0], context.Compilation, context.ReportDiagnostic, context.CancellationToken), SymbolKind.NamedType); break; case AnalyzerRegisterActionKind.Operation: context.RegisterOperationAction(context => HandleCallback(context.Operation.Syntax.GetLocation(), context.Compilation, context.ReportDiagnostic, context.CancellationToken), OperationKind.VariableDeclaration); diff --git a/src/Compilers/Test/Core/Diagnostics/SuppressMessageAttributeTests.DiagnosticAnalyzers.cs b/src/Compilers/Test/Core/Diagnostics/SuppressMessageAttributeTests.DiagnosticAnalyzers.cs index a6aeac8d1af74..846efdc985c18 100644 --- a/src/Compilers/Test/Core/Diagnostics/SuppressMessageAttributeTests.DiagnosticAnalyzers.cs +++ b/src/Compilers/Test/Core/Diagnostics/SuppressMessageAttributeTests.DiagnosticAnalyzers.cs @@ -66,7 +66,7 @@ public override void Initialize(AnalysisContext analysisContext) { if (context.Symbol.Name.StartsWith(_errorSymbolPrefix, StringComparison.Ordinal)) { - context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.Symbol.GetFirstLocation(), messageArgs: context.Symbol.Name)); + context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.Symbol.Locations.First(), messageArgs: context.Symbol.Name)); } }, SymbolKind.Event, @@ -97,7 +97,7 @@ public override void Initialize(AnalysisContext analysisContext) analysisContext.RegisterSymbolAction( (context) => { - context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.Symbol.GetFirstLocation(), messageArgs: context.Symbol.Name)); + context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.Symbol.Locations.First(), messageArgs: context.Symbol.Name)); }, SymbolKind.NamedType); } @@ -151,7 +151,7 @@ public void Initialize(CodeBlockStartAnalysisContext analysis analysisContext.RegisterCodeBlockEndAction( (context) => { - context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.OwningSymbol.GetFirstLocation(), messageArgs: context.OwningSymbol.Name + ":end")); + context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.OwningSymbol.Locations.First(), messageArgs: context.OwningSymbol.Name + ":end")); }); analysisContext.RegisterSyntaxNodeAction( @@ -170,7 +170,7 @@ public void Initialize(CodeBlockStartAnalysisContext ana analysisContext.RegisterCodeBlockEndAction( (context) => { - context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.OwningSymbol.GetFirstLocation(), messageArgs: context.OwningSymbol.Name + ":end")); + context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(s_rule, context.OwningSymbol.Locations.First(), messageArgs: context.OwningSymbol.Name + ":end")); }); analysisContext.RegisterSyntaxNodeAction( From cf4d7847f9e21d14b5adec50f4605b44468f212f Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 14 Oct 2025 18:53:23 +0200 Subject: [PATCH 08/12] Use GetFirstLocation --- .../Analysis/FlowAnalysis/DataFlowPass.vb | 4 +- .../Portable/Binding/Binder_Conversions.vb | 2 +- .../Portable/Binding/Binder_Lambda.vb | 4 +- .../Portable/Binding/ExecutableCodeBinder.vb | 2 +- .../Compilation/ClsComplianceChecker.vb | 4 +- .../DocumentationCommentCompiler.Includes.vb | 2 +- .../Portable/Compilation/MethodCompiler.vb | 24 ++++---- .../Lowering/AsyncRewriter/AsyncRewriter.vb | 2 +- .../Portable/Semantics/Operators.vb | 24 ++++---- .../Portable/Symbols/AliasSymbol.vb | 2 +- .../AnonymousTypeManager_Templates.vb | 2 +- .../Symbols/Source/ImplicitNamedTypeSymbol.vb | 2 +- .../Symbols/Source/OverloadingHelper.vb | 8 +-- .../Symbols/Source/OverrideHidingHelper.vb | 40 ++++++------- .../Source/SourceComplexParameterSymbol.vb | 2 +- .../Source/SourceEnumConstantSymbol.vb | 2 +- .../Symbols/Source/SourceEventSymbol.vb | 8 +-- .../Symbols/Source/SourceFieldSymbol.vb | 4 +- .../Portable/Symbols/Source/SourceFile.vb | 2 +- .../Source/SourceMemberContainerTypeSymbol.vb | 56 +++++++++---------- .../Symbols/Source/SourceMemberFieldSymbol.vb | 2 +- .../Symbols/Source/SourceMethodSymbol.vb | 16 +++--- .../Symbols/Source/SourceNamedTypeSymbol.vb | 16 +++--- .../Source/SourceNamedTypeSymbol_ComClass.vb | 46 +++++++-------- .../Source/SourcePropertyAccessorSymbol.vb | 4 +- .../Symbols/Source/SourcePropertySymbol.vb | 12 ++-- .../Source/SynthesizedEventAccessorSymbol.vb | 4 +- .../SynthesizedEventBackingFieldSymbol.vb | 2 +- .../VisualBasic/Portable/Symbols/Symbol.vb | 2 +- .../SynthesizedEventDelegateSymbol.vb | 2 +- .../Test/CommandLine/CommandLineTests.vb | 6 +- 31 files changed, 154 insertions(+), 154 deletions(-) diff --git a/src/Compilers/VisualBasic/Portable/Analysis/FlowAnalysis/DataFlowPass.vb b/src/Compilers/VisualBasic/Portable/Analysis/FlowAnalysis/DataFlowPass.vb index 6438b888d7d88..bd6d5872427b5 100644 --- a/src/Compilers/VisualBasic/Portable/Analysis/FlowAnalysis/DataFlowPass.vb +++ b/src/Compilers/VisualBasic/Portable/Analysis/FlowAnalysis/DataFlowPass.vb @@ -197,10 +197,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic If Not local.IsFunctionValue AndAlso Not String.IsNullOrEmpty(local.Name) Then If _writtenVariables.Contains(local) Then If local.IsConst Then - Me.diagnostics.Add(ERRID.WRN_UnusedLocalConst, local.Locations(0), If(local.Name, "dummy")) + Me.diagnostics.Add(ERRID.WRN_UnusedLocalConst, local.GetFirstLocation(), If(local.Name, "dummy")) End If Else - Me.diagnostics.Add(ERRID.WRN_UnusedLocal, local.Locations(0), If(local.Name, "dummy")) + Me.diagnostics.Add(ERRID.WRN_UnusedLocal, local.GetFirstLocation(), If(local.Name, "dummy")) End If End If End Sub diff --git a/src/Compilers/VisualBasic/Portable/Binding/Binder_Conversions.vb b/src/Compilers/VisualBasic/Portable/Binding/Binder_Conversions.vb index ea0d099de5abd..a599ca2aab257 100644 --- a/src/Compilers/VisualBasic/Portable/Binding/Binder_Conversions.vb +++ b/src/Compilers/VisualBasic/Portable/Binding/Binder_Conversions.vb @@ -1569,7 +1569,7 @@ DoneWithDiagnostics: If delegateParam.IsByRef OrElse delegateParam.OriginalDefinition.Type.IsTypeParameter() Then Dim restrictedType As TypeSymbol = Nothing If delegateParam.Type.IsRestrictedTypeOrArrayType(restrictedType) Then - ReportDiagnostic(diagnostics, lambda.LambdaSymbol.Parameters(delegateParam.Ordinal).Locations(0), + ReportDiagnostic(diagnostics, lambda.LambdaSymbol.Parameters(delegateParam.Ordinal).GetFirstLocation(), ERRID.ERR_RestrictedType1, restrictedType) End If End If diff --git a/src/Compilers/VisualBasic/Portable/Binding/Binder_Lambda.vb b/src/Compilers/VisualBasic/Portable/Binding/Binder_Lambda.vb index b3bea34c78b38..065d8a10fe230 100644 --- a/src/Compilers/VisualBasic/Portable/Binding/Binder_Lambda.vb +++ b/src/Compilers/VisualBasic/Portable/Binding/Binder_Lambda.vb @@ -117,7 +117,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic unboundType, unboundParam.IsByRef, unboundParam.Syntax, - unboundParam.Locations(0)) + unboundParam.GetFirstLocation()) Next If parameters.Length <> targetSignature.ParameterTypes.Length Then @@ -142,7 +142,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic unboundType, unboundParam.IsByRef, unboundParam.Syntax, - unboundParam.Locations(0)) + unboundParam.GetFirstLocation()) Next End If diff --git a/src/Compilers/VisualBasic/Portable/Binding/ExecutableCodeBinder.vb b/src/Compilers/VisualBasic/Portable/Binding/ExecutableCodeBinder.vb index a7796f6555d9b..3b02ad22507f1 100644 --- a/src/Compilers/VisualBasic/Portable/Binding/ExecutableCodeBinder.vb +++ b/src/Compilers/VisualBasic/Portable/Binding/ExecutableCodeBinder.vb @@ -136,7 +136,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Dim bestLocation As Location = Nothing For Each symbol In labels Debug.Assert(symbol.Locations.Length = 1) - Dim sourceLocation As Location = symbol.Locations(0) + Dim sourceLocation As Location = symbol.GetFirstLocation() If bestSymbol Is Nothing OrElse Me.Compilation.CompareSourceLocations(bestLocation, sourceLocation) > 0 Then bestSymbol = symbol bestLocation = sourceLocation diff --git a/src/Compilers/VisualBasic/Portable/Compilation/ClsComplianceChecker.vb b/src/Compilers/VisualBasic/Portable/Compilation/ClsComplianceChecker.vb index e0906ae3d5b36..887027d106517 100644 --- a/src/Compilers/VisualBasic/Portable/Compilation/ClsComplianceChecker.vb +++ b/src/Compilers/VisualBasic/Portable/Compilation/ClsComplianceChecker.vb @@ -763,7 +763,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic If attributeData.IsTargetAttribute(AttributeDescription.CLSCompliantAttribute) Then Dim attributeClass = attributeData.AttributeClass If attributeClass IsNot Nothing Then - _diagnostics.ReportUseSite(attributeClass, If(symbol.Locations.IsEmpty, NoLocation.Singleton, symbol.Locations(0))) + _diagnostics.ReportUseSite(attributeClass, If(symbol.Locations.IsEmpty, NoLocation.Singleton, symbol.GetFirstLocation())) End If If Not attributeData.HasErrors Then @@ -831,7 +831,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic End Function Private Sub AddDiagnostic(symbol As Symbol, code As ERRID, ParamArray args As Object()) - Dim location = If(symbol.Locations.IsEmpty, NoLocation.Singleton, symbol.Locations(0)) + Dim location = If(symbol.Locations.IsEmpty, NoLocation.Singleton, symbol.GetFirstLocation()) Me.AddDiagnostic(symbol, code, location, args) End Sub diff --git a/src/Compilers/VisualBasic/Portable/Compilation/DocumentationComments/DocumentationCommentCompiler.Includes.vb b/src/Compilers/VisualBasic/Portable/Compilation/DocumentationComments/DocumentationCommentCompiler.Includes.vb index 70b2dc1ceab2d..3d7aec2cf622a 100644 --- a/src/Compilers/VisualBasic/Portable/Compilation/DocumentationComments/DocumentationCommentCompiler.Includes.vb +++ b/src/Compilers/VisualBasic/Portable/Compilation/DocumentationComments/DocumentationCommentCompiler.Includes.vb @@ -664,7 +664,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ' can be found by the name, just deterministically choose which one to use If symbolCommentId Is Nothing OrElse Me._compilation.CompareSourceLocations( - smallestSymbol.Locations(0), symbol.Locations(0)) > 0 Then + smallestSymbol.GetFirstLocation(), symbol.GetFirstLocation()) > 0 Then symbolCommentId = id smallestSymbol = symbol diff --git a/src/Compilers/VisualBasic/Portable/Compilation/MethodCompiler.vb b/src/Compilers/VisualBasic/Portable/Compilation/MethodCompiler.vb index 1b01238942a71..3afbf26704451 100644 --- a/src/Compilers/VisualBasic/Portable/Compilation/MethodCompiler.vb +++ b/src/Compilers/VisualBasic/Portable/Compilation/MethodCompiler.vb @@ -427,7 +427,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Dim sourceTypeBinder As Binder = If(method.MethodKind = MethodKind.Ordinary, Nothing, BinderBuilder.CreateBinderForType( DirectCast(method.ContainingModule, SourceModuleSymbol), - method.ContainingType.Locations(0).PossiblyEmbeddedOrMySourceTree(), + method.ContainingType.GetFirstLocation().PossiblyEmbeddedOrMySourceTree(), method.ContainingType)) ' Since embedded method bodies don't produce synthesized methods (see the assertion below) @@ -593,7 +593,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Debug.Assert(sourceTypeSymbol.Locations.Length > 0) sourceTypeBinder = BinderBuilder.CreateBinderForType( DirectCast(sourceTypeSymbol.ContainingModule, SourceModuleSymbol), - sourceTypeSymbol.Locations(0).PossiblyEmbeddedOrMySourceTree, + sourceTypeSymbol.GetFirstLocation().PossiblyEmbeddedOrMySourceTree, sourceTypeSymbol) processedStaticInitializers = New Binder.ProcessedFieldOrPropertyInitializers(Binder.BindFieldAndPropertyInitializers(sourceTypeSymbol, @@ -1165,7 +1165,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic diagnostics.Add( New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_SubNewCycle1, referencingMethod, New CompoundDiagnosticInfo(diagnosticInfos.ToArray())), - referencingMethod.Locations(0))) + referencingMethod.GetFirstLocation())) ' Rotate 'diagnosticInfos' for the next constructor If diagnosticInfos.Count > 1 Then @@ -1980,12 +1980,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ' Synthesized constructor diagnostics.Add(New VBDiagnostic( ErrorFactory.ErrorInfo(ERRID.ERR_NoUniqueConstructorOnBase2, containingType, containingType.BaseTypeNoUseSiteDiagnostics), - containingType.Locations(0))) + containingType.GetFirstLocation())) Else ' Regular constructor diagnostics.Add(New VBDiagnostic( ErrorFactory.ErrorInfo(ERRID.ERR_RequiredNewCallTooMany2, defaultConstructorType, containingType), - constructor.Locations(0))) + constructor.GetFirstLocation())) End If Return candidate @@ -2007,12 +2007,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ' Synthesized constructor diagnostics.Add(New VBDiagnostic( ErrorFactory.ErrorInfo(ERRID.ERR_NoConstructorOnBase2, containingType, containingType.BaseTypeNoUseSiteDiagnostics), - containingType.Locations(0))) + containingType.GetFirstLocation())) Else ' Regular constructor diagnostics.Add(New VBDiagnostic( ErrorFactory.ErrorInfo(ERRID.ERR_RequiredNewCall2, defaultConstructorType, containingType), - constructor.Locations(0))) + constructor.GetFirstLocation())) End If Else @@ -2021,7 +2021,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ' in *all* cases, so changing the error location to containingType's location diagnostics.Add(New VBDiagnostic( ErrorFactory.ErrorInfo(ERRID.ERR_NoAccessibleConstructorOnBase, containingType.BaseTypeNoUseSiteDiagnostics), - containingType.Locations(0))) + containingType.GetFirstLocation())) End If End If @@ -2041,13 +2041,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ' Synthesized constructor. If String.IsNullOrEmpty(data.Message) Then diagnostics.Add(If(data.IsError, ERRID.ERR_NoNonObsoleteConstructorOnBase3, ERRID.WRN_NoNonObsoleteConstructorOnBase3), - containingType.Locations(0), + containingType.GetFirstLocation(), containingType, candidate, containingType.BaseTypeNoUseSiteDiagnostics) Else diagnostics.Add(If(data.IsError, ERRID.ERR_NoNonObsoleteConstructorOnBase4, ERRID.WRN_NoNonObsoleteConstructorOnBase4), - containingType.Locations(0), + containingType.GetFirstLocation(), containingType, candidate, containingType.BaseTypeNoUseSiteDiagnostics, @@ -2057,13 +2057,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ' Regular constructor. If String.IsNullOrEmpty(data.Message) Then diagnostics.Add(If(data.IsError, ERRID.ERR_RequiredNonObsoleteNewCall3, ERRID.WRN_RequiredNonObsoleteNewCall3), - constructor.Locations(0), + constructor.GetFirstLocation(), candidate, containingType.BaseTypeNoUseSiteDiagnostics, containingType) Else diagnostics.Add(If(data.IsError, ERRID.ERR_RequiredNonObsoleteNewCall4, ERRID.WRN_RequiredNonObsoleteNewCall4), - constructor.Locations(0), + constructor.GetFirstLocation(), candidate, containingType.BaseTypeNoUseSiteDiagnostics, containingType, diff --git a/src/Compilers/VisualBasic/Portable/Lowering/AsyncRewriter/AsyncRewriter.vb b/src/Compilers/VisualBasic/Portable/Lowering/AsyncRewriter/AsyncRewriter.vb index 930068a8a9131..b6b207df967b1 100644 --- a/src/Compilers/VisualBasic/Portable/Lowering/AsyncRewriter/AsyncRewriter.vb +++ b/src/Compilers/VisualBasic/Portable/Lowering/AsyncRewriter/AsyncRewriter.vb @@ -109,7 +109,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Dim sourceMethod = TryCast(method, SourceMethodSymbol) If sourceMethod IsNot Nothing Then Return BinderBuilder.CreateBinderForMethodBody(DirectCast(sourceMethod.ContainingModule, SourceModuleSymbol), - sourceMethod.ContainingType.Locations(0).PossiblyEmbeddedOrMySourceTree(), + sourceMethod.ContainingType.GetFirstLocation().PossiblyEmbeddedOrMySourceTree(), sourceMethod) End If diff --git a/src/Compilers/VisualBasic/Portable/Semantics/Operators.vb b/src/Compilers/VisualBasic/Portable/Semantics/Operators.vb index c37d590d70d7d..3527965e54b44 100644 --- a/src/Compilers/VisualBasic/Portable/Semantics/Operators.vb +++ b/src/Compilers/VisualBasic/Portable/Semantics/Operators.vb @@ -333,14 +333,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Select Case opInfo.UnaryOperatorKind Case UnaryOperatorKind.IsTrue If diagnosticsOpt IsNot Nothing Then - diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_OperatorRequiresBoolReturnType1, SyntaxFacts.GetText(SyntaxKind.IsTrueKeyword)), method.Locations(0)) + diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_OperatorRequiresBoolReturnType1, SyntaxFacts.GetText(SyntaxKind.IsTrueKeyword)), method.GetFirstLocation()) result = False Else Return False End If Case UnaryOperatorKind.IsFalse If diagnosticsOpt IsNot Nothing Then - diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_OperatorRequiresBoolReturnType1, SyntaxFacts.GetText(SyntaxKind.IsFalseKeyword)), method.Locations(0)) + diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_OperatorRequiresBoolReturnType1, SyntaxFacts.GetText(SyntaxKind.IsFalseKeyword)), method.GetFirstLocation()) result = False Else Return False @@ -361,7 +361,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_OperatorRequiresIntegerParameter1, SyntaxFacts.GetText(If(opInfo.BinaryOperatorKind = BinaryOperatorKind.LeftShift, SyntaxKind.LessThanLessThanToken, - SyntaxKind.GreaterThanGreaterThanToken))), method.Locations(0)) + SyntaxKind.GreaterThanGreaterThanToken))), method.GetFirstLocation()) result = False Else Return False @@ -388,7 +388,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic If Not targetsContainingType Then If diagnosticsOpt IsNot Nothing Then - diagnosticsOpt.Add(ErrorFactory.ErrorInfo(targetMismatchError, method.ContainingSymbol), method.Locations(0)) + diagnosticsOpt.Add(ErrorFactory.ErrorInfo(targetMismatchError, method.ContainingSymbol), method.GetFirstLocation()) result = False Else Return False @@ -400,28 +400,28 @@ Namespace Microsoft.CodeAnalysis.VisualBasic If sourceType.IsObjectType() Then If diagnosticsOpt IsNot Nothing Then - diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ConversionFromObject), method.Locations(0)) + diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ConversionFromObject), method.GetFirstLocation()) result = False Else Return False End If ElseIf targetType.IsObjectType() Then If diagnosticsOpt IsNot Nothing Then - diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ConversionToObject), method.Locations(0)) + diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ConversionToObject), method.GetFirstLocation()) result = False Else Return False End If ElseIf sourceType.IsInterfaceType() Then If diagnosticsOpt IsNot Nothing Then - diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ConversionFromInterfaceType), method.Locations(0)) + diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ConversionFromInterfaceType), method.GetFirstLocation()) result = False Else Return False End If ElseIf targetType.IsInterfaceType() Then If diagnosticsOpt IsNot Nothing Then - diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ConversionToInterfaceType), method.Locations(0)) + diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ConversionToInterfaceType), method.GetFirstLocation()) result = False Else Return False @@ -430,7 +430,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic sourceType Is targetType, sourceType.GetNullableUnderlyingTypeOrSelf() Is targetType.GetNullableUnderlyingTypeOrSelf()) Then If diagnosticsOpt IsNot Nothing Then - diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ConversionToSameType), method.Locations(0)) + diagnosticsOpt.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ConversionToSameType), method.GetFirstLocation()) result = False Else Return False @@ -441,7 +441,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic If diagnosticsOpt IsNot Nothing Then diagnosticsOpt.Add(ErrorFactory.ErrorInfo(If(targetType Is method.ContainingSymbol, ERRID.ERR_ConversionFromBaseType, - ERRID.ERR_ConversionToDerivedType)), method.Locations(0)) + ERRID.ERR_ConversionToDerivedType)), method.GetFirstLocation()) result = False Else Return False @@ -450,7 +450,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic If diagnosticsOpt IsNot Nothing Then diagnosticsOpt.Add(ErrorFactory.ErrorInfo(If(targetType Is method.ContainingSymbol, ERRID.ERR_ConversionFromDerivedType, - ERRID.ERR_ConversionToBaseType)), method.Locations(0)) + ERRID.ERR_ConversionToBaseType)), method.GetFirstLocation()) result = False Else Return False @@ -460,7 +460,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic End If If result AndAlso diagnosticsOpt IsNot Nothing Then - diagnosticsOpt.Add(method.Locations(0), useSiteInfo) + diagnosticsOpt.Add(method.GetFirstLocation(), useSiteInfo) End If Return result diff --git a/src/Compilers/VisualBasic/Portable/Symbols/AliasSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/AliasSymbol.vb index f1d8efd4b929b..567c049fc21a2 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/AliasSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/AliasSymbol.vb @@ -250,7 +250,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ''' Returns a hash code for the current object. ''' Public Overrides Function GetHashCode() As Integer - Return If(Me.Locations.Length > 0, Me.Locations(0).GetHashCode(), Me.Name.GetHashCode()) + Return If(Me.Locations.Length > 0, Me.GetFirstLocation().GetHashCode(), Me.Name.GetHashCode()) End Function Friend Overrides Function Accept(Of TArg, TResult)(visitor As VisualBasicSymbolVisitor(Of TArg, TResult), a As TArg) As TResult diff --git a/src/Compilers/VisualBasic/Portable/Symbols/AnonymousTypes/AnonymousTypeManager_Templates.vb b/src/Compilers/VisualBasic/Portable/Symbols/AnonymousTypes/AnonymousTypeManager_Templates.vb index 615ced1480977..3d8db2a7edfa7 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/AnonymousTypes/AnonymousTypeManager_Templates.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/AnonymousTypes/AnonymousTypeManager_Templates.vb @@ -30,7 +30,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Private Sub CheckSourceLocationSeen(anonymous As AnonymousTypeOrDelegatePublicSymbol) #If DEBUG Then - Dim location As Location = anonymous.Locations(0) + Dim location As Location = anonymous.GetFirstLocation() If location.IsInSource Then If Me.AreTemplatesSealed Then Debug.Assert(Me._sourceLocationsSeen.ContainsKey(location)) diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/ImplicitNamedTypeSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/ImplicitNamedTypeSymbol.vb index 2000f2a6febbb..797014959f8af 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/ImplicitNamedTypeSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/ImplicitNamedTypeSymbol.vb @@ -54,7 +54,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' check that System.Object is available. ' Although submission semantically doesn't have a base class we need to emit one. Dim info = baseType.GetUseSiteInfo() - diagnostics.Add(info, Locations(0)) + diagnostics.Add(info, GetFirstLocation()) Return If(Me.TypeKind = TypeKind.Submission, Nothing, baseType) End Function diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/OverloadingHelper.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/OverloadingHelper.vb index 662d9cd187665..e41b2733a4f5a 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/OverloadingHelper.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/OverloadingHelper.vb @@ -113,9 +113,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols member.SetMetadataName(metadataName) ' Remember the metadata name of the lexically first override - If firstOverrideName Is Nothing OrElse compilation.CompareSourceLocations(member.Locations(0), locationOfFirstOverride) < 0 Then + If firstOverrideName Is Nothing OrElse compilation.CompareSourceLocations(member.GetFirstLocation(), locationOfFirstOverride) < 0 Then firstOverrideName = metadataName - locationOfFirstOverride = member.Locations(0) + locationOfFirstOverride = member.GetFirstLocation() End If End If End If @@ -131,7 +131,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Dim firstName As String = Nothing Dim locationOfFirstName As Location = Nothing For Each member In overloadedMembers - Dim memberLocation = member.Locations(0) + Dim memberLocation = member.GetFirstLocation() If firstName Is Nothing OrElse compilation.CompareSourceLocations(memberLocation, locationOfFirstName) < 0 Then firstName = member.Name locationOfFirstName = memberLocation @@ -153,7 +153,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' members. For the lookup we are doing, it doesn't matter which partial we use because Imports and Options can't ' affect a lookup that ignores extension methods. Dim binder = BinderBuilder.CreateBinderForType(DirectCast(container.ContainingModule, SourceModuleSymbol), - container.Locations(0).PossiblyEmbeddedOrMySourceTree(), + container.GetFirstLocation().PossiblyEmbeddedOrMySourceTree(), container) Dim result = LookupResult.GetInstance() diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/OverrideHidingHelper.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/OverrideHidingHelper.vb index 65b5d02fe85e3..37854e7a5cbbe 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/OverrideHidingHelper.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/OverrideHidingHelper.vb @@ -153,7 +153,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols OverrideHidingHelper(Of MethodSymbol).CheckOverrideMember(methodMember, methodMember.OverriddenMembers, diagnostics) ElseIf methodMember.IsNotOverridable Then 'Method is not marked as Overrides but is marked as Not Overridable - diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_NotOverridableRequiresOverrides), methodMember.Locations(0))) + diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_NotOverridableRequiresOverrides), methodMember.GetFirstLocation())) End If End If Case SymbolKind.Property @@ -161,7 +161,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If propMember.IsOverrides Then OverrideHidingHelper(Of PropertySymbol).CheckOverrideMember(propMember, propMember.OverriddenMembers, diagnostics) ElseIf propMember.IsNotOverridable Then - diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_NotOverridableRequiresOverrides), propMember.Locations(0))) + diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_NotOverridableRequiresOverrides), propMember.GetFirstLocation())) End If End Select @@ -184,7 +184,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If Not (container.IsMustInherit OrElse container.IsNotInheritable) Then For Each member In container.GetMembers() If member.IsMustOverride Then - diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_MustOverridesInClass1, container.Name), container.Locations(0))) + diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_MustOverridesInClass1, container.Name), container.GetFirstLocation())) Exit For End If Next @@ -250,7 +250,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols member, CustomSymbolDisplayFormatter.QualifiedName(member.ContainingType), CustomSymbolDisplayFormatter.ShortErrorName(container)), - container.Locations(0))) + container.GetFirstLocation())) Else diagnosticInfos.Add(ErrorFactory.ErrorInfo(ERRID.ERR_UnimplementedMustOverride, member.ContainingType, member)) End If @@ -264,7 +264,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_BaseOnlyClassesMustBeExplicit2, CustomSymbolDisplayFormatter.ShortErrorName(container), New CompoundDiagnosticInfo(diagnosticInfos.ToArrayAndFree())), - container.Locations(0))) + container.GetFirstLocation())) Else diagnosticInfos.Free() End If @@ -411,7 +411,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols AssociatedSymbolName(associatedhiddenSymbol), hiddenMember.ContainingType.GetKindText(), CustomSymbolDisplayFormatter.ShortErrorName(hiddenMember.ContainingType)), - hidingMember.Locations(0))) + hidingMember.GetFirstLocation())) End If Return @@ -421,14 +421,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols hidingMember.GetKindText(), hidingMember.Name, associatedhiddenSymbol.GetKindText(), AssociatedSymbolName(associatedhiddenSymbol), hiddenMember.ContainingType.GetKindText(), CustomSymbolDisplayFormatter.ShortErrorName(hiddenMember.ContainingType)), - hidingMember.Locations(0))) + hidingMember.GetFirstLocation())) ElseIf associatedhidingSymbol IsNot Nothing Then ' implicitly defined member hiding explicitly defined member diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.WRN_SynthMemberShadowsMember5, associatedhidingSymbol.GetKindText(), AssociatedSymbolName(associatedhidingSymbol), hidingMember.Name, hiddenMember.ContainingType.GetKindText(), CustomSymbolDisplayFormatter.ShortErrorName(hiddenMember.ContainingType)), - associatedhidingSymbol.Locations(0))) + associatedhidingSymbol.GetFirstLocation())) ElseIf hidingMember.Kind = hiddenMember.Kind AndAlso (hidingMember.Kind = SymbolKind.Property OrElse hidingMember.Kind = SymbolKind.Method) AndAlso Not (hiddenMember.IsWithEventsProperty OrElse hidingMember.IsWithEventsProperty) Then @@ -444,14 +444,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(id, hidingMember.GetKindText(), hidingMember.Name, hiddenMember.ContainingType.GetKindText(), CustomSymbolDisplayFormatter.ShortErrorName(hiddenMember.ContainingType)), - hidingMember.Locations(0))) + hidingMember.GetFirstLocation())) Else ' all other hiding scenarios. - Debug.Assert(hidingMember.Locations(0).IsInSource) + Debug.Assert(hidingMember.GetFirstLocation().IsInSource) diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.WRN_OverrideType5, hidingMember.GetKindText(), hidingMember.Name, hiddenMember.GetKindText(), hiddenMember.ContainingType.GetKindText(), CustomSymbolDisplayFormatter.ShortErrorName(hiddenMember.ContainingType)), - hidingMember.Locations(0))) + hidingMember.GetFirstLocation())) End If End Sub @@ -466,7 +466,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Private Shared Sub ReportShadowingMustOverrideError(hidingMember As Symbol, hiddenMember As Symbol, diagnostics As BindingDiagnosticBag) - Debug.Assert(hidingMember.Locations(0).IsInSource) + Debug.Assert(hidingMember.GetFirstLocation().IsInSource) If hidingMember.IsAccessor() Then ' accessor hiding non-accessorTODO @@ -476,11 +476,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols associatedHidingSymbol.GetKindText(), associatedHidingSymbol.Name, hiddenMember.ContainingType.GetKindText(), CustomSymbolDisplayFormatter.ShortErrorName(hiddenMember.ContainingType)), - hidingMember.Locations(0))) + hidingMember.GetFirstLocation())) Else ' Basic hiding case diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_CantShadowAMustOverride1, hidingMember), - hidingMember.Locations(0))) + hidingMember.GetFirstLocation())) End If End Sub @@ -850,7 +850,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ReportBadOverriding(ERRID.ERR_CannotOverrideInAccessibleMember, member, overriddenMembersResult.InaccessibleMembers(0), diagnostics) Else diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_OverrideNotNeeded3, member.GetKindText(), member.Name), - member.Locations(0))) + member.GetFirstLocation())) End If ElseIf overriddenMembers.Length > 1 Then ' Multiple members we could be overriding. Create a single error message that lists them all. @@ -864,7 +864,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols overriddenMembers(0), CustomSymbolDisplayFormatter.ShortErrorName(overriddenMembers(0).ContainingType), New CompoundDiagnosticInfo(diagnosticInfos.ToArrayAndFree())), - member.Locations(0))) + member.GetFirstLocation())) Else ' overriding exactly one member. Dim overriddenMember As TSymbol = overriddenMembers(0) @@ -906,14 +906,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' We can't do that, so issue an error. diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_InAccessibleOverridingMethod5, member, member.ContainingType, overriddenMember, overriddenMember.ContainingType, inaccessibleMember.ContainingType), - member.Locations(0))) + member.GetFirstLocation())) End If Next Dim useSiteInfo = overriddenMember.GetUseSiteInfo() - If Not diagnostics.Add(useSiteInfo, member.Locations(0)) AndAlso + If Not diagnostics.Add(useSiteInfo, member.GetFirstLocation()) AndAlso member.Kind = SymbolKind.Property Then ' No overriding errors found in member. If its a property, its accessors might have issues. @@ -991,7 +991,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols End If End If - diagnostics.Add(overriddenAccessor.GetUseSiteInfo(), overridingAccessor.Locations(0)) + diagnostics.Add(overriddenAccessor.GetUseSiteInfo(), overridingAccessor.GetFirstLocation()) End If End Sub @@ -1001,7 +1001,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols overriddenMember As Symbol, diagnostics As BindingDiagnosticBag) diagnostics.Add(New VBDiagnostic(New BadSymbolDiagnostic(overriddenMember, id, overridingMember, overriddenMember), - overridingMember.Locations(0))) + overridingMember.GetFirstLocation())) End Sub ' Are the declared accessibility of the two symbols consistent? If not, return the error code to use. diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceComplexParameterSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceComplexParameterSymbol.vb index 3f5fc06b97f53..8d67017c6e00a 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceComplexParameterSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceComplexParameterSymbol.vb @@ -317,7 +317,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' Asking for the default value earlier than that can lead to infinite recursion. Instead, pass in the m_lazyDefaultValue. If the value hasn't ' been computed yet, the new symbol will compute it. - Return New SourceComplexParameterSymbol(newContainingSymbol, Me.Name, Me.Ordinal, Me.Type, Me.Locations(0), _syntaxRef, _flags, _lazyDefaultValue) + Return New SourceComplexParameterSymbol(newContainingSymbol, Me.Name, Me.Ordinal, Me.Type, Me.GetFirstLocation(), _syntaxRef, _flags, _lazyDefaultValue) End Function ' Create a parameter from syntax. diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceEnumConstantSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceEnumConstantSymbol.vb index 861bbf1d4cd27..5d9eb0593bcfc 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceEnumConstantSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceEnumConstantSymbol.vb @@ -145,7 +145,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If Not otherValue.IsBad Then Dim overflowKind = EnumConstantHelper.OffsetValue(otherValue, _otherConstantOffset, value) If overflowKind = EnumOverflowKind.OverflowReport Then - diagnostics.Add(ERRID.ERR_ExpressionOverflow1, Locations(0), Me) + diagnostics.Add(ERRID.ERR_ExpressionOverflow1, GetFirstLocation(), Me) End If End If diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceEventSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceEventSymbol.vb index 3ac3dd0f2e21a..1a485172357dc 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceEventSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceEventSymbol.vb @@ -106,21 +106,21 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If _addMethod Is Nothing Then _addMethod = accessor Else - diagnostics.Add(ERRID.ERR_DuplicateAddHandlerDef, accessor.Locations(0)) + diagnostics.Add(ERRID.ERR_DuplicateAddHandlerDef, accessor.GetFirstLocation()) End If Case MethodKind.EventRemove If _removeMethod Is Nothing Then _removeMethod = accessor Else - diagnostics.Add(ERRID.ERR_DuplicateRemoveHandlerDef, accessor.Locations(0)) + diagnostics.Add(ERRID.ERR_DuplicateRemoveHandlerDef, accessor.GetFirstLocation()) End If Case MethodKind.EventRaise If _raiseMethod Is Nothing Then _raiseMethod = accessor Else - diagnostics.Add(ERRID.ERR_DuplicateRaiseEventDef, accessor.Locations(0)) + diagnostics.Add(ERRID.ERR_DuplicateRaiseEventDef, accessor.GetFirstLocation()) End If Case Else @@ -755,7 +755,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Dim sourceModule = DirectCast(Me.ContainingModule, SourceModuleSymbol) Dim diagnostics = BindingDiagnosticBag.GetInstance() type.CheckAllConstraints(DeclaringCompilation.LanguageVersion, - Locations(0), diagnostics, template:=New CompoundUseSiteInfo(Of AssemblySymbol)(diagnostics, sourceModule.ContainingAssembly)) + GetFirstLocation(), diagnostics, template:=New CompoundUseSiteInfo(Of AssemblySymbol)(diagnostics, sourceModule.ContainingAssembly)) sourceModule.AtomicSetFlagAndStoreDiagnostics(_lazyState, StateFlags.TypeConstraintsChecked, 0, diagnostics) diagnostics.Free() End If diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb index 32d6fcf60ca26..3599b8e175d10 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFieldSymbol.vb @@ -244,7 +244,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If startsCycle Then diagnostics.Clear() - diagnostics.Add(ERRID.ERR_CircularEvaluation1, Locations(0), CustomSymbolDisplayFormatter.ShortErrorName(Me)) + diagnostics.Add(ERRID.ERR_CircularEvaluation1, GetFirstLocation(), CustomSymbolDisplayFormatter.ShortErrorName(Me)) End If SetLazyConstantTuple(constantTuple, diagnostics) @@ -531,7 +531,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' We sort fields that belong to the same compilation by location to process cycles in deterministic order. ' Relative order between compilations is not important, cycles do not cross compilation boundaries. fieldsInvolvedInCycles.AddRange(graph.Keys.GroupBy(Function(f) f.DeclaringCompilation). - SelectMany(Function(g) g.OrderByDescending(Function(f1, f2) g.Key.CompareSourceLocations(f1.Locations(0), f2.Locations(0))))) + SelectMany(Function(g) g.OrderByDescending(Function(f1, f2) g.Key.CompareSourceLocations(f1.GetFirstLocation(), f2.GetFirstLocation())))) End If Do diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFile.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFile.vb index d811f22c45274..f4ecda7998c79 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFile.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceFile.vb @@ -340,7 +340,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If aliasImportsOpt IsNot Nothing Then For Each aliasImport In aliasImportsOpt.Values ValidateImportsClause(compilation, clauseDiagnostics, aliasImport.Alias.Target, - aliasImport.Dependencies, aliasImport.Alias.Locations(0), + aliasImport.Dependencies, aliasImport.Alias.GetFirstLocation(), aliasImport.ImportsClausePosition, diagnostics) Next End If diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMemberContainerTypeSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMemberContainerTypeSymbol.vb index 5f636c7163de5..039cc9ed494f3 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMemberContainerTypeSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMemberContainerTypeSymbol.vb @@ -392,7 +392,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If container IsNot Nothing Then Debug.Assert(container.IsInterfaceType() AndAlso container.HasVariance()) - diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_VarianceInterfaceNesting), Locations(0))) + diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_VarianceInterfaceNesting), GetFirstLocation())) End If End Sub @@ -981,7 +981,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If asClause IsNot Nothing Then location = asClause.Type.GetLocation() Else - location = method.Locations(0) + location = method.GetFirstLocation() End If ReportDiagnostics(diagnostics, location, infosBuffer) @@ -1018,7 +1018,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If syntax IsNot Nothing AndAlso syntax.AsClause IsNot Nothing Then location = syntax.AsClause.Type.GetLocation() Else - location = param.Locations(0) + location = param.GetFirstLocation() End If ReportDiagnostics(diagnostics, location, infosBuffer) @@ -1043,7 +1043,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols For Each constraint As TypeSymbol In param.ConstraintTypesNoUseSiteDiagnostics GenerateVarianceDiagnosticsForType(constraint, VarianceKind.In, VarianceContext.Constraint, infosBuffer) If HaveDiagnostics(infosBuffer) Then - Dim location As Location = param.Locations(0) + Dim location As Location = param.GetFirstLocation() For Each constraintInfo As TypeParameterConstraint In param.GetConstraints() If constraintInfo.TypeConstraint IsNot Nothing AndAlso @@ -1089,7 +1089,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If syntax IsNot Nothing AndAlso syntax.AsClause IsNot Nothing Then location = syntax.AsClause.Type.GetLocation() Else - location = [property].Locations(0) + location = [property].GetFirstLocation() End If ReportDiagnostics(diagnostics, location, infosBuffer) @@ -1125,7 +1125,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If syntax IsNot Nothing AndAlso syntax.AsClause IsNot Nothing Then location = syntax.AsClause.Type.GetLocation() Else - location = [event].Locations(0) + location = [event].GetFirstLocation() End If ReportDiagnostics(diagnostics, location, infosBuffer) @@ -1920,7 +1920,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Debug.Assert(implParameter.Locations.Length = 1) diagnostics.Add(ERRID.ERR_PartialMethodParamNamesMustMatch3, - implParameter.Locations(0), + implParameter.GetFirstLocation(), implParameter.Name, declParameter.Name, implMethod.Name) End If Next @@ -1941,7 +1941,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Debug.Assert(implParameter.Locations.Length = 1) diagnostics.Add(ERRID.ERR_PartialMethodTypeParamNameMismatch3, - implParameter.Locations(0), + implParameter.GetFirstLocation(), implParameter.Name, declParameter.Name, implMethod.Name) End If @@ -2165,7 +2165,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Dim symbolToReportErrorOn As Symbol = If(firstField.AssociatedSymbol, DirectCast(firstField, Symbol)) Debug.Assert(symbolToReportErrorOn.Locations.Length > 0) diagnostics.Add(ERRID.ERR_RecordCycle2, - symbolToReportErrorOn.Locations(0), + symbolToReportErrorOn.GetFirstLocation(), firstField.ContainingType.Name, New CompoundDiagnosticInfo(diagnosticInfos.ToArrayAndFree())) @@ -2250,10 +2250,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols End If ' We use simple comparison based on source location - Dim typeToTestLocation = typeToTest.Locations(0) + Dim typeToTestLocation = typeToTest.GetFirstLocation() Debug.Assert(Me.Locations.Length > 0) - Dim structBeingAnalyzedLocation = Me.Locations(0) + Dim structBeingAnalyzedLocation = Me.GetFirstLocation() Dim compilation = Me.DeclaringCompilation Dim fileCompResult = compilation.CompareSourceLocations(typeToTestLocation, structBeingAnalyzedLocation) @@ -2285,11 +2285,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols defaultPropertyName = name If Not defaultProperty.ShadowsExplicitly Then - CheckDefaultPropertyAgainstAllBases(Me, defaultPropertyName, propertySymbol.Locations(0), diagBag) + CheckDefaultPropertyAgainstAllBases(Me, defaultPropertyName, propertySymbol.GetFirstLocation(), diagBag) End If Else ' "'Default' can be applied to only one property name in a {0}." - diagBag.Add(ERRID.ERR_DuplicateDefaultProps1, propertySymbol.Locations(0), GetKindText()) + diagBag.Add(ERRID.ERR_DuplicateDefaultProps1, propertySymbol.GetFirstLocation(), GetKindText()) End If Exit For End If @@ -2306,7 +2306,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If Not propertySymbol.IsDefault Then ' "'{0}' and '{1}' cannot overload each other because only one is declared 'Default'." - diagBag.Add(ERRID.ERR_DefaultMissingFromProperty2, propertySymbol.Locations(0), defaultProperty, propertySymbol) + diagBag.Add(ERRID.ERR_DefaultMissingFromProperty2, propertySymbol.GetFirstLocation(), defaultProperty, propertySymbol) End If End If Next @@ -2446,12 +2446,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If explicitlyShadows Then If Not shadowsExplicitly Then Debug.Assert(symbol.Locations.Length > 0) - diagBag.Add(ERRID.ERR_MustShadow2, symbol.Locations(0), symbol.GetKindText(), symbol.Name) + diagBag.Add(ERRID.ERR_MustShadow2, symbol.GetFirstLocation(), symbol.GetKindText(), symbol.Name) End If ElseIf explicitlyOverloads Then If Not overridesExplicitly AndAlso Not overloadsExplicitly Then Debug.Assert(symbol.Locations.Length > 0) - diagBag.Add(ERRID.ERR_MustBeOverloads2, symbol.Locations(0), symbol.GetKindText(), symbol.Name) + diagBag.Add(ERRID.ERR_MustBeOverloads2, symbol.GetFirstLocation(), symbol.GetKindText(), symbol.Name) End If End If End If @@ -2950,14 +2950,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' "{0} '{1}' implicitly defines a member '{2}' which has the same name as a type parameter." Binder.ReportDiagnostic(diagBag, - symImplicitlyDefinedBy.Locations(0), + symImplicitlyDefinedBy.GetFirstLocation(), ERRID.ERR_SyntMemberShadowsGenericParam3, symImplicitlyDefinedBy.GetKindText(), symImplicitlyDefinedBy.Name, sym.Name) Else ' "'{0}' has the same name as a type parameter." - Binder.ReportDiagnostic(diagBag, sym.Locations(0), ERRID.ERR_ShadowingGenericParamWithMember1, sym.Name) + Binder.ReportDiagnostic(diagBag, sym.GetFirstLocation(), ERRID.ERR_ShadowingGenericParamWithMember1, sym.Name) End If End If Next @@ -3051,7 +3051,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' "{0} '{1}' implicitly defines '{2}', which conflicts with a member of the same name in {3} '{4}'." Binder.ReportDiagnostic( diagBag, - firstAssociatedSymbol.Locations(0), + firstAssociatedSymbol.GetFirstLocation(), ERRID.ERR_SynthMemberClashesWithMember5, firstAssociatedSymbol.GetKindText(), OverrideHidingHelper.AssociatedSymbolName(firstAssociatedSymbol), @@ -3071,7 +3071,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols '{0} '{1}' implicitly defines '{2}', which conflicts with a member implicitly declared for {3} '{4}' in {5} '{6}'. Binder.ReportDiagnostic( diagBag, - firstAssociatedSymbol.Locations(0), + firstAssociatedSymbol.GetFirstLocation(), ERRID.ERR_SynthMemberClashesWithSynth7, firstAssociatedSymbol.GetKindText(), OverrideHidingHelper.AssociatedSymbolName(firstAssociatedSymbol), @@ -3087,7 +3087,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' "{0} '{1}' conflicts with a member implicitly declared for {2} '{3}' in {4} '{5}'." Binder.ReportDiagnostic( diagBag, - secondSymbol.Locations(0), + secondSymbol.GetFirstLocation(), ERRID.ERR_MemberClashesWithSynth6, secondSymbol.GetKindText(), secondSymbol.Name, @@ -3107,7 +3107,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' "'{0}' is already declared in this {1}." Binder.ReportDiagnostic( diagBag, - firstSymbol.Locations(0), + firstSymbol.GetFirstLocation(), ERRID.ERR_MultiplyDefinedEnumMember2, firstSymbol.Name, Me.GetKindText()) @@ -3119,7 +3119,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' "'{0}' is already declared as '{1}' in this {2}." Binder.ReportDiagnostic( diagBag, - firstSymbol.Locations(0), + firstSymbol.GetFirstLocation(), ERRID.ERR_MultiplyDefinedType3, firstSymbol.Name, If(includeKind, @@ -3422,11 +3422,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols diagnostics.Add(New VBDiagnostic(diag, GetImplementsLocation(iface))) ElseIf implementingSet.Count = 1 Then ' Otherwise, a duplicate implementation error is reported above - diagnostics.Add(useSiteInfo, implementingSet.Single.Locations(0)) + diagnostics.Add(useSiteInfo, implementingSet.Single.GetFirstLocation()) End If ElseIf implementingSet.Count = 1 Then - diagnostics.Add(useSiteInfo, implementingSet.Single.Locations(0)) + diagnostics.Add(useSiteInfo, implementingSet.Single.GetFirstLocation()) End If End If Next @@ -3578,7 +3578,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' only report diagnostics if the signature is considered equal following VB rules. If (comparisonResults And Not SymbolComparisonResults.MismatchesForConflictingMethods) = 0 Then - ReportOverloadsErrors(comparisonResults, member, nextMember, member.Locations(0), diagnostics) + ReportOverloadsErrors(comparisonResults, member, nextMember, member.GetFirstLocation(), diagnostics) Exit For End If End If @@ -3717,7 +3717,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_MatchingOperatorExpected2, SyntaxFacts.GetText(OverloadResolution.GetOperatorTokenKind(nameOfThePair)), - method), method.Locations(0)) + method), method.GetFirstLocation()) End If Return True @@ -3759,7 +3759,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' only report diagnostics if the signature is considered equal following VB rules. If (comparisonResults And significantDiff) = 0 Then - ReportOverloadsErrors(comparisonResults, method, nextMethod, method.Locations(0), diagnostics) + ReportOverloadsErrors(comparisonResults, method, nextMethod, method.GetFirstLocation(), diagnostics) Return True End If Next diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMemberFieldSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMemberFieldSymbol.vb index 8b9df817adda8..59e19a98b7865 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMemberFieldSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMemberFieldSymbol.vb @@ -37,7 +37,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Dim sourceModule = DirectCast(Me.ContainingModule, SourceModuleSymbol) Dim diagnostics = BindingDiagnosticBag.GetInstance() Type.CheckAllConstraints(DeclaringCompilation.LanguageVersion, - Locations(0), diagnostics, template:=New CompoundUseSiteInfo(Of AssemblySymbol)(diagnostics, sourceModule.ContainingAssembly)) + GetFirstLocation(), diagnostics, template:=New CompoundUseSiteInfo(Of AssemblySymbol)(diagnostics, sourceModule.ContainingAssembly)) sourceModule.AtomicSetFlagAndStoreDiagnostics(_lazyState, StateFlags.TypeConstraintsChecked, 0, diagnostics) diagnostics.Free() End If diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb index 7e379aeeae786..2919fdf069a64 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMethodSymbol.vb @@ -1628,7 +1628,7 @@ lReportErrorOnTwoTokens: diagnostics.Add(ERRID.ERR_ExtensionMethodNotInModule, arguments.AttributeSyntaxOpt.GetLocation()) ElseIf Me.ParameterCount = 0 Then - diagnostics.Add(ERRID.ERR_ExtensionMethodNoParams, Me.Locations(0)) + diagnostics.Add(ERRID.ERR_ExtensionMethodNoParams, Me.GetFirstLocation()) Else Debug.Assert(Me.IsShared) @@ -1636,13 +1636,13 @@ lReportErrorOnTwoTokens: Dim firstParam As ParameterSymbol = Me.Parameters(0) If firstParam.IsOptional Then - diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ExtensionMethodOptionalFirstArg), firstParam.Locations(0)) + diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ExtensionMethodOptionalFirstArg), firstParam.GetFirstLocation()) ElseIf firstParam.IsParamArray Then - diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ExtensionMethodParamArrayFirstArg), firstParam.Locations(0)) + diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ExtensionMethodParamArrayFirstArg), firstParam.GetFirstLocation()) ElseIf Not Me.ValidateGenericConstraintsOnExtensionMethodDefinition() Then - diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ExtensionMethodUncallable1, Me.Name), Me.Locations(0)) + diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ExtensionMethodUncallable1, Me.Name), Me.GetFirstLocation()) End If End If @@ -1652,7 +1652,7 @@ lReportErrorOnTwoTokens: ' Check for optional parameters For Each parameter In Me.Parameters If parameter.IsOptional Then - diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_InvalidOptionalParameterUsage1, "WebMethod"), Me.Locations(0)) + diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_InvalidOptionalParameterUsage1, "WebMethod"), Me.GetFirstLocation()) End If Next @@ -1744,7 +1744,7 @@ lReportErrorOnTwoTokens: ElseIf attrData.IsTargetAttribute(AttributeDescription.ConditionalAttribute) Then If Not Me.IsSub Then ' BC41007: Attribute 'Conditional' is only valid on 'Sub' declarations. - diagnostics.Add(ERRID.WRN_ConditionalNotValidOnFunction, Me.Locations(0)) + diagnostics.Add(ERRID.WRN_ConditionalNotValidOnFunction, Me.GetFirstLocation()) End If ElseIf VerifyObsoleteAttributeAppliedToMethod(arguments, AttributeDescription.ObsoleteAttribute) Then ElseIf VerifyObsoleteAttributeAppliedToMethod(arguments, AttributeDescription.DeprecatedAttribute) Then @@ -1785,7 +1785,7 @@ lReportErrorOnTwoTokens: If arguments.Attribute.IsTargetAttribute(description) Then ' Obsolete Attribute is not allowed on event accessors. If Me.IsAccessor() AndAlso Me.AssociatedSymbol.Kind = SymbolKind.Event Then - DirectCast(arguments.Diagnostics, BindingDiagnosticBag).Add(ERRID.ERR_ObsoleteInvalidOnEventMember, Me.Locations(0), description.FullName) + DirectCast(arguments.Diagnostics, BindingDiagnosticBag).Add(ERRID.ERR_ObsoleteInvalidOnEventMember, Me.GetFirstLocation(), description.FullName) End If Return True @@ -2192,7 +2192,7 @@ lReportErrorOnTwoTokens: ' match Dev10 and report errors on the parameter type syntax instead. param.Type.CheckAllConstraints( DeclaringCompilation.LanguageVersion, - param.Locations(0), diagBag, template:=New CompoundUseSiteInfo(Of AssemblySymbol)(diagBag, sourceModule.ContainingAssembly)) + param.GetFirstLocation(), diagBag, template:=New CompoundUseSiteInfo(Of AssemblySymbol)(diagBag, sourceModule.ContainingAssembly)) End If Next diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceNamedTypeSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceNamedTypeSymbol.vb index 44be9f063a22b..179053a9e51e8 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceNamedTypeSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceNamedTypeSymbol.vb @@ -963,10 +963,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols typeParameterSet.Add(s.Name) If ShadowsTypeParameter(s) Then - Binder.ReportDiagnostic(diagBag, s.Locations(0), ERRID.WRN_ShadowingGenericParamWithParam1, s.Name) + Binder.ReportDiagnostic(diagBag, s.GetFirstLocation(), ERRID.WRN_ShadowingGenericParamWithParam1, s.Name) End If Else - Binder.ReportDiagnostic(diagBag, s.Locations(0), ERRID.ERR_DuplicateTypeParamName1, s.Name) + Binder.ReportDiagnostic(diagBag, s.GetFirstLocation(), ERRID.ERR_DuplicateTypeParamName1, s.Name) End If Next End If @@ -1447,7 +1447,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' script, submission and implicit classes have no identifier location: location = If(syntax.Kind = SyntaxKind.CompilationUnit OrElse syntax.Kind = SyntaxKind.NamespaceBlock, - Locations(0), + GetFirstLocation(), GetTypeIdentifierToken(syntax).GetLocation()) End If @@ -2236,12 +2236,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Select Case Me.TypeKind Case TypeKind.Class If attrData.IsTargetAttribute(AttributeDescription.CaseInsensitiveExtensionAttribute) Then - diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ExtensionOnlyAllowedOnModuleSubOrFunction), Me.Locations(0)) + diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_ExtensionOnlyAllowedOnModuleSubOrFunction), Me.GetFirstLocation()) decoded = True ElseIf attrData.IsTargetAttribute(AttributeDescription.VisualBasicComClassAttribute) Then If Me.IsGenericType Then - diagnostics.Add(ERRID.ERR_ComClassOnGeneric, Me.Locations(0)) + diagnostics.Add(ERRID.ERR_ComClassOnGeneric, Me.GetFirstLocation()) Else Interlocked.CompareExchange(_comClassData, New ComClassData(attrData), Nothing) End If @@ -2289,7 +2289,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ElseIf attrData.IsTargetAttribute(AttributeDescription.VisualBasicComClassAttribute) Then ' Can't apply ComClassAttribute to a Module - diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_InvalidAttributeUsage2, AttributeDescription.VisualBasicComClassAttribute.Name, Me.Name), Me.Locations(0)) + diagnostics.Add(ErrorFactory.ErrorInfo(ERRID.ERR_InvalidAttributeUsage2, AttributeDescription.VisualBasicComClassAttribute.Name, Me.Name), Me.GetFirstLocation()) decoded = True End If End Select @@ -2303,7 +2303,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Dim defaultProperty = DefaultPropertyName If Not String.IsNullOrEmpty(defaultProperty) AndAlso Not IdentifierComparison.Equals(defaultProperty, attributeValue) Then - diagnostics.Add(ERRID.ERR_ConflictDefaultPropertyAttribute, Locations(0), Me) + diagnostics.Add(ERRID.ERR_ConflictDefaultPropertyAttribute, GetFirstLocation(), Me) End If ElseIf attrData.IsTargetAttribute(AttributeDescription.SerializableAttribute) Then @@ -2454,7 +2454,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Binder.ReportUseSiteInfoForSynthesizedAttribute(WellKnownMember.Microsoft_VisualBasic_CompilerServices_StandardModuleAttribute__ctor, Me.DeclaringCompilation, - Locations(0), + GetFirstLocation(), diagnostics) End If End Sub diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceNamedTypeSymbol_ComClass.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceNamedTypeSymbol_ComClass.vb index c3343d68e89e9..61664aa6d4007 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceNamedTypeSymbol_ComClass.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceNamedTypeSymbol_ComClass.vb @@ -138,39 +138,39 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' Can't specify the same value for iid and eventsid ' It is not an error to reuse the classid guid though. If InterfaceId IsNot Nothing AndAlso EventId IsNot Nothing AndAlso interfaceGuid = eventGuid Then - Binder.ReportDiagnostic(diagnostics, comClass.Locations(0), ERRID.ERR_ComClassDuplicateGuids1, comClass.Name) + Binder.ReportDiagnostic(diagnostics, comClass.GetFirstLocation(), ERRID.ERR_ComClassDuplicateGuids1, comClass.Name) End If End If ' Can't specify ComClass and Guid If comClass.HasGuidAttribute() Then - Binder.ReportDiagnostic(diagnostics, comClass.Locations(0), ERRID.ERR_ComClassAndReservedAttribute1, AttributeDescription.GuidAttribute.Name) + Binder.ReportDiagnostic(diagnostics, comClass.GetFirstLocation(), ERRID.ERR_ComClassAndReservedAttribute1, AttributeDescription.GuidAttribute.Name) End If ' Can't specify ComClass and ClassInterface If comClass.HasClassInterfaceAttribute() Then - Binder.ReportDiagnostic(diagnostics, comClass.Locations(0), ERRID.ERR_ComClassAndReservedAttribute1, AttributeDescription.ClassInterfaceAttribute.Name) + Binder.ReportDiagnostic(diagnostics, comClass.GetFirstLocation(), ERRID.ERR_ComClassAndReservedAttribute1, AttributeDescription.ClassInterfaceAttribute.Name) End If ' Can't specify ComClass and ComSourceInterfaces If comClass.HasComSourceInterfacesAttribute() Then - Binder.ReportDiagnostic(diagnostics, comClass.Locations(0), ERRID.ERR_ComClassAndReservedAttribute1, AttributeDescription.ComSourceInterfacesAttribute.Name) + Binder.ReportDiagnostic(diagnostics, comClass.GetFirstLocation(), ERRID.ERR_ComClassAndReservedAttribute1, AttributeDescription.ComSourceInterfacesAttribute.Name) End If ' Can't specify ComClass and ComVisible(False) If Not GetComVisibleState(comClass) Then - Binder.ReportDiagnostic(diagnostics, comClass.Locations(0), ERRID.ERR_ComClassAndReservedAttribute1, AttributeDescription.ComVisibleAttribute.Name & "(False)") + Binder.ReportDiagnostic(diagnostics, comClass.GetFirstLocation(), ERRID.ERR_ComClassAndReservedAttribute1, AttributeDescription.ComVisibleAttribute.Name & "(False)") End If 'Class must be Public If comClass.DeclaredAccessibility <> Accessibility.Public Then - Binder.ReportDiagnostic(diagnostics, comClass.Locations(0), ERRID.ERR_ComClassRequiresPublicClass1, comClass.Name) + Binder.ReportDiagnostic(diagnostics, comClass.GetFirstLocation(), ERRID.ERR_ComClassRequiresPublicClass1, comClass.Name) Else Dim container As NamedTypeSymbol = comClass.ContainingType While container IsNot Nothing If container.DeclaredAccessibility <> Accessibility.Public Then - Binder.ReportDiagnostic(diagnostics, comClass.Locations(0), ERRID.ERR_ComClassRequiresPublicClass2, + Binder.ReportDiagnostic(diagnostics, comClass.GetFirstLocation(), ERRID.ERR_ComClassRequiresPublicClass2, comClass.Name, container.Name) Exit While End If @@ -181,7 +181,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' Class cannot be Abstract If comClass.IsMustInherit Then - Binder.ReportDiagnostic(diagnostics, comClass.Locations(0), ERRID.ERR_ComClassCantBeAbstract0) + Binder.ReportDiagnostic(diagnostics, comClass.GetFirstLocation(), ERRID.ERR_ComClassCantBeAbstract0) End If ' Check for nest type name collisions on this class and @@ -192,7 +192,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols GetComClassMembers(comClass, interfaceMembers, eventMembers, haveDefaultProperty, diagnostics) If interfaceMembers.Count = 0 AndAlso eventMembers.Count = 0 Then - Binder.ReportDiagnostic(diagnostics, comClass.Locations(0), ERRID.WRN_ComClassNoMembers1, comClass.Name) + Binder.ReportDiagnostic(diagnostics, comClass.GetFirstLocation(), ERRID.WRN_ComClassNoMembers1, comClass.Name) ElseIf Not diagnostics.HasAnyErrors() Then Dim comClassInterface As NamedTypeSymbol = New SynthesizedComInterface(comClass, interfaceMembers) @@ -211,26 +211,26 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols (EventId IsNot Nothing AndAlso interfaces.Length > 1) Then Binder.ReportUseSiteInfoForSynthesizedAttribute(WellKnownMember.System_Runtime_InteropServices_GuidAttribute__ctor, comClass.DeclaringCompilation, - comClass.Locations(0), + comClass.GetFirstLocation(), diagnostics) End If ' Should be able to emit ClassInterfaceAttribute. Binder.ReportUseSiteInfoForSynthesizedAttribute(WellKnownMember.System_Runtime_InteropServices_ClassInterfaceAttribute__ctorClassInterfaceType, comClass.DeclaringCompilation, - comClass.Locations(0), + comClass.GetFirstLocation(), diagnostics) ' Should be able to emit ComSourceInterfacesAttribute and InterfaceTypeAttribute if there is an event interface. If interfaces.Length > 1 Then Binder.ReportUseSiteInfoForSynthesizedAttribute(WellKnownMember.System_Runtime_InteropServices_ComSourceInterfacesAttribute__ctorString, comClass.DeclaringCompilation, - comClass.Locations(0), + comClass.GetFirstLocation(), diagnostics) Binder.ReportUseSiteInfoForSynthesizedAttribute(WellKnownMember.System_Runtime_InteropServices_InterfaceTypeAttribute__ctorInt16, comClass.DeclaringCompilation, - comClass.Locations(0), + comClass.GetFirstLocation(), diagnostics) End If @@ -238,7 +238,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If interfaces.Length > 0 Then Binder.ReportUseSiteInfoForSynthesizedAttribute(WellKnownMember.System_Runtime_InteropServices_ComVisibleAttribute__ctor, comClass.DeclaringCompilation, - comClass.Locations(0), + comClass.GetFirstLocation(), diagnostics) End If @@ -265,7 +265,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' Should be able to emit DispIdAttribute on members. Binder.ReportUseSiteInfoForSynthesizedAttribute(WellKnownMember.System_Runtime_InteropServices_DispIdAttribute__ctor, comClass.DeclaringCompilation, - comClass.Locations(0), + comClass.GetFirstLocation(), diagnostics) End If @@ -273,7 +273,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' Should be able to emit DefaultMemberAttribute. Binder.ReportUseSiteInfoForSynthesizedAttribute(WellKnownMember.System_Reflection_DefaultMemberAttribute__ctor, comClass.DeclaringCompilation, - comClass.Locations(0), + comClass.GetFirstLocation(), diagnostics) End If @@ -287,7 +287,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Private Shared Function ValidateComClassGuid(comClass As SourceNamedTypeSymbol, id As String, diagnostics As BindingDiagnosticBag, Optional ByRef guidVal As Guid = Nothing) As Boolean If id IsNot Nothing Then If Not Guid.TryParseExact(id, "D", guidVal) Then '32 digits separated by hyphens: 00000000-0000-0000-0000-000000000000 - Binder.ReportDiagnostic(diagnostics, comClass.Locations(0), ERRID.ERR_BadAttributeUuid2, AttributeDescription.VisualBasicComClassAttribute.Name, id) + Binder.ReportDiagnostic(diagnostics, comClass.GetFirstLocation(), ERRID.ERR_BadAttributeUuid2, AttributeDescription.VisualBasicComClassAttribute.Name, id) Return False End If Else @@ -329,7 +329,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols For Each member As Symbol In comClass.GetMembers(interfaceName) ' Error--name collision on this class - Binder.ReportDiagnostic(diagnostics, member.Locations(0), ERRID.ERR_MemberConflictWithSynth4, + Binder.ReportDiagnostic(diagnostics, member.GetFirstLocation(), ERRID.ERR_MemberConflictWithSynth4, SyntaxFacts.GetText(SyntaxKind.InterfaceKeyword) & " " & interfaceName, AttributeDescription.VisualBasicComClassAttribute.Name, SyntaxFacts.GetText(SyntaxKind.ClassKeyword), @@ -343,7 +343,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If member.DeclaredAccessibility <> Accessibility.Private Then ' Warning--name shadows a base class member - Binder.ReportDiagnostic(diagnostics, comClass.Locations(0), ERRID.WRN_ComClassInterfaceShadows5, + Binder.ReportDiagnostic(diagnostics, comClass.GetFirstLocation(), ERRID.WRN_ComClassInterfaceShadows5, comClass.Name, SyntaxFacts.GetText(SyntaxKind.InterfaceKeyword), interfaceName, @@ -426,7 +426,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' Warn for Property X As Object : Set(ByVal o As Object) If prop.Type.IsObjectType() AndAlso prop.SetMethod IsNot Nothing Then - Binder.ReportDiagnostic(diagnostics, prop.Locations(0), ERRID.WRN_ComClassPropertySetObject1, prop) + Binder.ReportDiagnostic(diagnostics, prop.GetFirstLocation(), ERRID.WRN_ComClassPropertySetObject1, prop) End If interfaceMembers.Add(New KeyValuePair(Of Symbol, Integer)(prop, GetUserSpecifiedDispId(prop, diagnostics))) @@ -452,7 +452,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Case SymbolKind.Method If DirectCast(member, MethodSymbol).IsGenericMethod Then ' Generic methods cannot be exposed to COM - Binder.ReportDiagnostic(diagnostics, member.Locations(0), ERRID.ERR_ComClassGenericMethod) + Binder.ReportDiagnostic(diagnostics, member.GetFirstLocation(), ERRID.ERR_ComClassGenericMethod) End If interfaceMembers.Add(New KeyValuePair(Of Symbol, Integer)(member, GetUserSpecifiedDispId(member, diagnostics))) @@ -493,13 +493,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' for the Default property. If dispId = 0 Then If target.Kind <> SymbolKind.Property OrElse Not DirectCast(target, PropertySymbol).IsDefault Then - Binder.ReportDiagnostic(diagnostics, target.Locations(0), ERRID.ERR_ComClassReservedDispIdZero1, target.Name) + Binder.ReportDiagnostic(diagnostics, target.GetFirstLocation(), ERRID.ERR_ComClassReservedDispIdZero1, target.Name) End If ' Validate that the user has not used negative DispId's which ' are reserved by COM and the runtime. ElseIf dispId < 0 Then - Binder.ReportDiagnostic(diagnostics, target.Locations(0), ERRID.ERR_ComClassReservedDispId1, target.Name) + Binder.ReportDiagnostic(diagnostics, target.GetFirstLocation(), ERRID.ERR_ComClassReservedDispId1, target.Name) End If Return dispId diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourcePropertyAccessorSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourcePropertyAccessorSymbol.vb index 411a8df8d7eed..83b5833d70f15 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourcePropertyAccessorSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourcePropertyAccessorSymbol.vb @@ -265,7 +265,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ' match Dev10 and report errors on the parameter type syntax instead. param.Type.CheckAllConstraints( DeclaringCompilation.LanguageVersion, - param.Locations(0), diagBag, template:=New CompoundUseSiteInfo(Of AssemblySymbol)(diagBag, sourceModule.ContainingAssembly)) + param.GetFirstLocation(), diagBag, template:=New CompoundUseSiteInfo(Of AssemblySymbol)(diagBag, sourceModule.ContainingAssembly)) End If Next @@ -434,7 +434,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If Not propertyType.IsSameTypeIgnoringAll(valueParameterType) Then If (Not propertyType.IsErrorType()) AndAlso (Not valueParameterType.IsErrorType()) Then - diagnostics.Add(ERRID.ERR_SetValueNotPropertyType, valueParameter.Locations(0)) + diagnostics.Add(ERRID.ERR_SetValueNotPropertyType, valueParameter.GetFirstLocation()) End If Else diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourcePropertySymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourcePropertySymbol.vb index a955889e71e65..388b8de2618c7 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourcePropertySymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourcePropertySymbol.vb @@ -119,14 +119,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If getMethod Is Nothing Then getMethod = accessorMethod Else - diagnostics.Add(ERRID.ERR_DuplicatePropertyGet, accessorMethod.Locations(0)) + diagnostics.Add(ERRID.ERR_DuplicatePropertyGet, accessorMethod.GetFirstLocation()) End If ElseIf accessorKind = SyntaxKind.SetAccessorStatement Then Dim accessorMethod = CreateAccessor(prop, SourceMemberFlags.MethodKindPropertySet, accessorFlags, bodyBinder, accessor, diagnostics) If setMethod Is Nothing Then setMethod = accessorMethod Else - diagnostics.Add(ERRID.ERR_DuplicatePropertySet, accessorMethod.Locations(0)) + diagnostics.Add(ERRID.ERR_DuplicatePropertySet, accessorMethod.GetFirstLocation()) End If End If Next @@ -145,7 +145,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols diagnostics.Add(ERRID.ERR_ReadOnlyHasNoGet, location) End If If setMethod IsNot Nothing Then - diagnostics.Add(ERRID.ERR_ReadOnlyHasSet, setMethod.Locations(0)) + diagnostics.Add(ERRID.ERR_ReadOnlyHasSet, setMethod.GetFirstLocation()) End If End If @@ -158,14 +158,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols diagnostics.Add(ERRID.ERR_WriteOnlyHasNoWrite, location) End If If getMethod IsNot Nothing Then - diagnostics.Add(ERRID.ERR_WriteOnlyHasGet, getMethod.Locations(0)) + diagnostics.Add(ERRID.ERR_WriteOnlyHasGet, getMethod.GetFirstLocation()) End If End If If (getMethod IsNot Nothing) AndAlso (setMethod IsNot Nothing) Then If (getMethod.LocalAccessibility <> Accessibility.NotApplicable) AndAlso (setMethod.LocalAccessibility <> Accessibility.NotApplicable) Then ' Both accessors have explicit accessibility. Report an error on the second. - Dim accessor = If(getMethod.Locations(0).SourceSpan.Start < setMethod.Locations(0).SourceSpan.Start, setMethod, getMethod) + Dim accessor = If(getMethod.GetFirstLocation().SourceSpan.Start < setMethod.GetFirstLocation().SourceSpan.Start, setMethod, getMethod) diagnostics.Add(ERRID.ERR_OnlyOneAccessorForGetSet, GetAccessorBlockBeginLocation(accessor)) ElseIf prop.IsOverridable AndAlso ((getMethod.LocalAccessibility = Accessibility.Private) OrElse (setMethod.LocalAccessibility = Accessibility.Private)) Then @@ -1248,7 +1248,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Dim sourceModule = DirectCast(Me.ContainingModule, SourceModuleSymbol) Dim diagnostics = BindingDiagnosticBag.GetInstance() type.CheckAllConstraints(DeclaringCompilation.LanguageVersion, - Locations(0), diagnostics, template:=New CompoundUseSiteInfo(Of AssemblySymbol)(diagnostics, sourceModule.ContainingAssembly)) + GetFirstLocation(), diagnostics, template:=New CompoundUseSiteInfo(Of AssemblySymbol)(diagnostics, sourceModule.ContainingAssembly)) sourceModule.AtomicSetFlagAndStoreDiagnostics(_lazyState, StateFlags.TypeConstraintsChecked, 0, diagnostics) diagnostics.Free() End If diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SynthesizedEventAccessorSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SynthesizedEventAccessorSymbol.vb index 39cf890613496..9b32950a26daa 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SynthesizedEventAccessorSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SynthesizedEventAccessorSymbol.vb @@ -53,7 +53,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Dim parameterType As TypeSymbol If Me.MethodKind = MethodKind.EventRemove AndAlso m_propertyOrEvent.IsWindowsRuntimeEvent Then parameterType = Me.DeclaringCompilation.GetWellKnownType(WellKnownType.System_Runtime_InteropServices_WindowsRuntime_EventRegistrationToken) - diagnostics.Add(Binder.GetUseSiteInfoForWellKnownType(parameterType), Me.Locations(0)) + diagnostics.Add(Binder.GetUseSiteInfoForWellKnownType(parameterType), Me.GetFirstLocation()) Else parameterType = SourceEvent.Type End If @@ -87,7 +87,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols useSiteInfo = Binder.GetUseSiteInfoForWellKnownType(type) End If - diagnostics.Add(useSiteInfo, Me.Locations(0)) + diagnostics.Add(useSiteInfo, Me.GetFirstLocation()) DirectCast(Me.ContainingModule, SourceModuleSymbol).AtomicStoreReferenceAndDiagnostics(_lazyReturnType, type, diagnostics) diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SynthesizedEventBackingFieldSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SynthesizedEventBackingFieldSymbol.vb index 22493ae6c8fa7..9326acddb624f 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SynthesizedEventBackingFieldSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SynthesizedEventBackingFieldSymbol.vb @@ -40,7 +40,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If _propertyOrEvent.IsWindowsRuntimeEvent Then Dim tokenType = Me.DeclaringCompilation.GetWellKnownType(WellKnownType.System_Runtime_InteropServices_WindowsRuntime_EventRegistrationTokenTable_T) - diagnostics.Add(Binder.GetUseSiteInfoForWellKnownType(tokenType), _propertyOrEvent.Locations(0)) + diagnostics.Add(Binder.GetUseSiteInfoForWellKnownType(tokenType), _propertyOrEvent.GetFirstLocation()) result = tokenType.Construct(result) End If diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb index 304a3e2b45982..30cc8beece707 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb @@ -341,7 +341,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Public MustOverride ReadOnly Property Locations As ImmutableArray(Of Location) Public Function GetFirstLocation() As Location Implements ISymbolInternal.GetFirstLocation - Return Me.Locations(0) + Return Me.GetFirstLocation() End Function Public Function GetFirstLocationOrNone() As Location Implements ISymbolInternal.GetFirstLocationOrNone diff --git a/src/Compilers/VisualBasic/Portable/Symbols/SynthesizedSymbols/SynthesizedEventDelegateSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/SynthesizedSymbols/SynthesizedEventDelegateSymbol.vb index 9b05bcd9278d0..cb9d4e62263ea 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/SynthesizedSymbols/SynthesizedEventDelegateSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/SynthesizedSymbols/SynthesizedEventDelegateSymbol.vb @@ -426,7 +426,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols diagnostics.Add(New VBDiagnostic(ErrorFactory.ErrorInfo(ERRID.ERR_VariancePreventsSynthesizedEvents2, CustomSymbolDisplayFormatter.QualifiedName(outermostVariantInterface), AssociatedSymbol.Name), - Locations(0))) + GetFirstLocation())) End If DirectCast(ContainingModule, SourceModuleSymbol).AtomicStoreIntegerAndDiagnostics(_reportedAllDeclarationErrors, 1, 0, diagnostics) diff --git a/src/Compilers/VisualBasic/Test/CommandLine/CommandLineTests.vb b/src/Compilers/VisualBasic/Test/CommandLine/CommandLineTests.vb index 9f094cd0a04f6..0163745a8053b 100644 --- a/src/Compilers/VisualBasic/Test/CommandLine/CommandLineTests.vb +++ b/src/Compilers/VisualBasic/Test/CommandLine/CommandLineTests.vb @@ -11025,8 +11025,8 @@ End Class End Property Public Sub AnalyzeSymbol(context As SymbolAnalysisContext) - context.ReportDiagnostic(Diagnostic.Create(Warning01, context.Symbol.GetFirstLocation())) - context.ReportDiagnostic(Diagnostic.Create(Warning03, context.Symbol.GetFirstLocation())) + context.ReportDiagnostic(Diagnostic.Create(Warning01, context.Symbol.Locations.First())) + context.ReportDiagnostic(Diagnostic.Create(Warning03, context.Symbol.Locations.First())) End Sub End Class @@ -11049,7 +11049,7 @@ End Class End Property Public Sub AnalyzeSymbol(context As SymbolAnalysisContext) - context.ReportDiagnostic(Diagnostic.Create(Warning04, context.Symbol.GetFirstLocation())) + context.ReportDiagnostic(Diagnostic.Create(Warning04, context.Symbol.Locations.First())) End Sub End Class From 88ad2bfaf627100c581042f95a0122abed4e8087 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 14 Oct 2025 18:57:36 +0200 Subject: [PATCH 09/12] Add docs --- .../Core/Portable/Symbols/ISymbolInternal.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs b/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs index 96aeb754c7110..22f477675f777 100644 --- a/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs +++ b/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs @@ -89,7 +89,18 @@ internal interface ISymbolInternal /// bool IsDefinition { get; } + /// + /// Similar to getting the first location from . However, this can be more efficient as + /// an intermediary array does not need to be created. This can often be advantageous for perf as most symbols + /// only have a single location, and most clients only need the first location for some purpose (like error + /// reporting). + /// Location GetFirstLocation(); + + /// + /// Equivalent to calling , except that if is empty this + /// will return . + /// Location GetFirstLocationOrNone(); /// From 285a9cea3daa455be3b49e29f7a5114b13441616 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 14 Oct 2025 18:57:49 +0200 Subject: [PATCH 10/12] Update docs --- src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs b/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs index 22f477675f777..42807af481a5f 100644 --- a/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs +++ b/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs @@ -91,7 +91,7 @@ internal interface ISymbolInternal /// /// Similar to getting the first location from . However, this can be more efficient as - /// an intermediary array does not need to be created. This can often be advantageous for perf as most symbols + /// an intermediary array may not need to be created. This can often be advantageous for perf as most symbols /// only have a single location, and most clients only need the first location for some purpose (like error /// reporting). /// From 5e31ec1cd8826512772da9bf7cf31b9bd516aa1d Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 14 Oct 2025 19:52:41 +0200 Subject: [PATCH 11/12] less overflowing --- src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb index 30cc8beece707..304a3e2b45982 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb @@ -341,7 +341,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Public MustOverride ReadOnly Property Locations As ImmutableArray(Of Location) Public Function GetFirstLocation() As Location Implements ISymbolInternal.GetFirstLocation - Return Me.GetFirstLocation() + Return Me.Locations(0) End Function Public Function GetFirstLocationOrNone() As Location Implements ISymbolInternal.GetFirstLocationOrNone From 63279d2a8a6320f1b1196811b5e2caf72d5ee934 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 15 Oct 2025 19:16:23 +0200 Subject: [PATCH 12/12] Doc and throw --- src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs | 2 ++ src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs b/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs index 42807af481a5f..e1113c893513c 100644 --- a/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs +++ b/src/Compilers/Core/Portable/Symbols/ISymbolInternal.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System; using System.Collections.Immutable; using System.Reflection.Metadata; using System.Threading; @@ -95,6 +96,7 @@ internal interface ISymbolInternal /// only have a single location, and most clients only need the first location for some purpose (like error /// reporting). /// + /// If the symbol has no locations. Location GetFirstLocation(); /// diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb index 304a3e2b45982..275fc2026973a 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Symbol.vb @@ -341,7 +341,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Public MustOverride ReadOnly Property Locations As ImmutableArray(Of Location) Public Function GetFirstLocation() As Location Implements ISymbolInternal.GetFirstLocation - Return Me.Locations(0) + Dim locations = Me.Locations + If locations.Length = 0 Then + Throw New InvalidOperationException("Symbol has no locations") + End If + + Return locations(0) End Function Public Function GetFirstLocationOrNone() As Location Implements ISymbolInternal.GetFirstLocationOrNone