提交 8f062669 编写于 作者: D Dustin Campbell 提交者: GitHub

Merge pull request #15531 from vslsnap/merge-dev15-rc2-into-master-20161125-160026

Merge dev15-rc2 into master
......@@ -37,6 +37,8 @@ protected override EnvDTE.vsCMPart DefaultPart
{
switch (node.Kind())
{
case SyntaxKind.ArrowExpressionClause:
return GetStartPoint(text, (ArrowExpressionClauseSyntax)node, part);
case SyntaxKind.Attribute:
return GetStartPoint(text, (AttributeSyntax)node, part);
case SyntaxKind.AttributeArgument:
......@@ -83,6 +85,8 @@ protected override EnvDTE.vsCMPart DefaultPart
{
switch (node.Kind())
{
case SyntaxKind.ArrowExpressionClause:
return GetEndPoint(text, (ArrowExpressionClauseSyntax)node, part);
case SyntaxKind.Attribute:
return GetEndPoint(text, (AttributeSyntax)node, part);
case SyntaxKind.AttributeArgument:
......@@ -211,6 +215,27 @@ private VirtualTreePoint GetBodyEndPoint(SourceText text, SyntaxToken closeBrace
: new VirtualTreePoint(closeBrace.SyntaxTree, text, closeBrace.SpanStart);
}
private VirtualTreePoint GetStartPoint(SourceText text, ArrowExpressionClauseSyntax node, EnvDTE.vsCMPart part)
{
int startPosition;
switch (part)
{
case EnvDTE.vsCMPart.vsCMPartWhole:
startPosition = node.SpanStart;
break;
case EnvDTE.vsCMPart.vsCMPartBody:
startPosition = node.Expression.SpanStart;
break;
default:
throw Exceptions.ThrowENotImpl();
}
return new VirtualTreePoint(node.SyntaxTree, text, startPosition);
}
private VirtualTreePoint GetStartPoint(SourceText text, AttributeSyntax node, EnvDTE.vsCMPart part)
{
int startPosition;
......@@ -759,6 +784,24 @@ private VirtualTreePoint GetStartPoint(SourceText text, ParameterSyntax node, En
return new VirtualTreePoint(node.SyntaxTree, text, startPosition);
}
private VirtualTreePoint GetEndPoint(SourceText text, ArrowExpressionClauseSyntax node, EnvDTE.vsCMPart part)
{
int endPosition;
switch (part)
{
case EnvDTE.vsCMPart.vsCMPartWhole:
case EnvDTE.vsCMPart.vsCMPartBody:
endPosition = node.Span.End;
break;
default:
throw Exceptions.ThrowENotImpl();
}
return new VirtualTreePoint(node.SyntaxTree, text, endPosition);
}
private VirtualTreePoint GetEndPoint(SourceText text, AttributeSyntax node, EnvDTE.vsCMPart part)
{
int endPosition;
......
......@@ -1477,6 +1477,15 @@ public override IEnumerable<SyntaxNode> GetParameterNodes(SyntaxNode parentNode)
return SpecializedCollections.EmptyEnumerable<ParameterSyntax>();
}
public override bool IsExpressionBodiedProperty(SyntaxNode node)
=> (node as PropertyDeclarationSyntax)?.ExpressionBody != null;
public override bool TryGetAutoPropertyExpressionBody(SyntaxNode parentNode, out SyntaxNode accessorNode)
{
accessorNode = (parentNode as PropertyDeclarationSyntax)?.ExpressionBody;
return accessorNode != null;
}
public override bool IsAccessorNode(SyntaxNode node)
{
switch (node.Kind())
......
......@@ -663,10 +663,12 @@ protected bool TryGetElementFromSource(CodeModelState state, Project project, IT
return false;
}
public abstract bool IsExpressionBodiedProperty(SyntaxNode node);
public abstract bool IsAccessorNode(SyntaxNode node);
public abstract MethodKind GetAccessorKind(SyntaxNode node);
public abstract bool TryGetAccessorNode(SyntaxNode parentNode, MethodKind kind, out SyntaxNode accessorNode);
public abstract bool TryGetAutoPropertyExpressionBody(SyntaxNode parentNode, out SyntaxNode accessorNode);
public abstract bool TryGetParameterNode(SyntaxNode parentNode, string name, out SyntaxNode parameterNode);
public abstract bool TryGetImportNode(SyntaxNode parentNode, string dottedName, out SyntaxNode importNode);
public abstract bool TryGetOptionNode(SyntaxNode parentNode, string name, int ordinal, out SyntaxNode optionNode);
......
......@@ -146,10 +146,12 @@ internal interface ICodeModelService : ICodeModelNavigationPointService
SyntaxNode SetAccess(SyntaxNode node, EnvDTE.vsCMAccess access);
EnvDTE.vsCMElement GetElementKind(SyntaxNode node);
bool IsExpressionBodiedProperty(SyntaxNode node);
bool IsAccessorNode(SyntaxNode node);
MethodKind GetAccessorKind(SyntaxNode node);
bool TryGetAccessorNode(SyntaxNode parentNode, MethodKind kind, out SyntaxNode accessorNode);
bool TryGetAutoPropertyExpressionBody(SyntaxNode parentNode, out SyntaxNode expressionBody);
bool TryGetParameterNode(SyntaxNode parentNode, string name, out SyntaxNode parameterNode);
bool TryGetImportNode(SyntaxNode parentNode, string dottedName, out SyntaxNode importNode);
bool TryGetOptionNode(SyntaxNode parentNode, string name, int ordinal, out SyntaxNode optionNode);
......
......@@ -35,15 +35,10 @@ private CodeAccessorFunction(CodeModelState state, AbstractCodeMember parent, Me
_kind = kind;
}
private AbstractCodeMember ParentMember
{
get { return _parentHandle.Value; }
}
private AbstractCodeMember ParentMember => _parentHandle.Value;
private bool IsPropertyAccessor()
{
return _kind == MethodKind.PropertyGet || _kind == MethodKind.PropertySet;
}
=> _kind == MethodKind.PropertyGet || _kind == MethodKind.PropertySet;
internal override bool TryLookupNode(out SyntaxNode node)
{
......@@ -55,52 +50,29 @@ internal override bool TryLookupNode(out SyntaxNode node)
return false;
}
if (!CodeModelService.TryGetAccessorNode(parentNode, _kind, out var accessorNode))
{
return false;
}
node = accessorNode;
return node != null;
return CodeModelService.TryGetAutoPropertyExpressionBody(parentNode, out node) ||
CodeModelService.TryGetAccessorNode(parentNode, _kind, out node);
}
public override EnvDTE.vsCMElement Kind
{
get { return EnvDTE.vsCMElement.vsCMElementFunction; }
}
=> EnvDTE.vsCMElement.vsCMElementFunction;
public override object Parent
{
get { return _parentHandle.Value; }
}
public override object Parent => _parentHandle.Value;
public override EnvDTE.CodeElements Children
{
get { return EmptyCollection.Create(this.State, this); }
}
=> EmptyCollection.Create(this.State, this);
protected override string GetName()
{
return this.ParentMember.Name;
}
=> this.ParentMember.Name;
protected override void SetName(string value)
{
this.ParentMember.Name = value;
}
=> this.ParentMember.Name = value;
protected override string GetFullName()
{
return this.ParentMember.FullName;
}
=> this.ParentMember.FullName;
public EnvDTE.CodeElements Attributes
{
get
{
return AttributeCollection.Create(this.State, this);
}
}
=> AttributeCollection.Create(this.State, this);
public EnvDTE.vsCMAccess Access
{
......@@ -211,10 +183,7 @@ public EnvDTE80.vsCMOverrideKind OverrideKind
}
}
public bool IsOverloaded
{
get { return false; }
}
public bool IsOverloaded => false;
public bool IsShared
{
......@@ -271,12 +240,7 @@ public bool MustImplement
}
public EnvDTE.CodeElements Overloads
{
get
{
throw Exceptions.ThrowEFail();
}
}
=> throw Exceptions.ThrowEFail();
public EnvDTE.CodeElements Parameters
{
......@@ -327,4 +291,4 @@ public void RemoveParameter(object element)
throw Exceptions.ThrowEFail();
}
}
}
}
\ No newline at end of file
......@@ -144,15 +144,17 @@ public override EnvDTE.CodeElements Children
}
private bool HasAccessorNode(MethodKind methodKind)
{
return CodeModelService.TryGetAccessorNode(LookupNode(), methodKind, out var accessorNode);
}
=> CodeModelService.TryGetAccessorNode(LookupNode(), methodKind, out var accessorNode);
private bool IsExpressionBodiedProperty()
=> CodeModelService.IsExpressionBodiedProperty(LookupNode());
public EnvDTE.CodeFunction Getter
{
get
{
if (!HasAccessorNode(MethodKind.PropertyGet))
if (!HasAccessorNode(MethodKind.PropertyGet) &&
!IsExpressionBodiedProperty())
{
return null;
}
......
......@@ -54,6 +54,68 @@ class C
TextPoint(line:=3, lineOffset:=5, absoluteOffset:=15, lineLength:=16)))
End Function
<ConditionalWpfFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModel)>
Public Async Function TestAutoPropGetStartPoint1() As Task
Dim code =
<Code>
class C
{
public int $$P => 0;
}
</Code>
Await TestElement(
code,
Sub(prop)
Dim getter = prop.Getter
Dim textPointGetter = Function(part As EnvDTE.vsCMPart)
Return getter.GetStartPoint(part)
End Function
Part(EnvDTE.vsCMPart.vsCMPartAttributes, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartAttributesWithDelimiter, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartBody, TextPoint(line:=3, lineOffset:=21, absoluteOffset:=31, lineLength:=22))(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartBodyWithDelimiter, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartHeader, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartHeaderWithAttributes, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartName, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartNavigate, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartWhole, TextPoint(line:=3, lineOffset:=18, absoluteOffset:=28, lineLength:=22))(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartWholeWithAttributes, ThrowsNotImplementedException)(textPointGetter)
End Sub)
End Function
<ConditionalWpfFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModel)>
Public Async Function TestAutoPropGetEndPoint1() As Task
Dim code =
<Code>
class C
{
public int $$P => 0;
}
</Code>
Await TestElement(
code,
Sub(prop)
Dim getter = prop.Getter
Dim textPointGetter = Function(part As EnvDTE.vsCMPart)
Return getter.GetEndPoint(part)
End Function
Part(EnvDTE.vsCMPart.vsCMPartAttributes, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartAttributesWithDelimiter, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartBody, TextPoint(line:=3, lineOffset:=22, absoluteOffset:=32, lineLength:=22))(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartBodyWithDelimiter, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartHeader, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartHeaderWithAttributes, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartName, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartNavigate, ThrowsNotImplementedException)(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartWhole, TextPoint(line:=3, lineOffset:=22, absoluteOffset:=32, lineLength:=22))(textPointGetter)
Part(EnvDTE.vsCMPart.vsCMPartWholeWithAttributes, ThrowsNotImplementedException)(textPointGetter)
End Sub)
End Function
<ConditionalWpfFact(GetType(x86)), Trait(Traits.Feature, Traits.Features.CodeModel)>
Public Async Function TestGetStartPoint_Attribute() As Task
Dim code =
......
......@@ -1048,6 +1048,14 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.CodeModel
Return GetExternalSymbolFullName(symbol)
End Function
Public Overrides Function IsExpressionBodiedProperty(node As SyntaxNode) As Boolean
Return False
End Function
Public Overrides Function TryGetAutoPropertyExpressionBody(parentNode As SyntaxNode, ByRef accessorNode As SyntaxNode) As Boolean
Return False
End Function
Public Overrides Function IsAccessorNode(node As SyntaxNode) As Boolean
Select Case node.Kind
Case SyntaxKind.GetAccessorBlock,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册