提交 daeb5b45 编写于 作者: B Balaji Soundrarajan

CodeModel now completely handles Conversion operator declarations

Fix #1980 : CodeModel was not handling Conversion operator declarations
in few areas. This change addresses these issues
上级 49e708bf
......@@ -50,6 +50,7 @@ protected override EnvDTE.vsCMPart DefaultPart
case SyntaxKind.ConstructorDeclaration:
case SyntaxKind.DestructorDeclaration:
case SyntaxKind.OperatorDeclaration:
case SyntaxKind.ConversionOperatorDeclaration:
return GetStartPoint(text, (BaseMethodDeclarationSyntax)node, part);
case SyntaxKind.PropertyDeclaration:
case SyntaxKind.IndexerDeclaration:
......@@ -95,6 +96,7 @@ protected override EnvDTE.vsCMPart DefaultPart
case SyntaxKind.ConstructorDeclaration:
case SyntaxKind.DestructorDeclaration:
case SyntaxKind.OperatorDeclaration:
case SyntaxKind.ConversionOperatorDeclaration:
return GetEndPoint(text, (BaseMethodDeclarationSyntax)node, part);
case SyntaxKind.PropertyDeclaration:
case SyntaxKind.IndexerDeclaration:
......
......@@ -578,6 +578,7 @@ public override EnvDTE.CodeElement CreateUnknownCodeElement(CodeModelState state
case SyntaxKind.ConstructorDeclaration:
case SyntaxKind.DestructorDeclaration:
case SyntaxKind.OperatorDeclaration:
case SyntaxKind.ConversionOperatorDeclaration:
return (EnvDTE.CodeElement)CodeFunction.CreateUnknown(state, fileCodeModel, node.RawKind, GetName(node));
case SyntaxKind.PropertyDeclaration:
......
......@@ -136,7 +136,8 @@ private EnvDTE80.vsCMChangeKind ConvertToChangeKind(CodeModelEventType eventType
return result;
}
private void GetElementsForCodeModelEvent(CodeModelEvent codeModelEvent, out EnvDTE.CodeElement element, out object parentElement)
// internal for testing
internal void GetElementsForCodeModelEvent(CodeModelEvent codeModelEvent, out EnvDTE.CodeElement element, out object parentElement)
{
parentElement = GetParentElementForCodeModelEvent(codeModelEvent);
......
......@@ -9,6 +9,48 @@ Namespace Microsoft.VisualStudio.LanguageServices.UnitTests.CodeModel.CSharp
Public Class CodeFunctionTests
Inherits AbstractCodeFunctionTests
#Region "Get Start Point"
<WorkItem(1980, "https://github.com/dotnet/roslyn/issues/1980")>
<ConditionalFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModel)>
Public Sub GetStartPointConversionOperatorFunction()
Dim code =
<Code>
class D
{
public static implicit operator $$D(double d)
{
return new D();
}
}
</Code>
TestGetStartPoint(code,
Part(EnvDTE.vsCMPart.vsCMPartBody,
TextPoint(line:=5, lineOffset:=1, absoluteOffset:=65, lineLength:=23)))
End Sub
#End Region
#Region "Get End Point"
<WorkItem(1980, "https://github.com/dotnet/roslyn/issues/1980")>
<ConditionalFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModel)>
Public Sub GetEndPointConversionOperatorFunction()
Dim code =
<Code>
class D
{
public static implicit operator $$D(double d)
{
return new D();
}
}
</Code>
TestGetEndPoint(code,
Part(EnvDTE.vsCMPart.vsCMPartBody,
TextPoint(line:=6, lineOffset:=1, absoluteOffset:=89, lineLength:=5)))
End Sub
#End Region
#Region "Access tests"
<ConditionalFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModel)>
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces
Imports Microsoft.VisualStudio.LanguageServices.Implementation.CodeModel
Imports Roslyn.Test.Utilities
Namespace Microsoft.VisualStudio.LanguageServices.UnitTests.CodeModel.CSharp
......@@ -919,9 +921,58 @@ class $$C
Dim count = codeClass.Members.OfType(Of EnvDTE80.CodeFunction2)().Count()
End Sub)
End Using
End Sub
<WorkItem(1980, "https://github.com/dotnet/roslyn/issues/1980")>
<ConditionalFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModel)>
Public Sub CreateUnknownElementForConversionOperator()
Dim oldCode =
<Code>
class D
{
public static implicit operator D(double d)
{
return new D();
}
}
</Code>
Dim changedCode =
<Code>
class D
{
}
</Code>
Dim changedDefinition =
<Workspace>
<Project Language=<%= LanguageName %> CommonReferences="true">
<Document><%= changedCode.Value %></Document>
</Project>
</Workspace>
Using originalWorkspaceAndFileCodeModel = CreateCodeModelTestState(GetWorkspaceDefinition(oldCode))
Using changedworkspace = TestWorkspaceFactory.CreateWorkspace(changedDefinition, exportProvider:=VisualStudioTestExportProvider.ExportProvider)
Dim originalDocument = originalWorkspaceAndFileCodeModel.Workspace.CurrentSolution.GetDocument(originalWorkspaceAndFileCodeModel.Workspace.Documents(0).Id)
Dim originalTree = originalDocument.GetSyntaxTreeAsync().Result
Dim changeDocument = changedworkspace.CurrentSolution.GetDocument(changedworkspace.Documents(0).Id)
Dim changeTree = changeDocument.GetSyntaxTreeAsync().Result
Dim codeModelEvent = originalWorkspaceAndFileCodeModel.CodeModelService.CollectCodeModelEvents(originalTree, changeTree)
Dim fileCodeModel = originalWorkspaceAndFileCodeModel.FileCodeModelObject
Dim element As EnvDTE.CodeElement = Nothing
Dim parentElement As Object = Nothing
fileCodeModel.GetElementsForCodeModelEvent(codeModelEvent.First(), element, parentElement)
Assert.NotNull(element)
Assert.NotNull(parentElement)
Dim unknownCodeFunction = TryCast(element, EnvDTE.CodeFunction)
Assert.Equal(unknownCodeFunction.Name, "operator implicit D")
End Using
End Using
End Sub
Protected Overrides ReadOnly Property LanguageName As String
Get
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册